diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6a504ba
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,12 @@
+   
+Licensed 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.
\ No newline at end of file
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..c38e7d7
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,5 @@
+Apache Cordova
+Copyright 2012 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org)
\ No newline at end of file
diff --git a/README.md b/README.md
index 0467ae5..c97f419 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,82 @@
-intel-cordova-tizen
-===================
+Cordova implementation for Tizen
+===
+
+Cordova implementation for Tizen is a JavaScript Wrapper library allowing to build and run Cordova based projects on [Tizen](https://www.tizen.org/).
+Cordova based applications are, at the core, an application written with web technology: HTML, CSS and JavaScript.
+
+Apache Cordova is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator project. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+Pre-requisites
+---
+ - [Tizen SDK 1.0 Larkspur Release](https://developer.tizen.org/sdk)
+
+Directory Structure
+---
+    /tizen
+        /samples ..... Ready-to-run Tizen Eclipse IDE sample projects
+        /templates ... Cordova Tizen SDK projects templates for Tizen Eclipse IDE
+        /www ......... Barebones project assets
+
+Import a Cordova Tizen project sample into Tizen Eclipse IDE
+----
+
+1. File -> Import
+2. Select Import Source: Widget -> Projects and Widget file -> Next
+3. Import Widget -> Select root directory: Point to the one of the sample projects (e.g: /cordova-basic) -> Finish
+4. The project should be available now in the Tizen Eclipse IDE Project Explorer
+5. You can now go to the [Build and Deploy a project] section of this document
+
+
+Install Cordova Tizen project templates into Tizen Eclipse IDE
+----
+1. Copy the entire /templates directory content into you Tizen Eclipse IDE web templates directory (e.g: /home/my_username/tizen-sdk/IDE/Templates/web)
+2. You can now create Cordova Tizen project by using Tizen Eclipse IDE project templates
+
+Create a project with the Tizen Eclipse IDE Cordova Tizen project templates
+----
+1. File -> New -> Tizen Web Project.
+2. Select: User Template.
+3. Select: User defined.
+4. Select one of the Cordova templates, fill the Project Name, then -> Finish.
+5. The project should be available now in the Tizen Eclipse IDE Project Explorer
+6. You can now go to the [Build and Deploy a project] section of this document
+
+Build and Deploy a project
+----
+1. Select and Right click the project -> Select Build project, this will generate your project widget package (.wgt)
+2. Select and Right click the project -> Run As -> Here you can choose:
+ - Tizen Web Simulator application
+ - Tizen Web application (this will deploy you application to a pre-launched Tizen emulator or a Tizen connected device)
+
+Barebones project assets
+----
+
+The `www` folder contains the Cordova specific assets that must be available in a Tizen Web project to make it 'Cordova enabled'.
+If you have an existing Tizen Web application project, copy/merge these files into its root directory.
+
+    /www
+        config.xml .............. Tizen configuration file
+        cordova-x.y.z.js ........ Tizen Cordova JavaScript API implementation library
+        /sounds
+            beep.wav ............ Needed for Cordova Notification API implementation
+
+Add the following lines into the `<head>` section of your `index.html` project file:
+
+    <script type="text/javascript" src="js/cordova.x.y.z.js"></script>
+
+`config.xml` is a sample that you are free to alter or merge with an existing Tizen configuration file.
+It contains the `<feature>` elements required by the Cordova API.
+ 
+Further Reading
+---
+
+- [Cordova home](http://incubator.apache.org/cordova/)
+- [Cordova Documentation](http://docs.phonegap.com)
+- [Cordova Issue Tracker](https://issues.apache.org/jira/browse/CB)
+- [Tizen Web SDK Documentation](https://developer.tizen.org/documentation)
 
 that could become the source for the apache incubator-cordova-tizen that is until now  empty 
 
-
 framework/
 
     - cordova icon, for tizen we are not quite sure about the size to use...now it is a 64*64 png
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..227cea2
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+2.0.0
diff --git a/samples/cordova-basic/.project b/samples/cordova-basic/.project
new file mode 100644
index 0000000..a3b2b69
--- /dev/null
+++ b/samples/cordova-basic/.project
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>cordova-basic</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>json.validation.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.jslint.nature.JSLintBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.project.builder.WACBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.css.nature.CSSBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+		<nature>json.validation.nature</nature>
+		<nature>org.tizen.web.jslint.nature.JSLintNature</nature>
+		<nature>org.tizen.web.WACnature</nature>
+		<nature>org.tizen.web.css.nature.CSSNature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+	</natures>
+</projectDescription>
diff --git a/samples/cordova-basic/config.xml b/samples/cordova-basic/config.xml
new file mode 100644
index 0000000..44cf211
--- /dev/null
+++ b/samples/cordova-basic/config.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" version="2.0 Beta" viewmodes="fullscreen" id="http://yourdomain/cordova-basic">  
+	<icon src="icon.png"/>  
+	<content src="index.html"/>  
+	<feature name="http://tizen.org/api/application" required="true"/>  
+	<feature name="http://tizen.org/api/application.kill" required="true"/>  
+	<feature name="http://tizen.org/api/application.launch" required="true"/>  
+	<feature name="http://tizen.org/api/application.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact" required="true"/>  
+	<feature name="http://tizen.org/api/contact.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact.write" required="true"/>  
+	<feature name="http://tizen.org/api/systeminfo" required="true"/>  
+	<feature name="http://tizen.org/api/time" required="true"/>  
+	<feature name="http://tizen.org/api/time.read" required="true"/>  
+	<feature name="http://tizen.org/api/time.write" required="true"/>  
+	<feature name="http://tizen.org/api/tizen" required="true"/>  
+	<name>cordova-basic</name> 
+</widget>
diff --git a/samples/cordova-basic/cordova-2.0.0.js b/samples/cordova-basic/cordova-2.0.0.js
new file mode 100644
index 0000000..ee17d0d
--- /dev/null
+++ b/samples/cordova-basic/cordova-2.0.0.js
@@ -0,0 +1,6957 @@
+// commit 870218e03979cb7fb6fcae8cd8532008d163d6cc
+
+// File generated at :: Thu Aug 02 2012 17:18:02 GMT+0200 (CEST)
+
+/*
+ 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.
+*/
+
+;(function() {
+
+// file: lib/scripts/require.js
+var require,
+    define;
+
+(function () {
+    var modules = {};
+
+    function build(module) {
+        var factory = module.factory;
+        module.exports = {};
+        delete module.factory;
+        factory(require, module.exports, module);
+        return module.exports;
+    }
+
+    require = function (id) {
+        if (!modules[id]) {
+            throw "module " + id + " not found";
+        }
+        return modules[id].factory ? build(modules[id]) : modules[id].exports;
+    };
+
+    define = function (id, factory) {
+        if (modules[id]) {
+            throw "module " + id + " already defined";
+        }
+
+        modules[id] = {
+            id: id,
+            factory: factory
+        };
+    };
+
+    define.remove = function (id) {
+        delete modules[id];
+    };
+
+})();
+
+//Export for use in node
+if (typeof module === "object" && typeof require === "function") {
+    module.exports.require = require;
+    module.exports.define = define;
+}
+// file: lib/cordova.js
+define("cordova", function(require, exports, module) {
+var channel = require('cordova/channel');
+
+/**
+ * Listen for DOMContentLoaded and notify our channel subscribers.
+ */
+document.addEventListener('DOMContentLoaded', function() {
+    channel.onDOMContentLoaded.fire();
+}, false);
+if (document.readyState == 'complete' || document.readyState == 'interactive') {
+    channel.onDOMContentLoaded.fire();
+}
+
+/**
+ * Intercept calls to addEventListener + removeEventListener and handle deviceready,
+ * resume, and pause events.
+ */
+var m_document_addEventListener = document.addEventListener;
+var m_document_removeEventListener = document.removeEventListener;
+var m_window_addEventListener = window.addEventListener;
+var m_window_removeEventListener = window.removeEventListener;
+
+/**
+ * Houses custom event handlers to intercept on document + window event listeners.
+ */
+var documentEventHandlers = {},
+    windowEventHandlers = {};
+
+document.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof documentEventHandlers[e] != 'undefined') {
+        if (evt === 'deviceready') {
+            documentEventHandlers[e].subscribeOnce(handler);
+        } else {
+            documentEventHandlers[e].subscribe(handler);
+        }
+    } else {
+        m_document_addEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof windowEventHandlers[e] != 'undefined') {
+        windowEventHandlers[e].subscribe(handler);
+    } else {
+        m_window_addEventListener.call(window, evt, handler, capture);
+    }
+};
+
+document.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof documentEventHandlers[e] != "undefined") {
+        documentEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_document_removeEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof windowEventHandlers[e] != "undefined") {
+        windowEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_window_removeEventListener.call(window, evt, handler, capture);
+    }
+};
+
+function createEvent(type, data) {
+    var event = document.createEvent('Events');
+    event.initEvent(type, false, false);
+    if (data) {
+        for (var i in data) {
+            if (data.hasOwnProperty(i)) {
+                event[i] = data[i];
+            }
+        }
+    }
+    return event;
+}
+
+if(typeof window.console === "undefined") {
+    window.console = {
+        log:function(){}
+    };
+}
+
+var cordova = {
+    define:define,
+    require:require,
+    /**
+     * Methods to add/remove your own addEventListener hijacking on document + window.
+     */
+    addWindowEventHandler:function(event, opts) {
+        return (windowEventHandlers[event] = channel.create(event, opts));
+    },
+    addDocumentEventHandler:function(event, opts) {
+        return (documentEventHandlers[event] = channel.create(event, opts));
+    },
+    removeWindowEventHandler:function(event) {
+        delete windowEventHandlers[event];
+    },
+    removeDocumentEventHandler:function(event) {
+        delete documentEventHandlers[event];
+    },
+    /**
+     * Retreive original event handlers that were replaced by Cordova
+     *
+     * @return object
+     */
+    getOriginalHandlers: function() {
+        return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
+        'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
+    },
+    /**
+     * Method to fire event from native code
+     */
+    fireDocumentEvent: function(type, data) {
+        var evt = createEvent(type, data);
+        if (typeof documentEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                documentEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            document.dispatchEvent(evt);
+        }
+    },
+    fireWindowEvent: function(type, data) {
+        var evt = createEvent(type,data);
+        if (typeof windowEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                windowEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            window.dispatchEvent(evt);
+        }
+    },
+    // TODO: this is Android only; think about how to do this better
+    shuttingDown:false,
+    UsePolling:false,
+    // END TODO
+
+    // TODO: iOS only
+    // This queue holds the currently executing command and all pending
+    // commands executed with cordova.exec().
+    commandQueue:[],
+    // Indicates if we're currently in the middle of flushing the command
+    // queue on the native side.
+    commandQueueFlushing:false,
+    // END TODO
+    /**
+     * Plugin callback mechanism.
+     */
+    callbackId: 0,
+    callbacks:  {},
+    callbackStatus: {
+        NO_RESULT: 0,
+        OK: 1,
+        CLASS_NOT_FOUND_EXCEPTION: 2,
+        ILLEGAL_ACCESS_EXCEPTION: 3,
+        INSTANTIATION_EXCEPTION: 4,
+        MALFORMED_URL_EXCEPTION: 5,
+        IO_EXCEPTION: 6,
+        INVALID_ACTION: 7,
+        JSON_EXCEPTION: 8,
+        ERROR: 9
+    },
+
+    /**
+     * Called by native code when returning successful result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackSuccess: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+
+            // If result is to be sent to callback
+            if (args.status == cordova.callbackStatus.OK) {
+                try {
+                    if (cordova.callbacks[callbackId].success) {
+                        cordova.callbacks[callbackId].success(args.message);
+                    }
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+callbackId+" = "+e);
+                }
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+
+    /**
+     * Called by native code when returning error result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackError: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+            try {
+                if (cordova.callbacks[callbackId].fail) {
+                    cordova.callbacks[callbackId].fail(args.message);
+                }
+            }
+            catch (e) {
+                console.log("Error in error callback: "+callbackId+" = "+e);
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+    addConstructor: function(func) {
+        channel.onCordovaReady.subscribeOnce(function() {
+            try {
+                func();
+            } catch(e) {
+                console.log("Failed to run constructor: " + e);
+            }
+        });
+    }
+};
+
+// Register pause, resume and deviceready channels as events on document.
+channel.onPause = cordova.addDocumentEventHandler('pause');
+channel.onResume = cordova.addDocumentEventHandler('resume');
+channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
+
+module.exports = cordova;
+
+});
+
+// file: lib/common/builder.js
+define("cordova/builder", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+function each(objects, func, context) {
+    for (var prop in objects) {
+        if (objects.hasOwnProperty(prop)) {
+            func.apply(context, [objects[prop], prop]);
+        }
+    }
+}
+
+function include(parent, objects, clobber, merge) {
+    each(objects, function (obj, key) {
+        try {
+          var result = obj.path ? require(obj.path) : {};
+
+          if (clobber) {
+              // Clobber if it doesn't exist.
+              if (typeof parent[key] === 'undefined') {
+                  parent[key] = result;
+              } else if (typeof obj.path !== 'undefined') {
+                  // If merging, merge properties onto parent, otherwise, clobber.
+                  if (merge) {
+                      recursiveMerge(parent[key], result);
+                  } else {
+                      parent[key] = result;
+                  }
+              }
+              result = parent[key];
+          } else {
+            // Overwrite if not currently defined.
+            if (typeof parent[key] == 'undefined') {
+              parent[key] = result;
+            } else if (merge && typeof obj.path !== 'undefined') {
+              // If merging, merge parent onto result
+              recursiveMerge(result, parent[key]);
+              parent[key] = result;
+            } 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);
+          }
+        } catch(e) {
+          utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');
+        }
+    });
+}
+
+/**
+ * Merge properties from one object onto another recursively.  Properties from
+ * the src object will overwrite existing target property.
+ *
+ * @param target Object to merge properties into.
+ * @param src Object to merge properties from.
+ */
+function recursiveMerge(target, src) {
+    for (var prop in src) {
+        if (src.hasOwnProperty(prop)) {
+            if (typeof target.prototype !== 'undefined' && target.prototype.constructor === target) {
+                // If the target object is a constructor override off prototype.
+                target.prototype[prop] = src[prop];
+            } else {
+                target[prop] = typeof src[prop] === 'object' ? recursiveMerge(
+                        target[prop], src[prop]) : src[prop];
+            }
+        }
+    }
+    return target;
+}
+
+module.exports = {
+    build: function (objects) {
+        return {
+            intoButDontClobber: function (target) {
+                include(target, objects, false, false);
+            },
+            intoAndClobber: function(target) {
+                include(target, objects, true, false);
+            },
+            intoAndMerge: function(target) {
+                include(target, objects, true, true);
+            }
+        };
+    }
+};
+
+});
+
+// file: lib/common/channel.js
+define("cordova/channel", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+/**
+ * Custom pub-sub "channel" that can have functions subscribed to it
+ * This object is used to define and control firing of events for
+ * cordova initialization.
+ *
+ * The order of events during page load and Cordova startup is as follows:
+ *
+ * onDOMContentLoaded         Internal event that is received when the web page is loaded and parsed.
+ * onNativeReady              Internal event that indicates the Cordova native side is ready.
+ * onCordovaReady             Internal event fired when all Cordova JavaScript objects have been created.
+ * onCordovaInfoReady         Internal event fired when device properties are available.
+ * onCordovaConnectionReady   Internal event fired when the connection property has been set.
+ * onDeviceReady              User event fired to indicate that Cordova is ready
+ * onResume                   User event fired to indicate a start/resume lifecycle event
+ * onPause                    User event fired to indicate a pause lifecycle event
+ * onDestroy                  Internal event fired when app is being destroyed (User should use window.onunload event, not this one).
+ *
+ * The only Cordova events that user code should register for are:
+ *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
+ *      pause                 App has moved to background
+ *      resume                App has returned to foreground
+ *
+ * Listeners can be registered as:
+ *      document.addEventListener("deviceready", myDeviceReadyListener, false);
+ *      document.addEventListener("resume", myResumeListener, false);
+ *      document.addEventListener("pause", myPauseListener, false);
+ *
+ * The DOM lifecycle events should be used for saving and restoring state
+ *      window.onload
+ *      window.onunload
+ *
+ */
+
+/**
+ * Channel
+ * @constructor
+ * @param type  String the channel name
+ * @param opts  Object options to pass into the channel, currently
+ *                     supports:
+ *                     onSubscribe: callback that fires when
+ *                       something subscribes to the Channel. Sets
+ *                       context to the Channel.
+ *                     onUnsubscribe: callback that fires when
+ *                       something unsubscribes to the Channel. Sets
+ *                       context to the Channel.
+ */
+var Channel = function(type, opts) {
+    this.type = type;
+    this.handlers = {};
+    this.numHandlers = 0;
+    this.guid = 1;
+    this.fired = false;
+    this.enabled = true;
+    this.events = {
+        onSubscribe:null,
+        onUnsubscribe:null
+    };
+    if (opts) {
+        if (opts.onSubscribe) this.events.onSubscribe = opts.onSubscribe;
+        if (opts.onUnsubscribe) this.events.onUnsubscribe = opts.onUnsubscribe;
+    }
+},
+    channel = {
+        /**
+         * Calls the provided function only after all of the channels specified
+         * have been fired.
+         */
+        join: function (h, c) {
+            var i = c.length;
+            var len = i;
+            var f = function() {
+                if (!(--i)) h();
+            };
+            for (var j=0; j<len; j++) {
+                !c[j].fired?c[j].subscribeOnce(f):i--;
+            }
+            if (!i) h();
+        },
+        create: function (type, opts) {
+            channel[type] = new Channel(type, opts);
+            return channel[type];
+        },
+
+        /**
+         * cordova Channels that must fire before "deviceready" is fired.
+         */
+        deviceReadyChannelsArray: [],
+        deviceReadyChannelsMap: {},
+
+        /**
+         * Indicate that a feature needs to be initialized before it is ready to be used.
+         * This holds up Cordova's "deviceready" event until the feature has been initialized
+         * and Cordova.initComplete(feature) is called.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        waitForInitialization: function(feature) {
+            if (feature) {
+                var c = null;
+                if (this[feature]) {
+                    c = this[feature];
+                }
+                else {
+                    c = this.create(feature);
+                }
+                this.deviceReadyChannelsMap[feature] = c;
+                this.deviceReadyChannelsArray.push(c);
+            }
+        },
+
+        /**
+         * Indicate that initialization code has completed and the feature is ready to be used.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        initializationComplete: function(feature) {
+            var c = this.deviceReadyChannelsMap[feature];
+            if (c) {
+                c.fire();
+            }
+        }
+    };
+
+function forceFunction(f) {
+    if (f === null || f === undefined || typeof f != 'function') throw "Function required as first argument!";
+}
+
+/**
+ * Subscribes the given function to the channel. Any time that
+ * Channel.fire is called so too will the function.
+ * Optionally specify an execution context for the function
+ * and a guid that can be used to stop subscribing to the channel.
+ * Returns the guid.
+ */
+Channel.prototype.subscribe = function(f, c, g) {
+    // need a function to call
+    forceFunction(f);
+
+    var func = f;
+    if (typeof c == "object") { func = utils.close(c, f); }
+
+    g = g || func.observer_guid || f.observer_guid;
+    if (!g) {
+        // first time we've seen this subscriber
+        g = this.guid++;
+    }
+    else {
+        // subscriber already handled; dont set it twice
+        return g;
+    }
+    func.observer_guid = g;
+    f.observer_guid = g;
+    this.handlers[g] = func;
+    this.numHandlers++;
+    if (this.events.onSubscribe) this.events.onSubscribe.call(this);
+    if (this.fired) func.call(this);
+    return g;
+};
+
+/**
+ * Like subscribe but the function is only called once and then it
+ * auto-unsubscribes itself.
+ */
+Channel.prototype.subscribeOnce = function(f, c) {
+    // need a function to call
+    forceFunction(f);
+
+    var g = null;
+    var _this = this;
+    var m = function() {
+        f.apply(c || null, arguments);
+        _this.unsubscribe(g);
+    };
+    if (this.fired) {
+        if (typeof c == "object") { f = utils.close(c, f); }
+        f.apply(this, this.fireArgs);
+    } else {
+        g = this.subscribe(m);
+    }
+    return g;
+};
+
+/**
+ * Unsubscribes the function with the given guid from the channel.
+ */
+Channel.prototype.unsubscribe = function(g) {
+    // need a function to unsubscribe
+    if (g === null || g === undefined) { throw "You must pass _something_ into Channel.unsubscribe"; }
+
+    if (typeof g == 'function') { g = g.observer_guid; }
+    var handler = this.handlers[g];
+    if (handler) {
+        if (handler.observer_guid) handler.observer_guid=null;
+        this.handlers[g] = null;
+        delete this.handlers[g];
+        this.numHandlers--;
+        if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
+    }
+};
+
+/**
+ * Calls all functions subscribed to this channel.
+ */
+Channel.prototype.fire = function(e) {
+    if (this.enabled) {
+        var fail = false;
+        this.fired = true;
+        for (var item in this.handlers) {
+            var handler = this.handlers[item];
+            if (typeof handler == 'function') {
+                var rv = (handler.apply(this, arguments)===false);
+                fail = fail || rv;
+            }
+        }
+        this.fireArgs = arguments;
+        return !fail;
+    }
+    return true;
+};
+
+// defining them here so they are ready super fast!
+// DOM event that is received when the web page is loaded and parsed.
+channel.create('onDOMContentLoaded');
+
+// Event to indicate the Cordova native side is ready.
+channel.create('onNativeReady');
+
+// Event to indicate that all Cordova JavaScript objects have been created
+// and it's time to run plugin constructors.
+channel.create('onCordovaReady');
+
+// Event to indicate that device properties are available
+channel.create('onCordovaInfoReady');
+
+// Event to indicate that the connection property has been set.
+channel.create('onCordovaConnectionReady');
+
+// Event to indicate that Cordova is ready
+channel.create('onDeviceReady');
+
+// Event to indicate a resume lifecycle event
+channel.create('onResume');
+
+// Event to indicate a pause lifecycle event
+channel.create('onPause');
+
+// Event to indicate a destroy lifecycle event
+channel.create('onDestroy');
+
+// Channels that must fire before "deviceready" is fired.
+channel.waitForInitialization('onCordovaReady');
+channel.waitForInitialization('onCordovaConnectionReady');
+
+module.exports = channel;
+
+});
+
+// file: lib/common/common.js
+define("cordova/common", function(require, exports, module) {
+module.exports = {
+    objects: {
+        cordova: {
+            path: 'cordova',
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                },
+                logger: {
+                    path: 'cordova/plugin/logger'
+                }
+            }
+        },
+        Cordova: {
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        PhoneGap:{
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        navigator: {
+            children: {
+                notification: {
+                    path: 'cordova/plugin/notification'
+                },
+                accelerometer: {
+                    path: 'cordova/plugin/accelerometer'
+                },
+                battery: {
+                    path: 'cordova/plugin/battery'
+                },
+                camera:{
+                    path: 'cordova/plugin/Camera'
+                },
+                compass:{
+                    path: 'cordova/plugin/compass'
+                },
+                contacts: {
+                    path: 'cordova/plugin/contacts'
+                },
+                device:{
+                    children:{
+                        capture: {
+                            path: 'cordova/plugin/capture'
+                        }
+                    }
+                },
+                geolocation: {
+                    path: 'cordova/plugin/geolocation'
+                },
+                network: {
+                    children: {
+                        connection: {
+                            path: 'cordova/plugin/network'
+                        }
+                    }
+                },
+                splashscreen: {
+                    path: 'cordova/plugin/splashscreen'
+                }
+            }
+        },
+        Acceleration: {
+            path: 'cordova/plugin/Acceleration'
+        },
+        Camera:{
+            path: 'cordova/plugin/CameraConstants'
+        },
+        CameraPopoverOptions: {
+            path: 'cordova/plugin/CameraPopoverOptions'
+        },
+        CaptureError: {
+            path: 'cordova/plugin/CaptureError'
+        },
+        CaptureAudioOptions:{
+            path: 'cordova/plugin/CaptureAudioOptions'
+        },
+        CaptureImageOptions: {
+            path: 'cordova/plugin/CaptureImageOptions'
+        },
+        CaptureVideoOptions: {
+            path: 'cordova/plugin/CaptureVideoOptions'
+        },
+        CompassHeading:{
+            path: 'cordova/plugin/CompassHeading'
+        },
+        CompassError:{
+            path: 'cordova/plugin/CompassError'
+        },
+        ConfigurationData: {
+            path: 'cordova/plugin/ConfigurationData'
+        },
+        Connection: {
+            path: 'cordova/plugin/Connection'
+        },
+        Contact: {
+            path: 'cordova/plugin/Contact'
+        },
+        ContactAddress: {
+            path: 'cordova/plugin/ContactAddress'
+        },
+        ContactError: {
+            path: 'cordova/plugin/ContactError'
+        },
+        ContactField: {
+            path: 'cordova/plugin/ContactField'
+        },
+        ContactFindOptions: {
+            path: 'cordova/plugin/ContactFindOptions'
+        },
+        ContactName: {
+            path: 'cordova/plugin/ContactName'
+        },
+        ContactOrganization: {
+            path: 'cordova/plugin/ContactOrganization'
+        },
+        Coordinates: {
+            path: 'cordova/plugin/Coordinates'
+        },
+        device: {
+            path: 'cordova/plugin/device'
+        },
+        DirectoryEntry: {
+            path: 'cordova/plugin/DirectoryEntry'
+        },
+        DirectoryReader: {
+            path: 'cordova/plugin/DirectoryReader'
+        },
+        Entry: {
+            path: 'cordova/plugin/Entry'
+        },
+        File: {
+            path: 'cordova/plugin/File'
+        },
+        FileEntry: {
+            path: 'cordova/plugin/FileEntry'
+        },
+        FileError: {
+            path: 'cordova/plugin/FileError'
+        },
+        FileReader: {
+            path: 'cordova/plugin/FileReader'
+        },
+        FileSystem: {
+            path: 'cordova/plugin/FileSystem'
+        },
+        FileTransfer: {
+            path: 'cordova/plugin/FileTransfer'
+        },
+        FileTransferError: {
+            path: 'cordova/plugin/FileTransferError'
+        },
+        FileUploadOptions: {
+            path: 'cordova/plugin/FileUploadOptions'
+        },
+        FileUploadResult: {
+            path: 'cordova/plugin/FileUploadResult'
+        },
+        FileWriter: {
+            path: 'cordova/plugin/FileWriter'
+        },
+        Flags: {
+            path: 'cordova/plugin/Flags'
+        },
+        LocalFileSystem: {
+            path: 'cordova/plugin/LocalFileSystem'
+        },
+        Media: {
+            path: 'cordova/plugin/Media'
+        },
+        MediaError: {
+            path: 'cordova/plugin/MediaError'
+        },
+        MediaFile: {
+            path: 'cordova/plugin/MediaFile'
+        },
+        MediaFileData:{
+            path: 'cordova/plugin/MediaFileData'
+        },
+        Metadata:{
+            path: 'cordova/plugin/Metadata'
+        },
+        Position: {
+            path: 'cordova/plugin/Position'
+        },
+        PositionError: {
+            path: 'cordova/plugin/PositionError'
+        },
+        ProgressEvent: {
+            path: 'cordova/plugin/ProgressEvent'
+        },
+        requestFileSystem:{
+            path: 'cordova/plugin/requestFileSystem'
+        },
+        resolveLocalFileSystemURI:{
+            path: 'cordova/plugin/resolveLocalFileSystemURI'
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/exec.js
+define("cordova/exec", function(require, exports, module) {
+/**
+ * Execute a cordova command.  It is up to the native side whether this action
+ * is synchronous or asynchronous.  The native side can return:
+ *      Synchronous: PluginResult object as a JSON string
+ *      Asynchrounous: Empty string ""
+ * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
+ * depending upon the result of the action.
+ *
+ * @param {Function} successCB  The success callback
+ * @param {Function} failCB     The fail callback
+ * @param {String} service      The name of the service to use
+ * @param {String} action       Action to be run in cordova
+ * @param {String[]} [args]     Zero or more arguments to pass to the method
+ */
+
+var tizen = require('cordova/plugin/tizen/manager'),
+    cordova = require('cordova'),
+    utils = require('cordova/utils');
+
+module.exports = function(successCB, failCB, service, action, args) {
+
+    try {
+        var v = tizen.exec(successCB, failCB, service, action, args);
+
+        // If status is OK, then return value back to caller
+        if (v.status == cordova.callbackStatus.OK) {
+
+            // If there is a success callback, then call it now with returned value
+            if (successCB) {
+                try {
+                    successCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+ service + "." + action + " = " + e);
+                }
+
+            }
+            return v.message;
+        } else if (v.status == cordova.callbackStatus.NO_RESULT) {
+            // Nothing to do here
+        } else {
+            // If error, then display error
+            console.log("Error: " + service + "." + action + " Status=" + v.status + " Message=" + v.message);
+
+            // If there is a fail callback, then call it now with returned value
+            if (failCB) {
+                try {
+                    failCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in error callback: " + service + "." + action + " = "+e);
+                }
+            }
+            return null;
+        }
+    } catch (e) {
+        utils.alert("Error: " + e);
+    }
+};
+
+});
+
+// file: lib/tizen/platform.js
+define("cordova/platform", function(require, exports, module) {
+module.exports = {
+    id: "tizen",
+    initialize: function() {},
+    objects: {
+        device: {
+            path: "cordova/plugin/tizen/Device"
+        },
+        File: { // exists natively, override
+            path: "cordova/plugin/File"
+        },
+        FileReader: { // exists natively, override
+            path: "cordova/plugin/FileReader"
+        },
+        FileError: { //exists natively, override
+            path: "cordova/plugin/FileError"
+        }
+    },
+    merges: {
+        MediaError: { // exists natively
+            path: "cordova/plugin/tizen/MediaError"
+        },
+        navigator: {
+            children: {
+                device: {
+                    path: "cordova/plugin/tizen/Device"
+                },
+                contacts: {
+                    path: "cordova/plugin/tizen/contacts"
+                },
+               notification: {
+                   path: "cordova/plugin/tizen/Notification"
+               }
+            }
+        },
+        Contact: {
+            path: "cordova/plugin/tizen/Contact"
+        }
+    }
+};
+
+});
+
+// file: lib/common/plugin/Acceleration.js
+define("cordova/plugin/Acceleration", function(require, exports, module) {
+var Acceleration = function(x, y, z, timestamp) {
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.timestamp = timestamp || (new Date()).getTime();
+};
+
+module.exports = Acceleration;
+
+});
+
+// file: lib/common/plugin/Camera.js
+define("cordova/plugin/Camera", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    Camera = require('cordova/plugin/CameraConstants');
+
+var cameraExport = {};
+
+// Tack on the Camera Constants to the base camera plugin.
+for (var key in Camera) {
+    cameraExport[key] = Camera[key];
+}
+
+/**
+ * Gets a picture from source defined by "options.sourceType", and returns the
+ * image as defined by the "options.destinationType" option.
+
+ * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
+ *
+ * @param {Function} successCallback
+ * @param {Function} errorCallback
+ * @param {Object} options
+ */
+cameraExport.getPicture = function(successCallback, errorCallback, options) {
+    // successCallback required
+    if (typeof successCallback != "function") {
+        console.log("Camera Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback != "function")) {
+        console.log("Camera Error: errorCallback is not a function");
+        return;
+    }
+
+    var quality = 50;
+    if (options && typeof options.quality == "number") {
+        quality = options.quality;
+    } else if (options && typeof options.quality == "string") {
+        var qlity = parseInt(options.quality, 10);
+        if (isNaN(qlity) === false) {
+            quality = qlity.valueOf();
+        }
+    }
+
+    var destinationType = Camera.DestinationType.FILE_URI;
+    if (typeof options.destinationType == "number") {
+        destinationType = options.destinationType;
+    }
+
+    var sourceType = Camera.PictureSourceType.CAMERA;
+    if (typeof options.sourceType == "number") {
+        sourceType = options.sourceType;
+    }
+
+    var targetWidth = -1;
+    if (typeof options.targetWidth == "number") {
+        targetWidth = options.targetWidth;
+    } else if (typeof options.targetWidth == "string") {
+        var width = parseInt(options.targetWidth, 10);
+        if (isNaN(width) === false) {
+            targetWidth = width.valueOf();
+        }
+    }
+
+    var targetHeight = -1;
+    if (typeof options.targetHeight == "number") {
+        targetHeight = options.targetHeight;
+    } else if (typeof options.targetHeight == "string") {
+        var height = parseInt(options.targetHeight, 10);
+        if (isNaN(height) === false) {
+            targetHeight = height.valueOf();
+        }
+    }
+
+    var encodingType = Camera.EncodingType.JPEG;
+    if (typeof options.encodingType == "number") {
+        encodingType = options.encodingType;
+    }
+
+    var mediaType = Camera.MediaType.PICTURE;
+    if (typeof options.mediaType == "number") {
+        mediaType = options.mediaType;
+    }
+    var allowEdit = false;
+    if (typeof options.allowEdit == "boolean") {
+        allowEdit = options.allowEdit;
+    } else if (typeof options.allowEdit == "number") {
+        allowEdit = options.allowEdit <= 0 ? false : true;
+    }
+    var correctOrientation = false;
+    if (typeof options.correctOrientation == "boolean") {
+        correctOrientation = options.correctOrientation;
+    } else if (typeof options.correctOrientation == "number") {
+        correctOrientation = options.correctOrientation <=0 ? false : true;
+    }
+    var saveToPhotoAlbum = false;
+    if (typeof options.saveToPhotoAlbum == "boolean") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum;
+    } else if (typeof options.saveToPhotoAlbum == "number") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum <=0 ? false : true;
+    }
+    var popoverOptions = null;
+    if (typeof options.popoverOptions == "object") {
+        popoverOptions = options.popoverOptions;
+    }
+
+    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
+
+    exec(successCallback, errorCallback, "Camera", "takePicture", args);
+};
+
+cameraExport.cleanup = function(successCallback, errorCallback) {
+    exec(successCallback, errorCallback, "Camera", "cleanup", []);
+};
+
+module.exports = cameraExport;
+});
+
+// file: lib/common/plugin/CameraConstants.js
+define("cordova/plugin/CameraConstants", function(require, exports, module) {
+module.exports = {
+  DestinationType:{
+    DATA_URL: 0,         // Return base64 encoded string
+    FILE_URI: 1          // Return file uri (content://media/external/images/media/2 for Android)
+  },
+  EncodingType:{
+    JPEG: 0,             // Return JPEG encoded image
+    PNG: 1               // Return PNG encoded image
+  },
+  MediaType:{
+    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
+    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
+    ALLMEDIA : 2         // allow selection from all media types
+  },
+  PictureSourceType:{
+    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
+    CAMERA : 1,          // Take picture from camera
+    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
+  },
+  PopoverArrowDirection:{
+      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
+      ARROW_DOWN : 2,
+      ARROW_LEFT : 4,
+      ARROW_RIGHT : 8,
+      ARROW_ANY : 15
+  }
+};
+});
+
+// file: lib/common/plugin/CameraPopoverOptions.js
+define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
+var Camera = require('cordova/plugin/CameraConstants');
+
+/**
+ * Encapsulates options for iOS Popover image picker
+ */
+var CameraPopoverOptions = function(x,y,width,height,arrowDir){
+    // information of rectangle that popover should be anchored to
+    this.x = x || 0;
+    this.y = y || 32;
+    this.width = width || 320;
+    this.height = height || 480;
+    // The direction of the popover arrow
+    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
+};
+
+module.exports = CameraPopoverOptions;
+});
+
+// file: lib/common/plugin/CaptureAudioOptions.js
+define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
+/**
+ * Encapsulates all audio capture operation configuration options.
+ */
+var CaptureAudioOptions = function(){
+    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single sound clip in seconds.
+    this.duration = 0;
+    // The selected audio mode. Must match with one of the elements in supportedAudioModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureAudioOptions;
+});
+
+// file: lib/common/plugin/CaptureError.js
+define("cordova/plugin/CaptureError", function(require, exports, module) {
+/**
+ * The CaptureError interface encapsulates all errors in the Capture API.
+ */
+var CaptureError = function(c) {
+   this.code = c || null;
+};
+
+// Camera or microphone failed to capture image or sound.
+CaptureError.CAPTURE_INTERNAL_ERR = 0;
+// Camera application or audio capture application is currently serving other capture request.
+CaptureError.CAPTURE_APPLICATION_BUSY = 1;
+// Invalid use of the API (e.g. limit parameter has value less than one).
+CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
+// User exited camera application or audio capture application before capturing anything.
+CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
+// The requested capture operation is not supported.
+CaptureError.CAPTURE_NOT_SUPPORTED = 20;
+
+module.exports = CaptureError;
+});
+
+// file: lib/common/plugin/CaptureImageOptions.js
+define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
+/**
+ * Encapsulates all image capture operation configuration options.
+ */
+var CaptureImageOptions = function(){
+    // Upper limit of images user can take. Value must be equal or greater than 1.
+    this.limit = 1;
+    // The selected image mode. Must match with one of the elements in supportedImageModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureImageOptions;
+});
+
+// file: lib/common/plugin/CaptureVideoOptions.js
+define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
+/**
+ * Encapsulates all video capture operation configuration options.
+ */
+var CaptureVideoOptions = function(){
+    // Upper limit of videos user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single video clip in seconds.
+    this.duration = 0;
+    // The selected video mode. Must match with one of the elements in supportedVideoModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureVideoOptions;
+});
+
+// file: lib/common/plugin/CompassError.js
+define("cordova/plugin/CompassError", function(require, exports, module) {
+/**
+ *  CompassError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var CompassError = function(err) {
+    this.code = (err !== undefined ? err : null);
+};
+
+CompassError.COMPASS_INTERNAL_ERR = 0;
+CompassError.COMPASS_NOT_SUPPORTED = 20;
+
+module.exports = CompassError;
+});
+
+// file: lib/common/plugin/CompassHeading.js
+define("cordova/plugin/CompassHeading", function(require, exports, module) {
+var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
+  this.magneticHeading = (magneticHeading !== undefined ? magneticHeading : null);
+  this.trueHeading = (trueHeading !== undefined ? trueHeading : null);
+  this.headingAccuracy = (headingAccuracy !== undefined ? headingAccuracy : null);
+  this.timestamp = (timestamp !== undefined ? timestamp : new Date().getTime());
+};
+
+module.exports = CompassHeading;
+});
+
+// file: lib/common/plugin/ConfigurationData.js
+define("cordova/plugin/ConfigurationData", function(require, exports, module) {
+/**
+ * Encapsulates a set of parameters that the capture device supports.
+ */
+function ConfigurationData() {
+    // The ASCII-encoded string in lower case representing the media type.
+    this.type = null;
+    // The height attribute represents height of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0.
+    this.height = 0;
+    // The width attribute represents width of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0
+    this.width = 0;
+}
+
+module.exports = ConfigurationData;
+});
+
+// file: lib/common/plugin/Connection.js
+define("cordova/plugin/Connection", function(require, exports, module) {
+/**
+ * Network status
+ */
+module.exports = {
+        UNKNOWN: "unknown",
+        ETHERNET: "ethernet",
+        WIFI: "wifi",
+        CELL_2G: "2g",
+        CELL_3G: "3g",
+        CELL_4G: "4g",
+        NONE: "none"
+};
+});
+
+// file: lib/common/plugin/Contact.js
+define("cordova/plugin/Contact", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils');
+
+/**
+* Converts primitives into Complex Object
+* Currently only used for Date fields
+*/
+function convertIn(contact) {
+    var value = contact.birthday;
+    try {
+      contact.birthday = new Date(parseFloat(value));
+    } catch (exception){
+      console.log("Cordova Contact convertIn error: exception creating date.");
+    }
+    return contact;
+}
+
+/**
+* Converts Complex objects into primitives
+* Only conversion at present is for Dates.
+**/
+
+function convertOut(contact) {
+    var value = contact.birthday;
+    if (value !== null) {
+        // try to make it a Date object if it is not already
+        if (!utils.isDate(value)){
+            try {
+                value = new Date(value);
+            } catch(exception){
+                value = null;
+            }
+        }
+        if (utils.isDate(value)){
+            value = value.valueOf(); // convert to milliseconds
+        }
+        contact.birthday = value;
+    }
+    return contact;
+}
+
+/**
+* Contains information about a single contact.
+* @constructor
+* @param {DOMString} id unique identifier
+* @param {DOMString} displayName
+* @param {ContactName} name
+* @param {DOMString} nickname
+* @param {Array.<ContactField>} phoneNumbers array of phone numbers
+* @param {Array.<ContactField>} emails array of email addresses
+* @param {Array.<ContactAddress>} addresses array of addresses
+* @param {Array.<ContactField>} ims instant messaging user ids
+* @param {Array.<ContactOrganization>} organizations
+* @param {DOMString} birthday contact's birthday
+* @param {DOMString} note user notes about contact
+* @param {Array.<ContactField>} photos
+* @param {Array.<ContactField>} categories
+* @param {Array.<ContactField>} urls contact's web sites
+*/
+var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
+    ims, organizations, birthday, note, photos, categories, urls) {
+    this.id = id || null;
+    this.rawId = null;
+    this.displayName = displayName || null;
+    this.name = name || null; // ContactName
+    this.nickname = nickname || null;
+    this.phoneNumbers = phoneNumbers || null; // ContactField[]
+    this.emails = emails || null; // ContactField[]
+    this.addresses = addresses || null; // ContactAddress[]
+    this.ims = ims || null; // ContactField[]
+    this.organizations = organizations || null; // ContactOrganization[]
+    this.birthday = birthday || null;
+    this.note = note || null;
+    this.photos = photos || null; // ContactField[]
+    this.categories = categories || null; // ContactField[]
+    this.urls = urls || null; // ContactField[]
+};
+
+/**
+* Removes contact from device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.remove = function(successCB, errorCB) {
+    var fail = function(code) {
+        errorCB(new ContactError(code));
+    };
+    if (this.id === null) {
+        fail(ContactError.UNKNOWN_ERROR);
+    }
+    else {
+        exec(successCB, fail, "Contacts", "remove", [this.id]);
+    }
+};
+
+/**
+* Creates a deep copy of this Contact.
+* With the contact ID set to null.
+* @return copy of this Contact
+*/
+Contact.prototype.clone = function() {
+    var clonedContact = utils.clone(this);
+    var i;
+    clonedContact.id = null;
+    clonedContact.rawId = null;
+    // Loop through and clear out any id's in phones, emails, etc.
+    if (clonedContact.phoneNumbers) {
+        for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
+            clonedContact.phoneNumbers[i].id = null;
+        }
+    }
+    if (clonedContact.emails) {
+        for (i = 0; i < clonedContact.emails.length; i++) {
+            clonedContact.emails[i].id = null;
+        }
+    }
+    if (clonedContact.addresses) {
+        for (i = 0; i < clonedContact.addresses.length; i++) {
+            clonedContact.addresses[i].id = null;
+        }
+    }
+    if (clonedContact.ims) {
+        for (i = 0; i < clonedContact.ims.length; i++) {
+            clonedContact.ims[i].id = null;
+        }
+    }
+    if (clonedContact.organizations) {
+        for (i = 0; i < clonedContact.organizations.length; i++) {
+            clonedContact.organizations[i].id = null;
+        }
+    }
+    if (clonedContact.categories) {
+        for (i = 0; i < clonedContact.categories.length; i++) {
+            clonedContact.categories[i].id = null;
+        }
+    }
+    if (clonedContact.photos) {
+        for (i = 0; i < clonedContact.photos.length; i++) {
+            clonedContact.photos[i].id = null;
+        }
+    }
+    if (clonedContact.urls) {
+        for (i = 0; i < clonedContact.urls.length; i++) {
+            clonedContact.urls[i].id = null;
+        }
+    }
+    return clonedContact;
+};
+
+/**
+* Persists contact to device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.save = function(successCB, errorCB) {
+  var fail = function(code) {
+      errorCB(new ContactError(code));
+  };
+    var success = function(result) {
+      if (result) {
+          if (typeof successCB === 'function') {
+              var fullContact = require('cordova/plugin/contacts').create(result);
+              successCB(convertIn(fullContact));
+          }
+      }
+      else {
+          // no Entry object returned
+          fail(ContactError.UNKNOWN_ERROR);
+      }
+  };
+    var dupContact = convertOut(utils.clone(this));
+    exec(success, fail, "Contacts", "save", [dupContact]);
+};
+
+
+module.exports = Contact;
+
+});
+
+// file: lib/common/plugin/ContactAddress.js
+define("cordova/plugin/ContactAddress", function(require, exports, module) {
+/**
+* Contact address.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code
+* @param formatted // NOTE: not a W3C standard
+* @param streetAddress
+* @param locality
+* @param region
+* @param postalCode
+* @param country
+*/
+
+var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.formatted = formatted || null;
+    this.streetAddress = streetAddress || null;
+    this.locality = locality || null;
+    this.region = region || null;
+    this.postalCode = postalCode || null;
+    this.country = country || null;
+};
+
+module.exports = ContactAddress;
+});
+
+// file: lib/common/plugin/ContactError.js
+define("cordova/plugin/ContactError", function(require, exports, module) {
+/**
+ *  ContactError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var ContactError = function(err) {
+    this.code = (typeof err != 'undefined' ? err : null);
+};
+
+/**
+ * Error codes
+ */
+ContactError.UNKNOWN_ERROR = 0;
+ContactError.INVALID_ARGUMENT_ERROR = 1;
+ContactError.TIMEOUT_ERROR = 2;
+ContactError.PENDING_OPERATION_ERROR = 3;
+ContactError.IO_ERROR = 4;
+ContactError.NOT_SUPPORTED_ERROR = 5;
+ContactError.PERMISSION_DENIED_ERROR = 20;
+
+module.exports = ContactError;
+});
+
+// file: lib/common/plugin/ContactField.js
+define("cordova/plugin/ContactField", function(require, exports, module) {
+/**
+* Generic contact field.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param type
+* @param value
+* @param pref
+*/
+var ContactField = function(type, value, pref) {
+    this.id = null;
+    this.type = (type && type.toString()) || null;
+    this.value = (value && value.toString()) || null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+};
+
+module.exports = ContactField;
+});
+
+// file: lib/common/plugin/ContactFindOptions.js
+define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
+/**
+ * ContactFindOptions.
+ * @constructor
+ * @param filter used to match contacts against
+ * @param multiple boolean used to determine if more than one contact should be returned
+ */
+
+var ContactFindOptions = function(filter, multiple) {
+    this.filter = filter || '';
+    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
+};
+
+module.exports = ContactFindOptions;
+});
+
+// file: lib/common/plugin/ContactName.js
+define("cordova/plugin/ContactName", function(require, exports, module) {
+/**
+* Contact name.
+* @constructor
+* @param formatted // NOTE: not part of W3C standard
+* @param familyName
+* @param givenName
+* @param middle
+* @param prefix
+* @param suffix
+*/
+var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
+    this.formatted = formatted || null;
+    this.familyName = familyName || null;
+    this.givenName = givenName || null;
+    this.middleName = middle || null;
+    this.honorificPrefix = prefix || null;
+    this.honorificSuffix = suffix || null;
+};
+
+module.exports = ContactName;
+});
+
+// file: lib/common/plugin/ContactOrganization.js
+define("cordova/plugin/ContactOrganization", function(require, exports, module) {
+/**
+* Contact organization.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param name
+* @param dept
+* @param title
+* @param startDate
+* @param endDate
+* @param location
+* @param desc
+*/
+
+var ContactOrganization = function(pref, type, name, dept, title) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.name = name || null;
+    this.department = dept || null;
+    this.title = title || null;
+};
+
+module.exports = ContactOrganization;
+});
+
+// file: lib/common/plugin/Coordinates.js
+define("cordova/plugin/Coordinates", function(require, exports, module) {
+/**
+ * This class contains position information.
+ * @param {Object} lat
+ * @param {Object} lng
+ * @param {Object} alt
+ * @param {Object} acc
+ * @param {Object} head
+ * @param {Object} vel
+ * @param {Object} altacc
+ * @constructor
+ */
+var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
+    /**
+     * The latitude of the position.
+     */
+    this.latitude = lat;
+    /**
+     * The longitude of the position,
+     */
+    this.longitude = lng;
+    /**
+     * The accuracy of the position.
+     */
+    this.accuracy = acc;
+    /**
+     * The altitude of the position.
+     */
+    this.altitude = (alt !== undefined ? alt : null);
+    /**
+     * The direction the device is moving at the position.
+     */
+    this.heading = (head !== undefined ? head : null);
+    /**
+     * The velocity with which the device is moving at the position.
+     */
+    this.speed = (vel !== undefined ? vel : null);
+
+    if (this.speed === 0 || this.speed === null) {
+        this.heading = NaN;
+    }
+
+    /**
+     * The altitude accuracy of the position.
+     */
+    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
+};
+
+module.exports = Coordinates;
+
+});
+
+// file: lib/common/plugin/DirectoryEntry.js
+define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileError = require('cordova/plugin/FileError'),
+    DirectoryReader = require('cordova/plugin/DirectoryReader');
+
+/**
+ * An interface representing a directory on the file system.
+ *
+ * {boolean} isFile always false (readonly)
+ * {boolean} isDirectory always true (readonly)
+ * {DOMString} name of the directory, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the directory (readonly)
+ * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
+ */
+var DirectoryEntry = function(name, fullPath) {
+     DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
+};
+
+utils.extend(DirectoryEntry, Entry);
+
+/**
+ * Creates a new DirectoryReader to read entries from this directory
+ */
+DirectoryEntry.prototype.createReader = function() {
+    return new DirectoryReader(this.fullPath);
+};
+
+/**
+ * Creates or looks up a directory
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
+ * @param {Flags} options to create or excluively create the directory
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
+};
+
+/**
+ * Deletes a directory and all of it's contents
+ *
+ * @param {Function} successCallback is called with no parameters
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
+};
+
+/**
+ * Creates or looks up a file
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
+ * @param {Flags} options to create or excluively create the file
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var FileEntry = require('cordova/plugin/FileEntry');
+        var entry = new FileEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
+};
+
+module.exports = DirectoryEntry;
+
+});
+
+// file: lib/common/plugin/DirectoryReader.js
+define("cordova/plugin/DirectoryReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError') ;
+
+/**
+ * An interface that lists the files and directories in a directory.
+ */
+function DirectoryReader(path) {
+    this.path = path || null;
+}
+
+/**
+ * Returns a list of entries from a directory.
+ *
+ * @param {Function} successCallback is called with a list of entries
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var retVal = [];
+        for (var i=0; i<result.length; i++) {
+            var entry = null;
+            if (result[i].isDirectory) {
+                entry = new (require('cordova/plugin/DirectoryEntry'))();
+            }
+            else if (result[i].isFile) {
+                entry = new (require('cordova/plugin/FileEntry'))();
+            }
+            entry.isDirectory = result[i].isDirectory;
+            entry.isFile = result[i].isFile;
+            entry.name = result[i].name;
+            entry.fullPath = result[i].fullPath;
+            retVal.push(entry);
+        }
+        successCallback(retVal);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "readEntries", [this.path]);
+};
+
+module.exports = DirectoryReader;
+
+});
+
+// file: lib/common/plugin/Entry.js
+define("cordova/plugin/Entry", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    Metadata = require('cordova/plugin/Metadata');
+
+/**
+ * Represents a file or directory on the local file system.
+ *
+ * @param isFile
+ *            {boolean} true if Entry is a file (readonly)
+ * @param isDirectory
+ *            {boolean} true if Entry is a directory (readonly)
+ * @param name
+ *            {DOMString} name of the file or directory, excluding the path
+ *            leading to it (readonly)
+ * @param fullPath
+ *            {DOMString} the absolute full path to the file or directory
+ *            (readonly)
+ */
+function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
+    this.isFile = (typeof isFile != 'undefined'?isFile:false);
+    this.isDirectory = (typeof isDirectory != 'undefined'?isDirectory:false);
+    this.name = name || '';
+    this.fullPath = fullPath || '';
+    this.filesystem = fileSystem || null;
+}
+
+/**
+ * Look up the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ */
+Entry.prototype.getMetadata = function(successCallback, errorCallback) {
+  var success = typeof successCallback !== 'function' ? null : function(lastModified) {
+      var metadata = new Metadata(lastModified);
+      successCallback(metadata);
+  };
+  var fail = typeof errorCallback !== 'function' ? null : function(code) {
+      errorCallback(new FileError(code));
+  };
+
+  exec(success, fail, "File", "getMetadata", [this.fullPath]);
+};
+
+/**
+ * Set the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ * @param metadataObject
+ *            {Object} keys and values to set
+ */
+Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
+
+  exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
+};
+
+/**
+ * Move a file or directory to a new location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to move this entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new DirectoryEntry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+    // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Copy a directory to a different location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to copy the entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new Entry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+
+        // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        // success callback
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Return a URL that can be used to identify this entry.
+ */
+Entry.prototype.toURL = function() {
+    // fullPath attribute contains the full URL
+    return this.fullPath;
+};
+
+/**
+ * Returns a URI that can be used to identify this entry.
+ *
+ * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
+ * @return uri
+ */
+Entry.prototype.toURI = function(mimeType) {
+    console.log("DEPRECATED: Update your code to use 'toURL'");
+    // fullPath attribute contains the full URI
+    return this.toURL();
+};
+
+/**
+ * Remove a file or directory. It is an error to attempt to delete a
+ * directory that is not empty. It is an error to attempt to delete a
+ * root directory of a file system.
+ *
+ * @param successCallback {Function} called with no parameters
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.remove = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "remove", [this.fullPath]);
+};
+
+/**
+ * Look up the parent DirectoryEntry of this entry.
+ *
+ * @param successCallback {Function} called with the parent DirectoryEntry object
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.getParent = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getParent", [this.fullPath]);
+};
+
+module.exports = Entry;
+});
+
+// file: lib/common/plugin/File.js
+define("cordova/plugin/File", function(require, exports, module) {
+/**
+ * Constructor.
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+
+var File = function(name, fullPath, type, lastModifiedDate, size){
+    this.name = name || '';
+    this.fullPath = fullPath || null;
+    this.type = type || null;
+    this.lastModifiedDate = lastModifiedDate || null;
+    this.size = size || 0;
+};
+
+module.exports = File;
+});
+
+// file: lib/common/plugin/FileEntry.js
+define("cordova/plugin/FileEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileWriter = require('cordova/plugin/FileWriter'),
+    File = require('cordova/plugin/File'),
+    FileError = require('cordova/plugin/FileError');
+
+/**
+ * An interface representing a file on the file system.
+ *
+ * {boolean} isFile always true (readonly)
+ * {boolean} isDirectory always false (readonly)
+ * {DOMString} name of the file, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the file (readonly)
+ * {FileSystem} filesystem on which the file resides (readonly)
+ */
+var FileEntry = function(name, fullPath) {
+     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
+};
+
+utils.extend(FileEntry, Entry);
+
+/**
+ * Creates a new FileWriter associated with the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new FileWriter
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
+    this.file(function(filePointer) {
+        var writer = new FileWriter(filePointer);
+
+        if (writer.fileName === null || writer.fileName === "") {
+            if (typeof errorCallback === "function") {
+                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
+            }
+        } else {
+            if (typeof successCallback === "function") {
+                successCallback(writer);
+            }
+        }
+    }, errorCallback);
+};
+
+/**
+ * Returns a File that represents the current state of the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new File object
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.file = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(f) {
+        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
+        successCallback(file);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
+};
+
+
+module.exports = FileEntry;
+});
+
+// file: lib/common/plugin/FileError.js
+define("cordova/plugin/FileError", function(require, exports, module) {
+/**
+ * FileError
+ */
+function FileError(error) {
+  this.code = error || null;
+}
+
+// File error codes
+// Found in DOMException
+FileError.NOT_FOUND_ERR = 1;
+FileError.SECURITY_ERR = 2;
+FileError.ABORT_ERR = 3;
+
+// Added by File API specification
+FileError.NOT_READABLE_ERR = 4;
+FileError.ENCODING_ERR = 5;
+FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
+FileError.INVALID_STATE_ERR = 7;
+FileError.SYNTAX_ERR = 8;
+FileError.INVALID_MODIFICATION_ERR = 9;
+FileError.QUOTA_EXCEEDED_ERR = 10;
+FileError.TYPE_MISMATCH_ERR = 11;
+FileError.PATH_EXISTS_ERR = 12;
+
+module.exports = FileError;
+});
+
+// file: lib/common/plugin/FileReader.js
+define("cordova/plugin/FileReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class reads the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To read from the SD card, the file name is "sdcard/my_file.txt"
+ * @constructor
+ */
+var FileReader = function() {
+    this.fileName = "";
+
+    this.readyState = 0; // FileReader.EMPTY
+
+    // File data
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onloadstart = null;    // When the read starts.
+    this.onprogress = null;     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)
+    this.onload = null;         // When the read has successfully completed.
+    this.onerror = null;        // When the read has failed (see errors).
+    this.onloadend = null;      // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the read has been aborted. For instance, by invoking the abort() method.
+};
+
+// States
+FileReader.EMPTY = 0;
+FileReader.LOADING = 1;
+FileReader.DONE = 2;
+
+/**
+ * Abort reading file.
+ */
+FileReader.prototype.abort = function() {
+    this.result = null;
+
+    if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
+      return;
+    }
+
+    this.readyState = FileReader.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === 'function') {
+        this.onabort(new ProgressEvent('abort', {target:this}));
+    }
+    // If load end callback
+    if (typeof this.onloadend === 'function') {
+        this.onloadend(new ProgressEvent('loadend', {target:this}));
+    }
+};
+
+/**
+ * Read text file.
+ *
+ * @param file          {File} File object containing file properties
+ * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
+ */
+FileReader.prototype.readAsText = function(file, encoding) {
+    // Figure out pathing
+    this.fileName = '';
+    if (typeof file.fullPath === 'undefined') {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    // Default encoding is UTF-8
+    var enc = encoding ? encoding : "UTF-8";
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // null result
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsText", [this.fileName, enc]);
+};
+
+
+/**
+ * Read file and return data as a base64 encoded data url.
+ * A data url is of the form:
+ *      data:[<mediatype>][;base64],<data>
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsDataURL = function(file) {
+    this.fileName = "";
+    if (typeof file.fullPath === "undefined") {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsDataURL", [this.fileName]);
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsBinaryString = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('method "readAsBinaryString" is not supported at this time.');
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsArrayBuffer = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('This method is not supported at this time.');
+};
+
+module.exports = FileReader;
+});
+
+// file: lib/common/plugin/FileSystem.js
+define("cordova/plugin/FileSystem", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+
+/**
+ * An interface representing a file system
+ *
+ * @constructor
+ * {DOMString} name the unique name of the file system (readonly)
+ * {DirectoryEntry} root directory of the file system (readonly)
+ */
+var FileSystem = function(name, root) {
+    this.name = name || null;
+    if (root) {
+        this.root = new DirectoryEntry(root.name, root.fullPath);
+    }
+};
+
+module.exports = FileSystem;
+
+});
+
+// file: lib/common/plugin/FileTransfer.js
+define("cordova/plugin/FileTransfer", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileTransferError = require('cordova/plugin/FileTransferError');
+
+/**
+ * FileTransfer uploads a file to a remote server.
+ * @constructor
+ */
+var FileTransfer = function() {};
+
+/**
+* Given an absolute file path, uploads a file on the device to a remote server
+* using a multipart HTTP request.
+* @param filePath {String}           Full path of the file on the device
+* @param server {String}             URL of the server to receive the file
+* @param successCallback (Function}  Callback to be invoked when upload has completed
+* @param errorCallback {Function}    Callback to be invoked upon error
+* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
+* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
+*/
+FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
+    // sanity parameter checking
+    if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
+    // check for options
+    var fileKey = null;
+    var fileName = null;
+    var mimeType = null;
+    var params = null;
+    var chunkedMode = true;
+    var headers = null;
+    if (options) {
+        fileKey = options.fileKey;
+        fileName = options.fileName;
+        mimeType = options.mimeType;
+        headers = options.headers;
+        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
+            chunkedMode = options.chunkedMode;
+        }
+        if (options.params) {
+            params = options.params;
+        }
+        else {
+            params = {};
+        }
+    }
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers]);
+};
+
+/**
+ * Downloads a file form a given URL and saves it to the specified directory.
+ * @param source {String}          URL of the server to receive the file
+ * @param target {String}         Full path of the file on the device
+ * @param successCallback (Function}  Callback to be invoked when upload has completed
+ * @param errorCallback {Function}    Callback to be invoked upon error
+ */
+FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
+    // sanity parameter checking
+    if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
+    var win = function(result) {
+        var entry = null;
+        if (result.isDirectory) {
+            entry = new (require('cordova/plugin/DirectoryEntry'))();
+        }
+        else if (result.isFile) {
+            entry = new (require('cordova/plugin/FileEntry'))();
+        }
+        entry.isDirectory = result.isDirectory;
+        entry.isFile = result.isFile;
+        entry.name = result.name;
+        entry.fullPath = result.fullPath;
+        successCallback(entry);
+    };
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
+};
+
+module.exports = FileTransfer;
+
+});
+
+// file: lib/common/plugin/FileTransferError.js
+define("cordova/plugin/FileTransferError", function(require, exports, module) {
+/**
+ * FileTransferError
+ * @constructor
+ */
+var FileTransferError = function(code, source, target, status) {
+    this.code = code || null;
+    this.source = source || null;
+    this.target = target || null;
+    this.http_status = status || null;
+};
+
+FileTransferError.FILE_NOT_FOUND_ERR = 1;
+FileTransferError.INVALID_URL_ERR = 2;
+FileTransferError.CONNECTION_ERR = 3;
+
+module.exports = FileTransferError;
+
+});
+
+// file: lib/common/plugin/FileUploadOptions.js
+define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
+/**
+ * Options to customize the HTTP request used to upload files.
+ * @constructor
+ * @param fileKey {String}   Name of file request parameter.
+ * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
+ * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
+ * @param params {Object}    Object with key: value params to send to the server.
+ * @param headers {Object}   Keys are header names, values are header values. Multiple
+ *                           headers of the same name are not supported.
+ */
+var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {
+    this.fileKey = fileKey || null;
+    this.fileName = fileName || null;
+    this.mimeType = mimeType || null;
+    this.params = params || null;
+    this.headers = headers || null;
+};
+
+module.exports = FileUploadOptions;
+
+});
+
+// file: lib/common/plugin/FileUploadResult.js
+define("cordova/plugin/FileUploadResult", function(require, exports, module) {
+/**
+ * FileUploadResult
+ * @constructor
+ */
+var FileUploadResult = function() {
+    this.bytesSent = 0;
+    this.responseCode = null;
+    this.response = null;
+};
+
+module.exports = FileUploadResult;
+});
+
+// file: lib/common/plugin/FileWriter.js
+define("cordova/plugin/FileWriter", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class writes to the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To write to the SD card, the file name is "sdcard/my_file.txt"
+ *
+ * @constructor
+ * @param file {File} File object containing file properties
+ * @param append if true write to the end of the file, otherwise overwrite the file
+ */
+var FileWriter = function(file) {
+    this.fileName = "";
+    this.length = 0;
+    if (file) {
+        this.fileName = file.fullPath || file;
+        this.length = file.size || 0;
+    }
+    // default is to write at the beginning of the file
+    this.position = 0;
+
+    this.readyState = 0; // EMPTY
+
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onwritestart = null;   // When writing starts
+    this.onprogress = null;     // While writing the file, and reporting partial file data
+    this.onwrite = null;        // When the write has successfully completed.
+    this.onwriteend = null;     // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
+    this.onerror = null;        // When the write has failed (see errors).
+};
+
+// States
+FileWriter.INIT = 0;
+FileWriter.WRITING = 1;
+FileWriter.DONE = 2;
+
+/**
+ * Abort writing file.
+ */
+FileWriter.prototype.abort = function() {
+    // check for invalid state
+    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // set error
+    this.error = new FileError(FileError.ABORT_ERR);
+
+    this.readyState = FileWriter.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === "function") {
+        this.onabort(new ProgressEvent("abort", {"target":this}));
+    }
+
+    // If write end callback
+    if (typeof this.onwriteend === "function") {
+        this.onwriteend(new ProgressEvent("writeend", {"target":this}));
+    }
+};
+
+/**
+ * Writes data to the file
+ *
+ * @param text to be written
+ */
+FileWriter.prototype.write = function(text) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":me}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // position always increases by bytes written because file would be extended
+            me.position += r;
+            // The length of the file is now where we are done writing.
+
+            me.length = me.position;
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "write", [this.fileName, text, this.position]);
+};
+
+/**
+ * Moves the file pointer to the location specified.
+ *
+ * If the offset is a negative number the position of the file
+ * pointer is rewound.  If the offset is greater than the file
+ * size the position is set to the end of the file.
+ *
+ * @param offset is the location to move the file pointer to.
+ */
+FileWriter.prototype.seek = function(offset) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    if (!offset && offset !== 0) {
+        return;
+    }
+
+    // See back from end of file.
+    if (offset < 0) {
+        this.position = Math.max(offset + this.length, 0);
+    }
+    // Offset is bigger then file size so set position
+    // to the end of the file.
+    else if (offset > this.length) {
+        this.position = this.length;
+    }
+    // Offset is between 0 and file size so set the position
+    // to start writing.
+    else {
+        this.position = offset;
+    }
+};
+
+/**
+ * Truncates the file to the size specified.
+ *
+ * @param size to chop the file at.
+ */
+FileWriter.prototype.truncate = function(size) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":this}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Update the length of the file
+            me.length = r;
+            me.position = Math.min(me.position, r);
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "truncate", [this.fileName, size]);
+};
+
+module.exports = FileWriter;
+
+});
+
+// file: lib/common/plugin/Flags.js
+define("cordova/plugin/Flags", function(require, exports, module) {
+/**
+ * Supplies arguments to methods that lookup or create files and directories.
+ *
+ * @param create
+ *            {boolean} file or directory if it doesn't exist
+ * @param exclusive
+ *            {boolean} used with create; if true the command will fail if
+ *            target path exists
+ */
+function Flags(create, exclusive) {
+    this.create = create || false;
+    this.exclusive = exclusive || false;
+}
+
+module.exports = Flags;
+});
+
+// file: lib/common/plugin/LocalFileSystem.js
+define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Represents a local file system.
+ */
+var LocalFileSystem = function() {
+
+};
+
+LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
+LocalFileSystem.PERSISTENT = 1; //persistent
+
+module.exports = LocalFileSystem;
+});
+
+// file: lib/common/plugin/Media.js
+define("cordova/plugin/Media", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+var mediaObjects = {};
+
+/**
+ * This class provides access to the device media, interfaces to both sound and video
+ *
+ * @constructor
+ * @param src                   The file name or url to play
+ * @param successCallback       The callback to be called when the file is done playing or recording.
+ *                                  successCallback()
+ * @param errorCallback         The callback to be called if there is an error.
+ *                                  errorCallback(int errorCode) - OPTIONAL
+ * @param statusCallback        The callback to be called when media status has changed.
+ *                                  statusCallback(int statusCode) - OPTIONAL
+ */
+var Media = function(src, successCallback, errorCallback, statusCallback) {
+
+    // successCallback optional
+    if (successCallback && (typeof successCallback !== "function")) {
+        console.log("Media Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Media Error: errorCallback is not a function");
+        return;
+    }
+
+    // statusCallback optional
+    if (statusCallback && (typeof statusCallback !== "function")) {
+        console.log("Media Error: statusCallback is not a function");
+        return;
+    }
+
+    this.id = utils.createUUID();
+    mediaObjects[this.id] = this;
+    this.src = src;
+    this.successCallback = successCallback;
+    this.errorCallback = errorCallback;
+    this.statusCallback = statusCallback;
+    this._duration = -1;
+    this._position = -1;
+    exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
+};
+
+// Media messages
+Media.MEDIA_STATE = 1;
+Media.MEDIA_DURATION = 2;
+Media.MEDIA_POSITION = 3;
+Media.MEDIA_ERROR = 9;
+
+// Media states
+Media.MEDIA_NONE = 0;
+Media.MEDIA_STARTING = 1;
+Media.MEDIA_RUNNING = 2;
+Media.MEDIA_PAUSED = 3;
+Media.MEDIA_STOPPED = 4;
+Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"];
+
+// "static" function to return existing objs.
+Media.get = function(id) {
+    return mediaObjects[id];
+};
+
+/**
+ * Start or resume playing audio file.
+ */
+Media.prototype.play = function(options) {
+    exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]);
+};
+
+/**
+ * Stop playing audio file.
+ */
+Media.prototype.stop = function() {
+    var me = this;
+    exec(function() {
+        me._position = 0;
+        me.successCallback();
+    }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
+};
+
+/**
+ * Seek or jump to a new time in the track..
+ */
+Media.prototype.seekTo = function(milliseconds) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+    }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]);
+};
+
+/**
+ * Pause playing audio file.
+ */
+Media.prototype.pause = function() {
+    exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]);
+};
+
+/**
+ * Get duration of an audio file.
+ * The duration is only set for audio that is playing, paused or stopped.
+ *
+ * @return      duration or -1 if not known.
+ */
+Media.prototype.getDuration = function() {
+    return this._duration;
+};
+
+/**
+ * Get position of audio.
+ */
+Media.prototype.getCurrentPosition = function(success, fail) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+        success(p);
+    }, fail, "Media", "getCurrentPositionAudio", [this.id]);
+};
+
+/**
+ * Start recording audio file.
+ */
+Media.prototype.startRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+};
+
+/**
+ * Stop recording audio file.
+ */
+Media.prototype.stopRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
+};
+
+/**
+ * Release the resources.
+ */
+Media.prototype.release = function() {
+    exec(null, this.errorCallback, "Media", "release", [this.id]);
+};
+
+/**
+ * Adjust the volume.
+ */
+Media.prototype.setVolume = function(volume) {
+    exec(null, null, "Media", "setVolume", [this.id, volume]);
+};
+
+/**
+ * Audio has status update.
+ * PRIVATE
+ *
+ * @param id            The media object id (string)
+ * @param status        The status code (int)
+ * @param msg           The status message (string)
+ */
+Media.onStatus = function(id, msg, value) {
+    var media = mediaObjects[id];
+    // If state update
+    if (msg === Media.MEDIA_STATE) {
+        if (value === Media.MEDIA_STOPPED) {
+            if (media.successCallback) {
+                media.successCallback();
+            }
+        }
+        if (media.statusCallback) {
+            media.statusCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_DURATION) {
+        media._duration = value;
+    }
+    else if (msg === Media.MEDIA_ERROR) {
+        if (media.errorCallback) {
+            // value should be a MediaError object when msg == MEDIA_ERROR
+            media.errorCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_POSITION) {
+        media._position = value;
+    }
+};
+
+module.exports = Media;
+});
+
+// file: lib/common/plugin/MediaError.js
+define("cordova/plugin/MediaError", function(require, exports, module) {
+/**
+ * This class contains information about any Media errors.
+ * @constructor
+ */
+var MediaError = function(code, msg) {
+    this.code = (code !== undefined ? code : null);
+    this.message = msg || "";
+};
+
+MediaError.MEDIA_ERR_NONE_ACTIVE    = 0;
+MediaError.MEDIA_ERR_ABORTED        = 1;
+MediaError.MEDIA_ERR_NETWORK        = 2;
+MediaError.MEDIA_ERR_DECODE         = 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+
+module.exports = MediaError;
+});
+
+// file: lib/common/plugin/MediaFile.js
+define("cordova/plugin/MediaFile", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    File = require('cordova/plugin/File'),
+    CaptureError = require('cordova/plugin/CaptureError');
+/**
+ * Represents a single file.
+ *
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+var MediaFile = function(name, fullPath, type, lastModifiedDate, size){
+    MediaFile.__super__.constructor.apply(this, arguments);
+};
+
+utils.extend(MediaFile, File);
+
+/**
+ * Request capture format data for a specific file and type
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ */
+MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
+    if (typeof this.fullPath === "undefined" || this.fullPath === null) {
+        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
+    } else {
+        exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]);
+    }
+};
+
+// TODO: can we axe this?
+/**
+ * Casts a PluginResult message property  (array of objects) to an array of MediaFile objects
+ * (used in Objective-C and Android)
+ *
+ * @param {PluginResult} pluginResult
+ */
+MediaFile.cast = function(pluginResult) {
+    var mediaFiles = [];
+    for (var i=0; i<pluginResult.message.length; i++) {
+        var mediaFile = new MediaFile();
+        mediaFile.name = pluginResult.message[i].name;
+        mediaFile.fullPath = pluginResult.message[i].fullPath;
+        mediaFile.type = pluginResult.message[i].type;
+        mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
+        mediaFile.size = pluginResult.message[i].size;
+        mediaFiles.push(mediaFile);
+    }
+    pluginResult.message = mediaFiles;
+    return pluginResult;
+};
+
+module.exports = MediaFile;
+
+});
+
+// file: lib/common/plugin/MediaFileData.js
+define("cordova/plugin/MediaFileData", function(require, exports, module) {
+/**
+ * MediaFileData encapsulates format information of a media file.
+ *
+ * @param {DOMString} codecs
+ * @param {long} bitrate
+ * @param {long} height
+ * @param {long} width
+ * @param {float} duration
+ */
+var MediaFileData = function(codecs, bitrate, height, width, duration){
+    this.codecs = codecs || null;
+    this.bitrate = bitrate || 0;
+    this.height = height || 0;
+    this.width = width || 0;
+    this.duration = duration || 0;
+};
+
+module.exports = MediaFileData;
+});
+
+// file: lib/common/plugin/Metadata.js
+define("cordova/plugin/Metadata", function(require, exports, module) {
+/**
+ * Information about the state of the file or directory
+ *
+ * {Date} modificationTime (readonly)
+ */
+var Metadata = function(time) {
+    this.modificationTime = (typeof time != 'undefined'?new Date(time):null);
+};
+
+module.exports = Metadata;
+});
+
+// file: lib/common/plugin/Position.js
+define("cordova/plugin/Position", function(require, exports, module) {
+var Coordinates = require('cordova/plugin/Coordinates');
+
+var Position = function(coords, timestamp) {
+    if (coords) {
+        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
+    } else {
+        this.coords = new Coordinates();
+    }
+    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
+};
+
+module.exports = Position;
+
+});
+
+// file: lib/common/plugin/PositionError.js
+define("cordova/plugin/PositionError", function(require, exports, module) {
+/**
+ * Position error object
+ *
+ * @constructor
+ * @param code
+ * @param message
+ */
+var PositionError = function(code, message) {
+    this.code = code || null;
+    this.message = message || '';
+};
+
+PositionError.PERMISSION_DENIED = 1;
+PositionError.POSITION_UNAVAILABLE = 2;
+PositionError.TIMEOUT = 3;
+
+module.exports = PositionError;
+});
+
+// file: lib/common/plugin/ProgressEvent.js
+define("cordova/plugin/ProgressEvent", function(require, exports, module) {
+// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
+// Feature test: See if we can instantiate a native ProgressEvent;
+// if so, use that approach,
+// otherwise fill-in with our own implementation.
+//
+// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
+var ProgressEvent = (function() {
+    /*
+    var createEvent = function(data) {
+        var event = document.createEvent('Events');
+        event.initEvent('ProgressEvent', false, false);
+        if (data) {
+            for (var i in data) {
+                if (data.hasOwnProperty(i)) {
+                    event[i] = data[i];
+                }
+            }
+            if (data.target) {
+                // TODO: cannot call <some_custom_object>.dispatchEvent
+                // need to first figure out how to implement EventTarget
+            }
+        }
+        return event;
+    };
+    try {
+        var ev = createEvent({type:"abort",target:document});
+        return function ProgressEvent(type, data) {
+            data.type = type;
+            return createEvent(data);
+        };
+    } catch(e){
+    */
+        return function ProgressEvent(type, dict) {
+            this.type = type;
+            this.bubbles = false;
+            this.cancelBubble = false;
+            this.cancelable = false;
+            this.lengthComputable = false;
+            this.loaded = dict && dict.loaded ? dict.loaded : 0;
+            this.total = dict && dict.total ? dict.total : 0;
+            this.target = dict && dict.target ? dict.target : null;
+        };
+    //}
+})();
+
+module.exports = ProgressEvent;
+});
+
+// file: lib/common/plugin/accelerometer.js
+define("cordova/plugin/accelerometer", function(require, exports, module) {
+/**
+ * This class provides access to device accelerometer data.
+ * @constructor
+ */
+var utils = require("cordova/utils"),
+    exec = require("cordova/exec"),
+    Acceleration = require('cordova/plugin/Acceleration');
+
+// Is the accel sensor running?
+var running = false;
+
+// Keeps reference to watchAcceleration calls.
+var timers = {};
+
+// Array of listeners; used to keep track of when we should call start and stop.
+var listeners = [];
+
+// Last returned acceleration object from native
+var accel = null;
+
+// Tells native to start.
+function start() {
+    exec(function(a) {
+        var tempListeners = listeners.slice(0);
+        accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].win(accel);
+        }
+    }, function(e) {
+        var tempListeners = listeners.slice(0);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].fail(e);
+        }
+    }, "Accelerometer", "start", []);
+    running = true;
+}
+
+// Tells native to stop.
+function stop() {
+    exec(null, null, "Accelerometer", "stop", []);
+    running = false;
+}
+
+// Adds a callback pair to the listeners array
+function createCallbackPair(win, fail) {
+    return {win:win, fail:fail};
+}
+
+// Removes a win/fail listener pair from the listeners array
+function removeListeners(l) {
+    var idx = listeners.indexOf(l);
+    if (idx > -1) {
+        listeners.splice(idx, 1);
+        if (listeners.length === 0) {
+            stop();
+        }
+    }
+}
+
+var accelerometer = {
+    /**
+     * Asynchronously aquires the current acceleration.
+     *
+     * @param {Function} successCallback    The function to call when the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     */
+    getCurrentAcceleration: function(successCallback, errorCallback, options) {
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "getCurrentAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        var p;
+        var win = function(a) {
+            removeListeners(p);
+            successCallback(a);
+        };
+        var fail = function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        };
+
+        p = createCallbackPair(win, fail);
+        listeners.push(p);
+
+        if (!running) {
+            start();
+        }
+    },
+
+    /**
+     * Asynchronously aquires the acceleration repeatedly at a given interval.
+     *
+     * @param {Function} successCallback    The function to call each time the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchAcceleration: function(successCallback, errorCallback, options) {
+        // Default interval (10 sec)
+        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
+
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "watchAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        // Keep reference to watch id, and report accel readings as often as defined in frequency
+        var id = utils.createUUID();
+
+        var p = createCallbackPair(function(){}, function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        });
+        listeners.push(p);
+
+        timers[id] = {
+            timer:window.setInterval(function() {
+                if (accel) {
+                    successCallback(accel);
+                }
+            }, frequency),
+            listeners:p
+        };
+
+        if (running) {
+            // If we're already running then immediately invoke the success callback
+            // but only if we have retreived a value, sample code does not check for null ...
+            if(accel) {
+                successCallback(accel);
+            }
+        } else {
+            start();
+        }
+
+        return id;
+    },
+
+    /**
+     * Clears the specified accelerometer watch.
+     *
+     * @param {String} id       The id of the watch returned from #watchAcceleration.
+     */
+    clearWatch: function(id) {
+        // Stop javascript timer & remove from timer list
+        if (id && timers[id]) {
+            window.clearInterval(timers[id].timer);
+            removeListeners(timers[id].listeners);
+            delete timers[id];
+        }
+    }
+};
+
+module.exports = accelerometer;
+
+});
+
+// file: lib/common/plugin/battery.js
+define("cordova/plugin/battery", function(require, exports, module) {
+/**
+ * This class contains information about the current battery status.
+ * @constructor
+ */
+var cordova = require('cordova'),
+    exec = require('cordova/exec');
+
+function handlers() {
+  return battery.channels.batterystatus.numHandlers +
+         battery.channels.batterylow.numHandlers +
+         battery.channels.batterycritical.numHandlers;
+}
+
+var Battery = function() {
+    this._level = null;
+    this._isPlugged = null;
+    // Create new event handlers on the window (returns a channel instance)
+    var subscriptionEvents = {
+      onSubscribe:this.onSubscribe,
+      onUnsubscribe:this.onUnsubscribe
+    };
+    this.channels = {
+      batterystatus:cordova.addWindowEventHandler("batterystatus", subscriptionEvents),
+      batterylow:cordova.addWindowEventHandler("batterylow", subscriptionEvents),
+      batterycritical:cordova.addWindowEventHandler("batterycritical", subscriptionEvents)
+    };
+};
+/**
+ * Event handlers for when callbacks get registered for the battery.
+ * Keep track of how many handlers we have so we can start and stop the native battery listener
+ * appropriately (and hopefully save on battery life!).
+ */
+Battery.prototype.onSubscribe = function() {
+  var me = battery;
+  // If we just registered the first handler, make sure native listener is started.
+  if (handlers() === 1) {
+    exec(me._status, me._error, "Battery", "start", []);
+  }
+};
+
+Battery.prototype.onUnsubscribe = function() {
+  var me = battery;
+
+  // If we just unregistered the last handler, make sure native listener is stopped.
+  if (handlers() === 0) {
+      exec(null, null, "Battery", "stop", []);
+  }
+};
+
+/**
+ * Callback for battery status
+ *
+ * @param {Object} info            keys: level, isPlugged
+ */
+Battery.prototype._status = function(info) {
+    if (info) {
+        var me = battery;
+    var level = info.level;
+        if (me._level !== level || me._isPlugged !== info.isPlugged) {
+            // Fire batterystatus event
+            cordova.fireWindowEvent("batterystatus", info);
+
+            // Fire low battery event
+            if (level === 20 || level === 5) {
+                if (level === 20) {
+                    cordova.fireWindowEvent("batterylow", info);
+                }
+                else {
+                    cordova.fireWindowEvent("batterycritical", info);
+                }
+            }
+        }
+        me._level = level;
+        me._isPlugged = info.isPlugged;
+    }
+};
+
+/**
+ * Error callback for battery start
+ */
+Battery.prototype._error = function(e) {
+    console.log("Error initializing Battery: " + e);
+};
+
+var battery = new Battery();
+
+module.exports = battery;
+});
+
+// file: lib/common/plugin/capture.js
+define("cordova/plugin/capture", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    MediaFile = require('cordova/plugin/MediaFile');
+
+/**
+ * Launches a capture of different types.
+ *
+ * @param (DOMString} type
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+function _capture(type, successCallback, errorCallback, options) {
+    var win = function(pluginResult) {
+        var mediaFiles = [];
+        var i;
+        for (i = 0; i < pluginResult.length; i++) {
+            var mediaFile = new MediaFile();
+            mediaFile.name = pluginResult[i].name;
+            mediaFile.fullPath = pluginResult[i].fullPath;
+            mediaFile.type = pluginResult[i].type;
+            mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
+            mediaFile.size = pluginResult[i].size;
+            mediaFiles.push(mediaFile);
+        }
+        successCallback(mediaFiles);
+    };
+    exec(win, errorCallback, "Capture", type, [options]);
+}
+/**
+ * The Capture interface exposes an interface to the camera and microphone of the hosting device.
+ */
+function Capture() {
+    this.supportedAudioModes = [];
+    this.supportedImageModes = [];
+    this.supportedVideoModes = [];
+}
+
+/**
+ * Launch audio recorder application for recording audio clip(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureAudioOptions} options
+ */
+Capture.prototype.captureAudio = function(successCallback, errorCallback, options){
+    _capture("captureAudio", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch camera application for taking image(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureImageOptions} options
+ */
+Capture.prototype.captureImage = function(successCallback, errorCallback, options){
+    _capture("captureImage", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch device camera application for recording video(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+Capture.prototype.captureVideo = function(successCallback, errorCallback, options){
+    _capture("captureVideo", successCallback, errorCallback, options);
+};
+
+
+module.exports = new Capture();
+
+});
+
+// file: lib/common/plugin/compass.js
+define("cordova/plugin/compass", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    utils = require('cordova/utils'),
+    CompassHeading = require('cordova/plugin/CompassHeading'),
+    CompassError = require('cordova/plugin/CompassError'),
+    timers = {},
+    compass = {
+        /**
+         * Asynchronously acquires the current heading.
+         * @param {Function} successCallback The function to call when the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {CompassOptions} options The options for getting the heading data (not used).
+         */
+        getCurrentHeading:function(successCallback, errorCallback, options) {
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var win = function(result) {
+                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
+                successCallback(ch);
+            };
+            var fail = function(code) {
+                var ce = new CompassError(code);
+                errorCallback(ce);
+            };
+
+            // Get heading
+            exec(win, fail, "Compass", "getHeading", [options]);
+        },
+
+        /**
+         * Asynchronously acquires the heading repeatedly at a given interval.
+         * @param {Function} successCallback The function to call each time the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {HeadingOptions} options The options for getting the heading data
+         * such as timeout and the frequency of the watch. For iOS, filter parameter
+         * specifies to watch via a distance filter rather than time.
+         */
+        watchHeading:function(successCallback, errorCallback, options) {
+            // Default interval (100 msec)
+            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
+            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
+
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var id = utils.createUUID();
+            if (filter > 0) {
+                // is an iOS request for watch by filter, no timer needed
+                timers[id] = "iOS";
+                compass.getCurrentHeading(successCallback, errorCallback, options);
+            } else {
+                // Start watch timer to get headings
+                timers[id] = window.setInterval(function() {
+                    compass.getCurrentHeading(successCallback, errorCallback);
+                }, frequency);
+            }
+
+            return id;
+        },
+
+        /**
+         * Clears the specified heading watch.
+         * @param {String} watchId The ID of the watch returned from #watchHeading.
+         */
+        clearWatch:function(id) {
+            // Stop javascript timer & remove from timer list
+            if (id && timers[id]) {
+                if (timers[id] != "iOS") {
+                      clearInterval(timers[id]);
+                  } else {
+                    // is iOS watch by filter so call into device to stop
+                    exec(null, null, "Compass", "stopHeading", []);
+                }
+                delete timers[id];
+            }
+        }
+    };
+
+module.exports = compass;
+});
+
+// file: lib/common/plugin/console-via-logger.js
+define("cordova/plugin/console-via-logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+
+var logger = require("cordova/plugin/logger");
+var utils  = require("cordova/utils");
+
+//------------------------------------------------------------------------------
+// object that we're exporting
+//------------------------------------------------------------------------------
+var console = module.exports;
+
+//------------------------------------------------------------------------------
+// copy of the original console object
+//------------------------------------------------------------------------------
+var WinConsole = window.console;
+
+//------------------------------------------------------------------------------
+// whether to use the logger
+//------------------------------------------------------------------------------
+var UseLogger = false;
+
+//------------------------------------------------------------------------------
+// Timers
+//------------------------------------------------------------------------------
+var Timers = {};
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+function noop() {}
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+console.useLogger = function (value) {
+    if (arguments.length) UseLogger = !!value;
+
+    if (UseLogger) {
+        if (logger.useConsole()) {
+            throw new Error("console and logger are too intertwingly");
+        }
+    }
+
+    return UseLogger;
+};
+
+//------------------------------------------------------------------------------
+console.log = function() {
+    if (logger.useConsole()) return;
+    logger.log.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.error = function() {
+    if (logger.useConsole()) return;
+    logger.error.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.warn = function() {
+    if (logger.useConsole()) return;
+    logger.warn.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.info = function() {
+    if (logger.useConsole()) return;
+    logger.info.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.debug = function() {
+    if (logger.useConsole()) return;
+    logger.debug.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.assert = function(expression) {
+    if (expression) return;
+
+    var message = utils.vformat(arguments[1], [].slice.call(arguments, 2));
+    console.log("ASSERT: " + message);
+};
+
+//------------------------------------------------------------------------------
+console.clear = function() {};
+
+//------------------------------------------------------------------------------
+console.dir = function(object) {
+    console.log("%o", object);
+};
+
+//------------------------------------------------------------------------------
+console.dirxml = function(node) {
+    console.log(node.innerHTML);
+};
+
+//------------------------------------------------------------------------------
+console.trace = noop;
+
+//------------------------------------------------------------------------------
+console.group = console.log;
+
+//------------------------------------------------------------------------------
+console.groupCollapsed = console.log;
+
+//------------------------------------------------------------------------------
+console.groupEnd = noop;
+
+//------------------------------------------------------------------------------
+console.time = function(name) {
+    Timers[name] = new Date().valueOf();
+};
+
+//------------------------------------------------------------------------------
+console.timeEnd = function(name) {
+    var timeStart = Timers[name];
+    if (!timeStart) {
+        console.warn("unknown timer: " + name);
+        return;
+    }
+
+    var timeElapsed = new Date().valueOf() - timeStart;
+    console.log(name + ": " + timeElapsed + "ms");
+};
+
+//------------------------------------------------------------------------------
+console.timeStamp = noop;
+
+//------------------------------------------------------------------------------
+console.profile = noop;
+
+//------------------------------------------------------------------------------
+console.profileEnd = noop;
+
+//------------------------------------------------------------------------------
+console.count = noop;
+
+//------------------------------------------------------------------------------
+console.exception = console.log;
+
+//------------------------------------------------------------------------------
+console.table = function(data, columns) {
+    console.log("%o", data);
+};
+
+//------------------------------------------------------------------------------
+// return a new function that calls both functions passed as args
+//------------------------------------------------------------------------------
+function wrapperedOrigCall(orgFunc, newFunc) {
+    return function() {
+        var args = [].slice.call(arguments);
+        try { orgFunc.apply(WinConsole, args); } catch (e) {}
+        try { newFunc.apply(console,    args); } catch (e) {}
+    };
+}
+
+//------------------------------------------------------------------------------
+// For every function that exists in the original console object, that
+// also exists in the new console object, wrap the new console method
+// with one that calls both
+//------------------------------------------------------------------------------
+for (var key in console) {
+    if (typeof WinConsole[key] == "function") {
+        console[key] = wrapperedOrigCall(WinConsole[key], console[key]);
+    }
+}
+
+});
+
+// file: lib/common/plugin/contacts.js
+define("cordova/plugin/contacts", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+* Represents a group of Contacts.
+* @constructor
+*/
+var contacts = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     * @param fields that should be searched
+     * @param successCB success callback
+     * @param errorCB error callback
+     * @param {ContactFindOptions} options that can be applied to contact searching
+     * @return array of Contacts matching search criteria
+     */
+    find:function(fields, successCB, errorCB, options) {
+        if (!successCB) {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+        if (!fields || (utils.isArray(fields) && fields.length === 0)) {
+            if (typeof errorCB === "function") {
+                errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+        } else {
+            var win = function(result) {
+                var cs = [];
+                for (var i = 0, l = result.length; i < l; i++) {
+                    cs.push(contacts.create(result[i]));
+                }
+                successCB(cs);
+            };
+            exec(win, errorCB, "Contacts", "search", [fields, options]);
+        }
+    },
+
+    /**
+     * This function creates a new contact, but it does not persist the contact
+     * to device storage. To persist the contact to device storage, invoke
+     * contact.save().
+     * @param properties an object who's properties will be examined to create a new Contact
+     * @returns new Contact object
+     */
+    create:function(properties) {
+        var i;
+        var contact = new Contact();
+        for (i in properties) {
+            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
+                contact[i] = properties[i];
+            }
+        }
+        return contact;
+    }
+};
+
+module.exports = contacts;
+
+});
+
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+var channel = require('cordova/channel'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+/**
+ * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+    this.available = false;
+    this.platform = null;
+    this.version = null;
+    this.name = null;
+    this.uuid = null;
+    this.cordova = null;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function(info) {
+            me.available = true;
+            me.platform = info.platform;
+            me.version = info.version;
+            me.name = info.name;
+            me.uuid = info.uuid;
+            me.cordova = info.cordova;
+            channel.onCordovaInfoReady.fire();
+        },function(e) {
+            me.available = false;
+            utils.alert("[ERROR] Error initializing Cordova: " + e);
+        });
+    });
+}
+
+/**
+ * Get device info
+ *
+ * @param {Function} successCallback The function to call when the heading data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
+ */
+Device.prototype.getInfo = function(successCallback, errorCallback) {
+
+    // successCallback required
+    if (typeof successCallback !== "function") {
+        console.log("Device Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Device Error: errorCallback is not a function");
+        return;
+    }
+
+    // Get info
+    exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/common/plugin/geolocation.js
+define("cordova/plugin/geolocation", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    PositionError = require('cordova/plugin/PositionError'),
+    Position = require('cordova/plugin/Position');
+
+var timers = {};   // list of timers in use
+
+// Returns default params, overrides if provided with values
+function parseParameters(options) {
+    var opt = {
+        maximumAge: 0,
+        enableHighAccuracy: false,
+        timeout: Infinity
+    };
+
+    if (options) {
+        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
+            opt.maximumAge = options.maximumAge;
+        }
+        if (options.enableHighAccuracy !== undefined) {
+            opt.enableHighAccuracy = options.enableHighAccuracy;
+        }
+        if (options.timeout !== undefined && !isNaN(options.timeout)) {
+            if (options.timeout < 0) {
+                opt.timeout = 0;
+            } else {
+                opt.timeout = options.timeout;
+            }
+        }
+    }
+
+    return opt;
+}
+
+// Returns a timeout failure, closed over a specified timeout value and error callback.
+function createTimeout(errorCallback, timeout) {
+    var t = setTimeout(function() {
+        clearTimeout(t);
+        t = null;
+        errorCallback({
+            code:PositionError.TIMEOUT,
+            message:"Position retrieval timed out."
+        });
+    }, timeout);
+    return t;
+}
+
+var geolocation = {
+    lastPosition:null, // reference to last known (cached) position returned
+    /**
+   * Asynchronously aquires the current position.
+   *
+   * @param {Function} successCallback    The function to call when the position data is available
+   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)
+   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)
+   */
+    getCurrentPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("getCurrentPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        // Timer var that will fire an error callback if no position is retrieved from native
+        // before the "timeout" param provided expires
+        var timeoutTimer = null;
+
+        var win = function(p) {
+            clearTimeout(timeoutTimer);
+            if (!timeoutTimer) {
+                // Timeout already happened, or native fired error callback for
+                // this geo request.
+                // Don't continue with success callback.
+                return;
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+        var fail = function(e) {
+            clearTimeout(timeoutTimer);
+            timeoutTimer = null;
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
+        // fire the success callback with the cached position.
+        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
+            successCallback(geolocation.lastPosition);
+        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
+        } else if (options.timeout === 0) {
+            fail({
+                code:PositionError.TIMEOUT,
+                message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
+            });
+        // Otherwise we have to call into native to retrieve a position.
+        } else {
+            if (options.timeout !== Infinity) {
+                // If the timeout value was not set to Infinity (default), then
+                // set up a timeout function that will fire the error callback
+                // if no successful position was retrieved before timeout expired.
+                timeoutTimer = createTimeout(fail, options.timeout);
+            } else {
+                // This is here so the check in the win function doesn't mess stuff up
+                // may seem weird but this guarantees timeoutTimer is
+                // always truthy before we call into native
+                timeoutTimer = true;
+            }
+            exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
+        }
+        return timeoutTimer;
+    },
+    /**
+     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,
+     * the successCallback is called with the new location.
+     *
+     * @param {Function} successCallback    The function to call each time the location data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)
+     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("watchPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        var id = utils.createUUID();
+
+        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
+        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
+
+        var fail = function(e) {
+            clearTimeout(timers[id]);
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        var win = function(p) {
+            clearTimeout(timers[id]);
+            if (options.timeout !== Infinity) {
+                timers[id] = createTimeout(fail, options.timeout);
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+
+        exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
+
+        return id;
+    },
+    /**
+     * Clears the specified heading watch.
+     *
+     * @param {String} id       The ID of the watch returned from #watchPosition
+     */
+    clearWatch:function(id) {
+        if (id && timers[id] !== undefined) {
+            clearTimeout(timers[id]);
+            delete timers[id];
+            exec(null, null, "Geolocation", "clearWatch", [id]);
+        }
+    }
+};
+
+module.exports = geolocation;
+
+});
+
+// file: lib/common/plugin/logger.js
+define("cordova/plugin/logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+// The logger module exports the following properties/functions:
+//
+// LOG                          - constant for the level LOG
+// ERROR                        - constant for the level ERROR
+// WARN                         - constant for the level WARN
+// INFO                         - constant for the level INFO
+// DEBUG                        - constant for the level DEBUG
+// logLevel()                   - returns current log level
+// logLevel(value)              - sets and returns a new log level
+// useConsole()                 - returns whether logger is using console
+// useConsole(value)            - sets and returns whether logger is using console
+// log(message,...)             - logs a message at level LOG
+// error(message,...)           - logs a message at level ERROR
+// warn(message,...)            - logs a message at level WARN
+// info(message,...)            - logs a message at level INFO
+// debug(message,...)           - logs a message at level DEBUG
+// logLevel(level,message,...)  - logs a message specified level
+//
+//------------------------------------------------------------------------------
+
+var logger = exports;
+
+var exec    = require('cordova/exec');
+var utils   = require('cordova/utils');
+
+var UseConsole   = true;
+var Queued       = [];
+var DeviceReady  = false;
+var CurrentLevel;
+
+/**
+ * Logging levels
+ */
+
+var Levels = [
+    "LOG",
+    "ERROR",
+    "WARN",
+    "INFO",
+    "DEBUG"
+];
+
+/*
+ * add the logging levels to the logger object and
+ * to a separate levelsMap object for testing
+ */
+
+var LevelsMap = {};
+for (var i=0; i<Levels.length; i++) {
+    var level = Levels[i];
+    LevelsMap[level] = i;
+    logger[level]    = level;
+}
+
+CurrentLevel = LevelsMap.WARN;
+
+/**
+ * Getter/Setter for the logging level
+ *
+ * Returns the current logging level.
+ *
+ * When a value is passed, sets the logging level to that value.
+ * The values should be one of the following constants:
+ *    logger.LOG
+ *    logger.ERROR
+ *    logger.WARN
+ *    logger.INFO
+ *    logger.DEBUG
+ *
+ * The value used determines which messages get printed.  The logging
+ * values above are in order, and only messages logged at the logging
+ * level or above will actually be displayed to the user.  Eg, the
+ * default level is WARN, so only messages logged with LOG, ERROR, or
+ * WARN will be displayed; INFO and DEBUG messages will be ignored.
+ */
+logger.level = function (value) {
+    if (arguments.length) {
+        if (LevelsMap[value] === null) {
+            throw new Error("invalid logging level: " + value);
+        }
+        CurrentLevel = LevelsMap[value];
+    }
+
+    return Levels[CurrentLevel];
+};
+
+/**
+ * Getter/Setter for the useConsole functionality
+ *
+ * When useConsole is true, the logger will log via the
+ * browser 'console' object.  Otherwise, it will use the
+ * native Logger plugin.
+ */
+logger.useConsole = function (value) {
+    if (arguments.length) UseConsole = !!value;
+
+    if (UseConsole) {
+        if (typeof console == "undefined") {
+            throw new Error("global console object is not defined");
+        }
+
+        if (typeof console.log != "function") {
+            throw new Error("global console object does not have a log function");
+        }
+
+        if (typeof console.useLogger == "function") {
+            if (console.useLogger()) {
+                throw new Error("console and logger are too intertwingly");
+            }
+        }
+    }
+
+    return UseConsole;
+};
+
+/**
+ * Logs a message at the LOG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.log   = function(message) { logWithArgs("LOG",   arguments); };
+
+/**
+ * Logs a message at the ERROR level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.error = function(message) { logWithArgs("ERROR", arguments); };
+
+/**
+ * Logs a message at the WARN level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.warn  = function(message) { logWithArgs("WARN",  arguments); };
+
+/**
+ * Logs a message at the INFO level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.info  = function(message) { logWithArgs("INFO",  arguments); };
+
+/**
+ * Logs a message at the DEBUG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.debug = function(message) { logWithArgs("DEBUG", arguments); };
+
+// log at the specified level with args
+function logWithArgs(level, args) {
+    args = [level].concat([].slice.call(args));
+    logger.logLevel.apply(logger, args);
+}
+
+/**
+ * Logs a message at the specified level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.logLevel = function(level, message /* , ... */) {
+    // format the message with the parameters
+    var formatArgs = [].slice.call(arguments, 2);
+    message    = utils.vformat(message, formatArgs);
+
+    if (LevelsMap[level] === null) {
+        throw new Error("invalid logging level: " + level);
+    }
+
+    if (LevelsMap[level] > CurrentLevel) return;
+
+    // queue the message if not yet at deviceready
+    if (!DeviceReady && !UseConsole) {
+        Queued.push([level, message]);
+        return;
+    }
+
+    // if not using the console, use the native logger
+    if (!UseConsole) {
+        exec(null, null, "Logger", "logLevel", [level, message]);
+        return;
+    }
+
+    // make sure console is not using logger
+    if (console.__usingCordovaLogger) {
+        throw new Error("console and logger are too intertwingly");
+    }
+
+    // log to the console
+    switch (level) {
+        case logger.LOG:   console.log(message); break;
+        case logger.ERROR: console.log("ERROR: " + message); break;
+        case logger.WARN:  console.log("WARN: "  + message); break;
+        case logger.INFO:  console.log("INFO: "  + message); break;
+        case logger.DEBUG: console.log("DEBUG: " + message); break;
+    }
+};
+
+// when deviceready fires, log queued messages
+logger.__onDeviceReady = function() {
+    if (DeviceReady) return;
+
+    DeviceReady = true;
+
+    for (var i=0; i<Queued.length; i++) {
+        var messageArgs = Queued[i];
+        logger.logLevel(messageArgs[0], messageArgs[1]);
+    }
+
+    Queued = null;
+};
+
+// add a deviceready event to log queued messages
+document.addEventListener("deviceready", logger.__onDeviceReady, false);
+
+});
+
+// file: lib/common/plugin/network.js
+define("cordova/plugin/network", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    cordova = require('cordova'),
+    channel = require('cordova/channel');
+
+var NetworkConnection = function () {
+    this.type = null;
+    this._firstRun = true;
+    this._timer = null;
+    this.timeout = 500;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function (info) {
+            me.type = info;
+            if (info === "none") {
+                // set a timer if still offline at the end of timer send the offline event
+                me._timer = setTimeout(function(){
+                    cordova.fireDocumentEvent("offline");
+                    me._timer = null;
+                    }, me.timeout);
+            } else {
+                // If there is a current offline event pending clear it
+                if (me._timer !== null) {
+                    clearTimeout(me._timer);
+                    me._timer = null;
+                }
+                cordova.fireDocumentEvent("online");
+            }
+
+            // should only fire this once
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+        },
+        function (e) {
+            // If we can't get the network info we should still tell Cordova
+            // to fire the deviceready event.
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+            console.log("Error initializing Network Connection: " + e);
+        });
+    });
+};
+
+/**
+ * Get connection info
+ *
+ * @param {Function} successCallback The function to call when the Connection data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)
+ */
+NetworkConnection.prototype.getInfo = function (successCallback, errorCallback) {
+    // Get info
+    exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
+};
+
+module.exports = new NetworkConnection();
+});
+
+// file: lib/common/plugin/notification.js
+define("cordova/plugin/notification", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Provides access to notifications on the device.
+ */
+
+module.exports = {
+
+    /**
+     * Open a native alert dialog, with a customizable title and button text.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} completeCallback   The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Alert)
+     * @param {String} buttonLabel          Label of the close button (default: OK)
+     */
+    alert: function(message, completeCallback, title, buttonLabel) {
+        var _title = (title || "Alert");
+        var _buttonLabel = (buttonLabel || "OK");
+        exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]);
+    },
+
+    /**
+     * Open a native confirm dialog, with a customizable title and button text.
+     * The result that the user selects is returned to the result callback.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Confirm)
+     * @param {String} buttonLabels         Comma separated list of the labels of the buttons (default: 'OK,Cancel')
+     */
+    confirm: function(message, resultCallback, title, buttonLabels) {
+        var _title = (title || "Confirm");
+        var _buttonLabels = (buttonLabels || "OK,Cancel");
+        exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
+    },
+
+    /**
+     * Causes the device to vibrate.
+     *
+     * @param {Integer} mills       The number of milliseconds to vibrate for.
+     */
+    vibrate: function(mills) {
+        exec(null, null, "Notification", "vibrate", [mills]);
+    },
+
+    /**
+     * Causes the device to beep.
+     * On Android, the default notification ringtone is played "count" times.
+     *
+     * @param {Integer} count       The number of beeps.
+     */
+    beep: function(count) {
+        exec(null, null, "Notification", "beep", [count]);
+    }
+};
+});
+
+// file: lib/common/plugin/requestFileSystem.js
+define("cordova/plugin/requestFileSystem", function(require, exports, module) {
+var FileError = require('cordova/plugin/FileError'),
+    FileSystem = require('cordova/plugin/FileSystem'),
+    exec = require('cordova/exec');
+
+/**
+ * Request a file system in which to store application data.
+ * @param type  local file system type
+ * @param size  indicates how much storage space, in bytes, the application expects to need
+ * @param successCallback  invoked with a FileSystem object
+ * @param errorCallback  invoked if error occurs retrieving file system
+ */
+var requestFileSystem = function(type, size, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    if (type < 0 || type > 3) {
+        fail(FileError.SYNTAX_ERR);
+    } else {
+        // if successful, return a FileSystem object
+        var success = function(file_system) {
+            if (file_system) {
+                if (typeof successCallback === 'function') {
+                    // grab the name and root from the file system object
+                    var result = new FileSystem(file_system.name, file_system.root);
+                    successCallback(result);
+                }
+            }
+            else {
+                // no FileSystem object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+        exec(success, fail, "File", "requestFileSystem", [type, size]);
+    }
+};
+
+module.exports = requestFileSystem;
+});
+
+// file: lib/common/plugin/resolveLocalFileSystemURI.js
+define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    FileError = require('cordova/plugin/FileError'),
+    exec = require('cordova/exec');
+
+/**
+ * Look up file system Entry referred to by local URI.
+ * @param {DOMString} uri  URI referring to a local file or directory
+ * @param successCallback  invoked with Entry object corresponding to URI
+ * @param errorCallback    invoked if error occurs retrieving file system entry
+ */
+module.exports = function(uri, successCallback, errorCallback) {
+    // error callback
+    var fail = function(error) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(error));
+        }
+    };
+    // sanity check for 'not:valid:filename'
+    if(!uri || uri.split(":").length > 2) {
+        setTimeout( function() {
+            fail(FileError.ENCODING_ERR);
+        },0);
+        return;
+    }
+    // if successful, return either a file or directory entry
+    var success = function(entry) {
+        var result;
+        if (entry) {
+            if (typeof successCallback === 'function') {
+                // create appropriate Entry object
+                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
+                try {
+                    successCallback(result);
+                }
+                catch (e) {
+                    console.log('Error invoking callback: ' + e);
+                }
+            }
+        }
+        else {
+            // no Entry object returned
+            fail(FileError.NOT_FOUND_ERR);
+        }
+    };
+
+    exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
+};
+
+});
+
+// file: lib/common/plugin/splashscreen.js
+define("cordova/plugin/splashscreen", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+var splashscreen = {
+    show:function() {
+        exec(null, null, "SplashScreen", "show", []);
+    },
+    hide:function() {
+        exec(null, null, "SplashScreen", "hide", []);
+    }
+};
+
+module.exports = splashscreen;
+});
+
+// file: lib/tizen/plugin/tizen/Accelerometer.js
+define("cordova/plugin/tizen/Accelerometer", function(require, exports, module) {
+var callback = null;
+
+module.exports = {
+    start: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+        callback = function (motion) {
+            successCallback({
+                x: motion.accelerationIncludingGravity.x,
+                y: motion.accelerationIncludingGravity.y,
+                z: motion.accelerationIncludingGravity.z,
+                timestamp: motion.timeStamp
+            });
+        };
+        window.addEventListener("devicemotion", callback);
+    },
+    stop: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+    }
+};
+});
+
+// file: lib/tizen/plugin/tizen/Battery.js
+define("cordova/plugin/tizen/Battery", function(require, exports, module) {
+/*global tizen:false */
+var id = null;
+
+module.exports = {
+    start: function(successCallback, errorCallback) {
+        var tizenSuccessCallback = function(power) {
+            if (successCallback) {
+                successCallback({level: Math.round(power.level * 100), isPlugged: power.isCharging});
+            }
+        };
+
+        if (id === null) {
+            id = tizen.systeminfo.addPropertyValueChangeListener("Power", tizenSuccessCallback);
+        }
+        tizen.systeminfo.getPropertyValue("Power", tizenSuccessCallback, errorCallback);
+    },
+
+    stop: function(successCallback, errorCallback) {
+        tizen.systeminfo.removePropertyValueChangeListener(id);
+        id = null;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Camera.js
+define("cordova/plugin/tizen/Camera", function(require, exports, module) {
+/*global tizen:false */
+var Camera = require('cordova/plugin/CameraConstants');
+
+function makeReplyCallback(successCallback, errorCallback) {
+    return {
+        onsuccess: function(reply) {
+            if (reply.length > 0) {
+                successCallback(reply[0].value);
+            } else {
+                errorCallback('Picture selection aborted');
+            }
+        },
+        onfail: function() {
+           console.log('The service launch failed');
+        }
+    };
+}
+
+module.exports = {
+    takePicture: function(successCallback, errorCallback, args) {
+        var destinationType = args[1],
+            sourceType = args[2],
+            encodingType = args[5],
+            mediaType = args[6];
+            // Not supported
+            /*
+            quality = args[0]
+            targetWidth = args[3]
+            targetHeight = args[4]
+            allowEdit = args[7]
+            correctOrientation = args[8]
+            saveToPhotoAlbum = args[9]
+            */
+
+        if (destinationType !== Camera.DestinationType.FILE_URI) {
+            errorCallback('DestinationType not supported');
+            return;
+        }
+        if (mediaType !== Camera.MediaType.PICTURE) {
+            errorCallback('MediaType not supported');
+            return;
+        }
+
+        var mimeType;
+        if (encodingType === Camera.EncodingType.JPEG) {
+            mimeType = 'image/jpeg';
+        } else if (encodingType === Camera.EncodingType.PNG) {
+            mimeType = 'image/png';
+        } else {
+            mimeType = 'image/*';
+        }
+
+        var serviceId;
+        if (sourceType === Camera.PictureSourceType.CAMERA) {
+            serviceId = 'http://tizen.org/appsvc/operation/create_content';
+        } else {
+            serviceId = 'http://tizen.org/appsvc/operation/pick';
+        }
+
+        var service = new tizen.ApplicationService(serviceId, null, mimeType, null);
+        tizen.application.launchService(service, null, null,
+                function(error) { errorCallback(error.message); },
+                makeReplyCallback(successCallback, errorCallback));
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Compass.js
+define("cordova/plugin/tizen/Compass", function(require, exports, module) {
+var CompassError = require('cordova/plugin/CompassError'),
+    callback = null, ready = false;
+
+module.exports = {
+    getHeading: function(successCallback, errorCallback) {
+        if (window.DeviceOrientationEvent !== undefined) {
+            callback = function (orientation) {
+                var heading = 360 - orientation.alpha;
+                if (ready) {
+                    successCallback({
+                        magneticHeading: heading,
+                        trueHeading: heading,
+                        headingAccuracy: 0,
+                        timestamp: orientation.timeStamp
+                    });
+                    window.removeEventListener("deviceorientation", callback);
+                }
+                ready = true;
+            };
+            ready = false; // workaround invalid first event value returned by WRT
+            window.addEventListener("deviceorientation", callback);
+        }
+        else {
+            errorCallback(CompassError.COMPASS_NOT_SUPPORTED);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Contact.js
+define("cordova/plugin/tizen/Contact", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// ------------------
+// Utility functions
+// ------------------
+
+
+/**
+ * Retrieves a Tizen Contact object from the device by its unique id.
+ *
+ * @param uid
+ *            Unique id of the contact on the device
+ * @return {tizen.Contact} Tizen Contact object or null if contact with
+ *         specified id is not found
+ */
+var findByUniqueId = function(id) {
+
+    if (!id) {
+        return null;
+    }
+
+    var tizenContact = null;
+
+    tizen.contact.getDefaultAddressBook().find(
+        function _successCallback(contacts){
+            tizenContact = contacts[0];
+        },
+        function _errorCallback(error){
+            console.log("tizen find error " + error);
+        },
+        new tizen.AttributeFilter('id', 'CONTAINS', id),
+        new tizen.SortMode('id', 'ASC'));
+
+    return tizenContact || null;
+};
+
+
+var traceTizenContact = function (tizenContact) {
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.id " + tizenContact.id);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.lastUpdated " + tizenContact.lastUpdated);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.name " + tizenContact.name);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.account " + tizenContact.account);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.addresses " + tizenContact.addresses);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.photoURI " + tizenContact.photoURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.phoneNumbers " + tizenContact.phoneNumbers);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.emails " + tizenContact.emails);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.birthday " + tizenContact.birthday);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.organization " + tizenContact.organization);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.notes " + tizenContact.notes);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.urls " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.isFavorite " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.ringtonesURI " + tizenContact.ringtonesURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.categories " + tizenContact.categories);
+};
+
+
+/**
+ * Creates a Tizen contact object from the W3C Contact object and persists
+ * it to device storage.
+ *
+ * @param {Contact}
+ *            contact The contact to save
+ * @return a new contact object with all properties set
+ */
+var saveToDevice = function(contact) {
+
+    if (!contact) {
+        return;
+    }
+
+    var tizenContact = null;
+    var update = false;
+    var i = 0;
+
+    // if the underlying Tizen Contact object already exists, retrieve it for
+    // update
+    if (contact.id) {
+        // we must attempt to retrieve the BlackBerry contact from the device
+        // because this may be an update operation
+        tizenContact = findByUniqueId(contact.id);
+    }
+
+    // contact not found on device, create a new one
+    if (!tizenContact) {
+        tizenContact = new tizen.Contact();
+    }
+    // update the existing contact
+    else {
+        update = true;
+    }
+
+    // NOTE: The user may be working with a partial Contact object, because only
+    // user-specified Contact fields are returned from a find operation (blame
+    // the W3C spec). If this is an update to an existing Contact, we don't
+    // want to clear an attribute from the contact database simply because the
+    // Contact object that the user passed in contains a null value for that
+    // attribute. So we only copy the non-null Contact attributes to the
+    // Tizen Contact object before saving.
+    //
+    // This means that a user must explicitly set a Contact attribute to a
+    // non-null value in order to update it in the contact database.
+    //
+    traceTizenContact (tizenContact);
+
+    // display name
+    if (contact.displayName !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            tizenContact.name.displayName = contact.displayName;
+        }
+    }
+
+    // name
+    if (contact.name !== null) {
+        if (contact.name.givenName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.firstName = contact.name.givenName;
+            }
+        }
+
+        if  (contact.name.middleName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.middleName = contact.name.middleName;
+            }
+        }
+
+        if (contact.name.familyName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.lastName = contact.name.familyName;
+            }
+        }
+
+        if (contact.name.honorificPrefix) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.prefix = contact.name.honorificPrefix;
+            }
+        }
+    }
+
+    // nickname
+    if (contact.nickname !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            if (!utils.isArray(tizenContact.name.nicknames))
+            {
+                tizenContact.name.nicknames = [];
+            }
+            tizenContact.name.nicknames[0] = contact.nickname;
+        }
+    }
+    else {
+        tizenContact.name.nicknames = [];
+    }
+
+    // note
+    if (contact.note !== null) {
+        if (tizenContact.note === null) {
+            tizenContact.note = [];
+        }
+        if (tizenContact.note !== null) {
+            tizenContact.note[0] = contact.note;
+        }
+    }
+
+    // photos
+    if (contact.photos && utils.isArray(contact.emails) && contact.emails.length > 0) {
+        tizenContact.photoURI = contact.photos[0];
+    }
+
+    if (utils.isDate(contact.birthday)) {
+        if (!utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday = new Date();
+        }
+        if (utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday.setDate(contact.birthday.getDate());
+        }
+    }
+
+    // Tizen supports many addresses
+    if (utils.isArray(contact.emails)) {
+
+        // if this is an update, re initialize email addresses
+        if (update) {
+            // doit on effacer sur un update??????
+        }
+
+        // copy the first three email addresses found
+        var emails = [];
+        for (i = 0; i < contact.emails.length; i += 1) {
+            var emailTypes = [];
+
+            emailTypes.push (contact.emails[i].type);
+
+            if (contact.emails[i].pref) {
+                emailTypes.push ("PREF");
+            }
+
+            emails.push(
+                new tizen.ContactEmailAddress(
+                    contact.emails[i].value,
+                    emailTypes)
+            );
+        }
+        tizenContact.emails = emails.length > 0 ? emails : [];
+    }
+    else {
+        tizenContact.emails = [];
+    }
+
+    // Tizen supports many phone numbers
+    // copy into appropriate fields based on type
+    if (utils.isArray(contact.phoneNumbers)) {
+        // if this is an update, re-initialize phone numbers
+        if (update) {
+        }
+
+        var phoneNumbers = [];
+
+        for (i = 0; i < contact.phoneNumbers.length; i += 1) {
+
+            if (!contact.phoneNumbers[i] || !contact.phoneNumbers[i].value) {
+                continue;
+            }
+
+             var phoneTypes = [];
+             phoneTypes.push (contact.phoneNumbers[i].type);
+
+             if (contact.phoneNumbers[i].pref) {
+                 phoneTypes.push ("PREF");
+             }
+
+            phoneNumbers.push(
+                new tizen.ContactPhoneNumber(
+                    contact.phoneNumbers[i].value,
+                    phoneTypes)
+            );
+        }
+
+        tizenContact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : [];
+    } else {
+        tizenContact.phoneNumbers = [];
+    }
+
+    if (utils.isArray(contact.addresses)) {
+        // if this is an update, re-initialize addresses
+        if (update) {
+        }
+
+        var addresses = [],
+            address = null;
+
+        for ( i = 0; i < contact.addresses.length; i += 1) {
+            address = contact.addresses[i];
+
+            if (!address || address.id === undefined || address.pref === undefined || address.type === undefined || address.formatted === undefined) {
+                continue;
+            }
+
+            var addressTypes = [];
+            addressTypes.push (address.type);
+
+            if (address.pref) {
+                addressTypes.push ("PREF");
+            }
+
+            addresses.push(
+                new tizen.ContactAddress({
+                         country:                   address.country,
+                         region :                   address.region,
+                         city:                      address.locality,
+                         streetAddress:             address.streetAddress,
+                         additionalInformation:     "",
+                         postalCode:                address.postalCode,
+                         types :                    addressTypes
+                }));
+
+        }
+        tizenContact.addresses = addresses.length > 0 ? addresses : [];
+
+    } else{
+        tizenContact.addresses = [];
+    }
+
+    // copy first url found to BlackBerry 'webpage' field
+    if (utils.isArray(contact.urls)) {
+        // if this is an update, re-initialize web page
+        if (update) {
+        }
+
+        var url = null,
+            urls = [];
+
+        for ( i = 0; i< contact.urls.length; i+= 1) {
+            url = contact.urls[i];
+
+            if (!url || !url.value) {
+                continue;
+            }
+
+            urls.push( new tizen.ContactWebSite(url.value, url.type));
+        }
+        tizenContact.urls = urls.length > 0 ? urls : [];
+    } else{
+        tizenContact.urls = [];
+    }
+
+    if (utils.isArray(contact.organizations && contact.organizations.length > 0) ) {
+        // if this is an update, re-initialize org attributes
+        var organization = contact.organizations[0];
+
+         tizenContact.organization = new tizen.ContacOrganization({
+             name:          organization.name,
+             department:    organization.department,
+             office:        "",
+             title:         organization.title,
+             role:          "",
+             logoURI:       ""
+         });
+    }
+
+    // categories
+    if (utils.isArray(contact.categories)) {
+        tizenContact.categories = [];
+
+        var category = null;
+
+        for (i = 0; i < contact.categories.length; i += 1) {
+            category = contact.categories[i];
+
+            if (typeof category === "string") {
+                tizenContact.categories.push(category);
+            }
+        }
+    }
+    else {
+        tizenContact.categories = [];
+    }
+
+    // save to device
+    // in tizen contact mean update or add
+    // later we might use addBatch and updateBatch
+    if (update){
+        tizen.contact.getDefaultAddressBook().update(tizenContact);
+    }
+    else {
+        tizen.contact.getDefaultAddressBook().add(tizenContact);
+    }
+
+    // Use the fully populated Tizen contact object to create a
+    // corresponding W3C contact object.
+    return ContactUtils.createContact(tizenContact, [ "*" ]);
+};
+
+
+/**
+ * Creates a Tizen ContactAddress object from a W3C ContactAddress.
+ *
+ * @return {tizen.ContactAddress} a Tizen ContactAddress object
+ */
+var createTizenAddress = function(address) {
+
+    var type = null,
+        pref = null,
+        typesAr = [];
+
+    if (address === null) {
+        return null;
+    }
+
+
+    var tizenAddress = new tizen.ContactAddress();
+
+    if (tizenAddress === null) {
+        return null;
+    }
+
+    typesAr.push(address.type);
+
+    if (address.pref) {
+        typesAr.push("PREF");
+    }
+
+    tizenAddress.country = address.country || "";
+    tizenAddress.region = address.region || "";
+    tizenAddress.city = address.locality || "";
+    tizenAddress.streetAddress = address.streetAddress || "";
+    tizenAddress.postalCode = address.postalCode || "";
+    tizenAddress.types = typesAr || "";
+
+    return tizenAddress;
+};
+
+module.exports = {
+    /**
+     * Persists contact to device storage.
+     */
+
+    save : function(successCB, failCB) {
+
+        try {
+            // save the contact and store it's unique id
+            var fullContact = saveToDevice(this);
+
+            this.id = fullContact.id;
+
+            // This contact object may only have a subset of properties
+            // if the save was an update of an existing contact. This is
+            // because the existing contact was likely retrieved using a
+            // subset of properties, so only those properties were set in the
+            // object. For this reason, invoke success with the contact object
+            // returned by saveToDevice since it is fully populated.
+
+            if (typeof successCB === 'function') {
+                successCB(fullContact);
+            }
+        }
+        catch (error) {
+            console.log('Error saving contact: ' +  error);
+
+            if (typeof failCB === 'function') {
+                failCB (new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    },
+
+    /**
+     * Removes contact from device storage.
+     *
+     * @param successCB
+     *            successCB callback
+     * @param failCB
+     *            error callback
+     */
+    remove : function (successCB, failCB) {
+
+        try {
+            // retrieve contact from device by id
+            var tizenContact = null;
+
+            if (this.id) {
+                tizenContact = findByUniqueId(this.id);
+            }
+
+
+            // if contact was found, remove it
+            if (tizenContact) {
+
+                tizen.contact.getDefaultAddressBook().remove(tizenContact.id);
+
+                if (typeof success === 'function') {
+                    successCB(this);
+                }
+            }
+            // attempting to remove a contact that hasn't been saved
+            else if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+        catch (error) {
+            console.log('Error removing contact ' + this.id + ": " + error);
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/ContactUtils.js
+define("cordova/plugin/tizen/ContactUtils", function(require, exports, module) {
+/*global tizen:false */
+var ContactAddress = require('cordova/plugin/ContactAddress'),
+    ContactName = require('cordova/plugin/ContactName'),
+    ContactField = require('cordova/plugin/ContactField'),
+    ContactOrganization = require('cordova/plugin/ContactOrganization'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+ * Mappings for each Contact field that may be used in a find operation. Maps
+ * W3C Contact fields to one or more fields in a Tizen contact object.
+ *
+ * Example: user searches with a filter on the Contact 'name' field:
+ *
+ * <code>Contacts.find(['name'], onSuccess, onFail, {filter:'Bob'});</code>
+ *
+ * The 'name' field does not exist in a Tizen contact. Instead, a filter
+ * expression will be built to search the Tizen contacts using the
+ * Tizen 'title', 'firstName' and 'lastName' fields.
+ */
+var fieldMappings = {
+    "id" : ["id"],
+    "displayName" : ["name.displayName"],
+    "nickname": ["name.nicknames"],
+    "name" : [ "name.prefix", "name.firstName", "name.lastName" ],
+    "phoneNumbers" : ["phoneNumbers.number","phoneNumbers.types"],
+    "emails" : ["emails.types", "emails.email"],
+    "addresses" : ["addresses.country","addresses.region","addresses.city","addresses.streetAddress","addresses.postalCode","addresses.country","addresses.types"],
+    "organizations" : ["organization.name","organization.department","organization.office", "organization.title"],
+    "birthday" : ["birthday"],
+    "note" : ["notes"],
+    "photos" : ["photoURI"],
+    "categories" : ["categories"],
+    "urls" : ["urls.url", "urls.type"]
+};
+
+/*
+ * Build an array of all of the valid W3C Contact fields. This is used to
+ * substitute all the fields when ["*"] is specified.
+ */
+var allFields = [];
+
+(function initializeAllFieldsMapping() {
+
+    for ( var key in fieldMappings) {
+        allFields.push(key);
+    }
+    // as we want it to be executed once
+    function initializeAllFieldsMapping() {
+    }
+
+})();
+
+/**
+ * Create a W3C ContactAddress object from a Tizen Address object
+ *
+ * @param {String}
+ *            type the type of address (e.g. work, home)
+ * @param {tizen.ContactAddress}
+ *            tizenAddress a Tizen Address object
+ * @return {ContactAddress} a contact address object or null if the specified
+ *         address is null
+ */
+var createContactAddress = function(type, tizenAddress) {
+    if (!tizenAddress) {
+        return null;
+    }
+
+    var streetAddress = tizenAddress.streetAddress;
+    var locality = tizenAddress.city || "";
+    var region = tizenAddress.region || "";
+    var postalCode = tizenAddress.postalCode || "";
+    var country = tizenAddress.country || "";
+    var formatted = streetAddress + ", " + locality + ", " + region + ", " + postalCode + ", " + country;
+
+    var contact = new ContactAddress(null, type, formatted, streetAddress, locality, region, postalCode, country);
+
+    return contact;
+};
+
+module.exports = {
+    /**
+     * Builds Tizen filter expressions for contact search using the
+     * contact fields and search filter provided.
+     *
+     * @param {String[]}
+     *            fields Array of Contact fields to search
+     * @param {String}
+     *            filter Filter, or search string
+     * @param {Boolean}
+     *                 multiple, one contacts or more wanted as result
+     * @return filter expression or null if fields is empty or filter is null or
+     *         empty
+     */
+
+    buildFilterExpression: function(fields, filter) {
+        // ensure filter exists
+        if (!filter || filter === "") {
+            return null;
+        }
+
+        if ((fields.length === 1) && (fields[0] === "*")) {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // build a filter expression using all Contact fields provided
+        var compositeFilter = null,
+            attributeFilter = null,
+            filterExpression = null,
+            matchFlag = "CONTAINS",
+            matchValue = filter,
+            attributesArray = [];
+
+        if (fields && utils.isArray(fields)) {
+
+            for ( var field in fields) {
+
+                if (!fields[field]) {
+                    continue;
+                }
+
+                // retrieve Tizen contact fields that map Cordova fields specified
+                // (tizenFields is a string or an array of strings)
+                var tizenFields = fieldMappings[fields[field]];
+
+                if (!tizenFields) {
+                    // does something maps
+                    continue;
+                }
+
+                // construct the filter expression using the Tizen fields
+                for ( var index in tizenFields) {
+                    attributeFilter = new tizen.AttributeFilter(tizenFields[index], matchFlag, matchValue);
+                    if (attributeFilter !== null) {
+                        attributesArray.push(attributeFilter);
+                    }
+                }
+            }
+        }
+
+        // fullfil tizen find attribute as a single or a composite attribute
+        if (attributesArray.length == 1 ) {
+            filterExpression = attributeFilter[0];
+        } else if (attributesArray.length > 1) {
+            // combine the filters as a Union
+            filterExpression = new tizen.CompositeFilter("UNION", attributesArray);
+        } else {
+            filterExpression = null;
+        }
+
+        return filterExpression;
+    },
+
+
+
+    /**
+     * Creates a Contact object from a Tizen Contact object, copying only
+     * the fields specified.
+     *
+     * This is intended as a privately used function but it is made globally
+     * available so that a Contact.save can convert a BlackBerry contact object
+     * into its W3C equivalent.
+     *
+     * @param {tizen.Contact}
+     *            tizenContact Tizen Contact object
+     * @param {String[]}
+     *            fields array of contact fields that should be copied
+     * @return {Contact} a contact object containing the specified fields or
+     *         null if the specified contact is null
+     */
+    createContact: function(tizenContact, fields) {
+
+        if (!tizenContact) {
+            return null;
+        }
+
+        // construct a new contact object
+        // always copy the contact id and displayName fields
+        var contact = new Contact(tizenContact.id, tizenContact.name.displayName);
+
+
+        // nothing to do
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            return contact;
+        } else if (fields.length === 1 && fields[0] === "*") {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // add the fields specified
+        for ( var key in fields) {
+
+            var field = fields[key],
+                index = 0;
+
+            if (!field) {
+                continue;
+            }
+
+            // name
+            if (field.indexOf('name') === 0) {
+
+                var formattedName = (tizenContact.name.prefix || "");
+
+                if (tizenContact.name.firstName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.firstName || "");
+                }
+
+                if (tizenContact.name.middleName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.middleName || "");
+                }
+
+                if (tizenContact.name.lastName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.lastName || "");
+                }
+
+                contact.name = new ContactName(
+                        formattedName,
+                        tizenContact.name.lastName,
+                        tizenContact.name.firstName,
+                        tizenContact.name.middleName,
+                        tizenContact.name.prefix,
+                        null);
+            }
+
+            // phoneNumbers
+            else if (field.indexOf('phoneNumbers') === 0) {
+
+                var phoneNumbers = [];
+
+                for (index = 0 ; index < tizenContact.phoneNumbers.length ; ++index) {
+
+                    phoneNumbers.push(
+                            new ContactField(
+                                    'PHONE',
+                                    tizenContact.phoneNumbers[index].number,
+                                    ((tizenContact.phoneNumbers[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+
+
+                contact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : null;
+            }
+
+            // emails
+            else if (field.indexOf('emails') === 0) {
+
+                var emails = [];
+
+                for (index = 0 ; index < tizenContact.emails.length ; ++index) {
+
+                    emails.push(
+                        new ContactField(
+                            'EMAILS',
+                            tizenContact.emails[index].email,
+                            ((tizenContact.emails[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+                contact.emails = emails.length > 0 ? emails : null;
+            }
+
+            // addresses
+            else if (field.indexOf('addresses') === 0) {
+
+                var addresses = [];
+                for (index = 0 ; index < tizenContact.addresses.length ; ++index) {
+
+                    addresses.push(
+                            new ContactAddress(
+                                    ((tizenContact.addresses[index].types[1] &&  tizenContact.addresses[index].types[1] === "PREF") ? true : false),
+                                    tizenContact.addresses[index].types[0] ? tizenContact.addresses[index].types[0] : "HOME",
+                                    null,
+                                    tizenContact.addresses[index].streetAddress,
+                                    tizenContact.addresses[index].city,
+                                    tizenContact.addresses[index].region,
+                                    tizenContact.addresses[index].postalCode,
+                                    tizenContact.addresses[index].country ));
+                }
+
+                contact.addresses = addresses.length > 0 ? addresses : null;
+            }
+
+            // birthday
+            else if (field.indexOf('birthday') === 0) {
+                if (utils.isDate(tizenContact.birthday)) {
+                    contact.birthday = tizenContact.birthday;
+                }
+            }
+
+            // note only one in Tizen Contact
+            else if (field.indexOf('note') === 0) {
+                if (tizenContact.note) {
+                    contact.note = tizenContact.note[0];
+                }
+            }
+
+            // organizations
+            else if (field.indexOf('organizations') === 0) {
+
+                var organizations = [];
+
+                // there's only one organization in a Tizen Address
+
+                if (tizenContact.organization) {
+                    organizations.push(
+                            new ContactOrganization(
+                                    true,
+                                    'WORK',
+                                    tizenContact.organization.name,
+                                    tizenContact.organization.department,
+                                    tizenContact.organization.jobTitle));
+                }
+
+                contact.organizations = organizations.length > 0 ? organizations : null;
+            }
+
+            // categories
+            else if (field.indexOf('categories') === 0) {
+
+                var categories = [];
+
+                if (tizenContact.categories) {
+
+                    for (index = 0 ; index < tizenContact.categories.length ; ++index) {
+                        categories.push(
+                                new ContactField(
+                                        'MAIN',
+                                        tizenContact.categories,
+                                        (index === 0) ));
+                    }
+
+                    contact.categories = categories.length > 0 ? categories : null;
+                }
+            }
+
+            // urls
+            else if (field.indexOf('urls') === 0) {
+                var urls = [];
+
+                if (tizenContact.urls) {
+                    for (index = 0 ; index <tizenContact.urls.length ; ++index) {
+                        urls.push(
+                                new ContactField(
+                                        tizenContact.urls[index].type,
+                                        tizenContact.urls[index].url,
+                                        (index === 0)));
+                    }
+                }
+
+                contact.urls = urls.length > 0 ? urls : null;
+            }
+
+            // photos
+            else if (field.indexOf('photos') === 0) {
+                var photos = [];
+
+                if (tizenContact.photoURI) {
+                    photos.push(new ContactField('URI', tizenContact.photoURI, true));
+                }
+
+                contact.photos = photos.length > 0 ? photos : null;
+            }
+        }
+
+        return contact;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Device.js
+define("cordova/plugin/tizen/Device", function(require, exports, module) {
+/*global tizen:false */
+var channel = require('cordova/channel');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+function Device() {
+    this.version = null;
+    this.uuid = null;
+    this.name = null;
+    this.cordova =  "2.0.0";
+    this.platform = "Tizen";
+
+    var me = this;
+
+    function onSuccessCallback(sysInfoProp) {
+        me.name = sysInfoProp.model;
+        me.uuid = sysInfoProp.imei;
+        me.version = sysInfoProp.version;
+        channel.onCordovaInfoReady.fire();
+    }
+
+    function onErrorCallback(error) {
+        console.log("error initializing cordova: " + error);
+    }
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getDeviceInfo(onSuccessCallback, onErrorCallback);
+    });
+}
+
+Device.prototype.getDeviceInfo = function(success, fail, args) {
+    tizen.systeminfo.getPropertyValue("Device", success, fail);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/tizen/plugin/tizen/File.js
+define("cordova/plugin/tizen/File", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileError = require('cordova/plugin/FileError'),
+    DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    File = require('cordova/plugin/File'),
+    FileSystem = require('cordova/plugin/FileSystem');
+
+var nativeRequestFileSystem = window.webkitRequestFileSystem,
+    nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL,
+    NativeFileReader = window.FileReader;
+
+function getFileSystemName(nativeFs) {
+    return (nativeFs.name.indexOf("Persistent") != -1) ? "persistent" : "temporary";
+}
+
+function makeEntry(entry) {
+    if (entry.isDirectory) {
+        return new DirectoryEntry(entry.name, decodeURI(entry.toURL()));
+    }
+    else {
+        return new FileEntry(entry.name, decodeURI(entry.toURL()));
+    }
+}
+
+module.exports = {
+    /* requestFileSystem */
+    requestFileSystem: function(successCallback, errorCallback, args) {
+        var type = args[0],
+            size = args[1];
+
+        nativeRequestFileSystem(type, size, function(nativeFs) {
+            successCallback(new FileSystem(getFileSystemName(nativeFs), makeEntry(nativeFs.root)));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* resolveLocalFileSystemURI */
+    resolveLocalFileSystemURI: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            successCallback(makeEntry(entry));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryReader */
+    readEntries: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(dirEntry) {
+            var reader = dirEntry.createReader();
+            reader.readEntries(function(entries) {
+                var retVal = [];
+                for (var i = 0; i < entries.length; i++) {
+                    retVal.push(makeEntry(entries[i]));
+                }
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* Entry */
+    getMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getMetadata(function(metaData) {
+                successCallback(metaData.modificationTime);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    moveTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.moveTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    copyTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.copyTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    remove: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.remove(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getParent: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getParent(function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileEntry */
+    getFileMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.file(function(file) {
+                var retVal = new File(file.name, decodeURI(entry.toURL()), file.type, file.lastModifiedDate, file.size);
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryEntry */
+    getDirectory: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getDirectory(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    removeRecursively: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.removeRecursively(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getFile: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getFile(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileReader */
+    readAsText: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            encoding = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsText(file, encoding);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    readAsDataURL: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsDataURL(file);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileWriter */
+    write: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            text = args[1],
+            position = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.position - position);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                var blob = new WebKitBlobBuilder();
+                blob.append(text);
+
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.seek(position);
+                writer.write(blob.getBlob('text/plain'));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    truncate: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            size = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.length);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.truncate(size);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/FileTransfer.js
+define("cordova/plugin/tizen/FileTransfer", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileEntry = require('cordova/plugin/FileEntry'),
+    FileTransferError = require('cordova/plugin/FileTransferError'),
+    FileUploadResult = require('cordova/plugin/FileUploadResult');
+
+var nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL;
+
+function getParentPath(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(0, pos + 1);
+}
+
+function getFileName(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(pos + 1);
+}
+
+module.exports = {
+    upload: function(successCallback, errorCallback, args) {
+        var filePath = args[0],
+            server = args[1],
+            fileKey = args[2],
+            fileName = args[3],
+            mimeType = args[4],
+            params = args[5],
+            /*trustAllHosts = args[6],*/
+            chunkedMode = args[7];
+
+        nativeResolveLocalFileSystemURI(filePath, function(entry) {
+            entry.file(function(file) {
+                function uploadFile(blobFile) {
+                    var fd = new FormData();
+
+                    fd.append(fileKey, blobFile, fileName);
+                    for (var prop in params) {
+                        if(params.hasOwnProperty(prop)) {
+                            fd.append(prop, params[prop]);
+                        }
+                    }
+
+                    var xhr = new XMLHttpRequest();
+                    xhr.open("POST", server);
+                    xhr.onload = function(evt) {
+                        if (xhr.status == 200) {
+                            var result = new FileUploadResult();
+                            result.bytesSent = file.size;
+                            result.responseCode = xhr.status;
+                            result.response = xhr.response;
+                            successCallback(result);
+                        } else if (xhr.status == 404) {
+                            errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                        } else {
+                            errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                        }
+                    };
+                    xhr.ontimeout = function(evt) {
+                        errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                    };
+
+                    xhr.send(fd);
+                }
+
+                var bytesPerChunk;
+                if (chunkedMode === true) {
+                    bytesPerChunk = 1024 * 1024; // 1MB chunk sizes.
+                } else {
+                    bytesPerChunk = file.size;
+                }
+                var start = 0;
+                var end = bytesPerChunk;
+                while (start < file.size) {
+                    var chunk = file.webkitSlice(start, end, mimeType);
+                    uploadFile(chunk);
+                    start = end;
+                    end = start + bytesPerChunk;
+                }
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            }
+            );
+        },
+        function(error) {
+            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+        }
+        );
+    },
+
+    download: function(successCallback, errorCallback, args) {
+        var url = args[0],
+            filePath = args[1];
+
+        var xhr = new XMLHttpRequest();
+
+        function writeFile(fileEntry) {
+            fileEntry.createWriter(function(writer) {
+                writer.onwriteend = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(new FileEntry(fileEntry.name, fileEntry.toURL()));
+                    } else {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    }
+                };
+
+                writer.onerror = function(evt) {
+                    errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                };
+
+                var builder = new WebKitBlobBuilder();
+                builder.append(xhr.response);
+                var blob = builder.getBlob();
+                writer.write(blob);
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            });
+        }
+
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState == xhr.DONE) {
+                if (xhr.status == 200 && xhr.response) {
+                    nativeResolveLocalFileSystemURI(getParentPath(filePath), function(dir) {
+                        dir.getFile(getFileName(filePath), {create: true}, writeFile, function(error) {
+                            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                        });
+                    }, function(error) {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    });
+                } else if (xhr.status == 404) {
+                    errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                } else {
+                    errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                }
+            }
+        };
+
+        xhr.open("GET", url, true);
+        xhr.responseType = "arraybuffer";
+        xhr.send();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Media.js
+define("cordova/plugin/tizen/Media", function(require, exports, module) {
+/*global Media:false, webkitURL:false */
+var MediaError = require('cordova/plugin/MediaError'),
+    audioObjects = {};
+
+module.exports = {
+    create: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::create() - id =" + id + ", src =" + src);
+        audioObjects[id] = new Audio(src);
+        audioObjects[id].onStalledCB = function () {
+            console.log("media::onStalled()");
+             audioObjects[id].timer = window.setTimeout(function () {
+                    audioObjects[id].pause();
+                    if (audioObjects[id].currentTime !== 0)
+                        audioObjects[id].currentTime = 0;
+                    console.log("media::onStalled() - MEDIA_ERROR -> " + MediaError.MEDIA_ERR_ABORTED);
+                    var err = new MediaError(MediaError.MEDIA_ERR_ABORTED, "Stalled");
+                    Media.onStatus(id, Media.MEDIA_ERROR, err);
+                }, 2000);
+        };
+        audioObjects[id].onEndedCB = function () {
+            console.log("media::onEndedCB() - MEDIA_STATE -> MEDIA_STOPPED");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        };
+        audioObjects[id].onErrorCB = function () {
+            console.log("media::onErrorCB() - MEDIA_ERROR -> " + event.srcElement.error);
+            Media.onStatus(id, Media.MEDIA_ERROR, event.srcElement.error);
+        };
+        audioObjects[id].onPlayCB = function () {
+            console.log("media::onPlayCB() - MEDIA_STATE -> MEDIA_STARTING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING);
+        };
+        audioObjects[id].onPlayingCB = function () {
+            console.log("media::onPlayingCB() - MEDIA_STATE -> MEDIA_RUNNING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING);
+        };
+        audioObjects[id].onDurationChangeCB = function () {
+            console.log("media::onDurationChangeCB() - MEDIA_DURATION -> " +  audioObjects[id].duration);
+            Media.onStatus(id, Media.MEDIA_DURATION, audioObjects[id].duration);
+        };
+        audioObjects[id].onTimeUpdateCB = function () {
+            console.log("media::onTimeUpdateCB() - MEDIA_POSITION -> " +  audioObjects[id].currentTime);
+            Media.onStatus(id, Media.MEDIA_POSITION, audioObjects[id].currentTime);
+        };
+        audioObjects[id].onCanPlayCB = function () {
+            console.log("media::onCanPlayCB()");
+            window.clearTimeout(audioObjects[id].timer);
+            audioObjects[id].play();
+        };
+      },
+    startPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1], options = args[2];
+        console.log("media::startPlayingAudio() - id =" + id + ", src =" + src + ", options =" + options);
+        audioObjects[id].addEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].addEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].addEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].addEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].addEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].addEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].addEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].addEventListener('stalled', audioObjects[id].onStalledCB);
+        audioObjects[id].play();
+    },
+    stopPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        audioObjects[id].pause();
+        if (audioObjects[id].currentTime !== 0)
+            audioObjects[id].currentTime = 0;
+        console.log("media::stopPlayingAudio() - MEDIA_STATE -> MEDIA_STOPPED");
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        audioObjects[id].removeEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].removeEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].removeEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].removeEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].removeEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].removeEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onStalledCB);
+    },
+    seekToAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], milliseconds = args[1];
+        console.log("media::seekToAudio()");
+         audioObjects[id].currentTime = milliseconds;
+        successCallback( audioObjects[id].currentTime);
+    },
+    pausePlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::pausePlayingAudio() - MEDIA_STATE -> MEDIA_PAUSED");
+        audioObjects[id].pause();
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED);
+    },
+    getCurrentPositionAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::getCurrentPositionAudio()");
+        successCallback(audioObjects[id].currentTime);
+    },
+    release: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        console.log("media::release()");
+    },
+    setVolume: function (successCallback, errorCallback, args) {
+        var id = args[0], volume = args[1];
+        console.log("media::setVolume()");
+        audioObjects[id].volume = volume;
+    },
+    startRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::startRecordingAudio() - id =" + id + ", src =" + src);
+
+        function gotStreamCB(stream) {
+            audioObjects[id].src = webkitURL.createObjectURL(stream);
+            console.log("media::startRecordingAudio() - stream CB");
+        }
+
+        function gotStreamFailedCB(error) {
+            console.log("media::startRecordingAudio() - error CB:" + error.toString());
+        }
+
+        if (navigator.webkitGetUserMedia) {
+            audioObjects[id] = new Audio();
+            navigator.webkitGetUserMedia('audio', gotStreamCB, gotStreamFailedCB);
+        } else {
+            console.log("webkitGetUserMedia not supported");
+        }
+        successCallback();
+    },
+    stopRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::stopRecordingAudio() - id =" + id);
+        audioObjects[id].pause();
+        successCallback();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/MediaError.js
+define("cordova/plugin/tizen/MediaError", function(require, exports, module) {
+
+// The MediaError object already exists on Tizen. This prevents the Cordova
+// version from being defined. This object is used to merge in differences
+// between Tizen and Cordova MediaError objects.
+module.exports = {
+        MEDIA_ERR_NONE_ACTIVE : 0,
+        MEDIA_ERR_NONE_SUPPORTED : 4
+};
+});
+
+// file: lib/tizen/plugin/tizen/NetworkStatus.js
+define("cordova/plugin/tizen/NetworkStatus", function(require, exports, module) {
+/*global tizen:false */
+var Connection = require('cordova/plugin/Connection');
+
+module.exports = {
+    getConnectionInfo: function (successCallback, errorCallback) {
+        var cncType = Connection.NONE;
+        var infoCount = 0;
+
+        function infoCB() {
+            infoCount++;
+            if (infoCount > 1)
+               successCallback(cncType);
+        }
+
+        function errorCB(error) {
+           console.log("Error: " + error.code + "," + error.name + "," + error.message);
+           infoCB();
+        }
+
+        function wifiSuccessCB(wifi) {
+            if ((wifi.status === "ON")  && (wifi.ipAddress.length !== 0))
+                cncType = Connection.WIFI;
+            infoCB();
+        }
+
+        function cellularSuccessCB(cell) {
+            if ((cncType === Connection.NONE) && (cell.status === "ON") && (cell.ipAddress.length !== 0))
+                cncType = Connection.CELL_2G;
+            infoCB();
+        }
+
+        if (tizen.systeminfo.isSupported('WifiNetwork')) {
+            tizen.systeminfo.getPropertyValue('WifiNetwork', wifiSuccessCB, errorCB);
+        }
+
+        if (tizen.systeminfo.isSupported('CellularNetwork')) {
+            tizen.systeminfo.getPropertyValue('CellularNetwork', cellularSuccessCB, errorCB);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Notification.js
+define("cordova/plugin/tizen/Notification", function(require, exports, module) {
+module.exports = {
+
+    alert: function(message, alertCallback, title, buttonName) {
+        return this.confirm(message, alertCallback, title, buttonName);
+    },
+
+    confirm: function(message, confirmCallback, title, buttonLabels) {
+        var index = null,
+            overlayElement = null,
+            popup = null,
+            element = null,
+            titleString = null,
+            messageString = null,
+            buttonString = null,
+            buttonsArray = null;
+
+        function initCss() {
+            var id = 'tizen-cordova-css';
+            if (document.getElementById(id))
+                return;
+
+            var rules = {
+                '.ui-popupwindow-screen' :  'background: #000000; opacity: 0.4;',
+                '.ui-popupwindow' : 'background: #828282; padding: 1px 1px; color: white; width: 80%; margin-left: 10%;',
+                '.popup-title' : 'background: #018ccc; padding: 5px 5px;',
+                '.popup-title p' : 'padding: 0px; margin: 0px; text-align: center;',
+                '.popup-text' : 'background: #2d2d2d; padding: 5px 5px;',
+                '.popup-text p' : 'padding: 0px; margin: 0px; text-align: center; vertical-align: middle; line-height:100px;',
+                '.popup-button-bg' : 'background: #424242; padding: 5px 5px;',
+                '.popup-button-bg ul' : 'list-style-type: none; width: 80%; margin-left: 10%; text-align: center; padding: 0px;',
+                '.popup-button-bg li' : 'display: inline;',
+                '.popup-button-bg li input' : 'border-radius: 4px 4px 4px 4px; border: 0px; background: #545454; padding: 5px 15px; color: white; min-width: 80px; margin: 0px 5px;'
+            };
+
+            var css = document.createElement('style');
+            css.type = 'text/css';
+            css.id = id;
+
+            var selector = null;
+            for (selector in rules) {
+                css.appendChild(document.createTextNode(selector + "{ " + rules[selector] + " }"));
+            }
+
+            document.getElementsByTagName("head")[0].appendChild(css);
+        }
+
+        initCss();
+
+        console.log ("message" , message);
+        console.log ("confirmCallback" , confirmCallback);
+        console.log ("title" , title);
+        console.log ("buttonLabels" , buttonLabels);
+
+        titleString = '<div class="popup-title"><p>' + title + '</p></div>';
+        messageString = '<div class="popup-text"><p>' + message + '</p></div>';
+        buttonString = '<div class="popup-button-bg"><ul>';
+
+        switch(typeof(buttonLabels))
+        {
+        case "string":
+            buttonsArray = buttonLabels.split(",");
+
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+
+        case "array":
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+        default:
+            console.log ("cordova/plugin/tizen/Notification, default, buttonLabels: ", buttonLabels);
+            break;
+        }
+
+        buttonString += '</ul></div>';
+
+        overlayElement = document.createElement("div");
+        overlayElement.className = 'ui-popupwindow-screen';
+
+        overlayElement.style.zIndex = 1001;
+        overlayElement.style.width = "100%";
+        overlayElement.style.height = "100%";
+        overlayElement.style.top = 0;
+        overlayElement.style.left = 0;
+        overlayElement.style.margin = 0;
+        overlayElement.style.padding = 0;
+        overlayElement.style.position = "absolute";
+
+        popup = document.createElement("div");
+        popup.className = "ui-popupwindow";
+        popup.style.position = "fixed";
+        popup.style.zIndex = 1002;
+        popup.innerHTML = titleString + messageString + buttonString;
+
+        document.body.appendChild(overlayElement);
+        document.body.appendChild(popup);
+
+        function createListener(button) {
+            return function() {
+                document.body.removeChild(overlayElement);
+                document.body.removeChild(popup);
+                confirmCallback(button.value);
+            };
+        }
+
+       for (index in buttonsArray) {
+           console.log ("index: ", index);
+
+           element = document.getElementById("popup-button-" + buttonsArray[index]);
+           element.addEventListener("click", createListener(element), false);
+       }
+    },
+
+    vibrate: function(milliseconds) {
+        console.log ("milliseconds" , milliseconds);
+
+        if (navigator.vibrate) {
+            navigator.vibrate(milliseconds);
+        }
+        else {
+            console.log ("cordova/plugin/tizen/Notification, vibrate API does not exists");
+        }
+    },
+
+    beep: function(count) {
+            console.log("notification:beep() - count = " + count);
+
+            var beepSound = new Audio("/sounds/beep.wav");
+            beepSound.cpt = 0;
+
+            beepSound.addEventListener('canplay', function () {
+                console.log("notification:beepSound() - canpay CB");
+                this.play();
+            });
+
+            beepSound.addEventListener('ended', function () {
+                console.log("notification:beepSound() - ended CB: cpt = " + this.cpt);
+                if (this.cpt !== 0) {
+                    if (this.currentTime !== 0)
+                        this.currentTime = 0;
+                    this.play();
+                    this.cpt--;
+                }
+            });
+
+            beepSound.addEventListener('error',  function () {
+                    console.log("notification:beepSound() - error CB");
+            });
+
+            beepSound.load();
+            beepSound.pause();
+            if (beepSound.currentTime !== 0)
+                beepSound.currentTime = 0;
+            beepSound.cpt = count - 1;
+            beepSound.play();
+    }
+};
+
+
+
+});
+
+// file: lib/tizen/plugin/tizen/contacts.js
+define("cordova/plugin/tizen/contacts", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils');
+
+module.exports = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     *
+     * @return array of Contacts matching search criteria
+     */
+    find : function(fields, successCB, failCB, options) {
+
+        // Success callback is required. Throw exception if not specified.
+        if (typeof successCB !== 'function') {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+
+        // Search qualifier is required and cannot be empty.
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+            return;
+        }
+
+        // options are optional
+        var filter ="",
+            multiple = false,
+            contacts = [],
+            tizenFilter = null;
+
+        if (options) {
+            filter = options.filter || "";
+            multiple =  options.multiple || false;
+        }
+
+        if (filter){
+            tizenFilter = ContactUtils.buildFilterExpression(fields, filter);
+        }
+
+        tizen.contact.getDefaultAddressBook().find(
+            function(tizenContacts) {
+                if (multiple) {
+                    for (var index in tizenContacts) {
+                        contacts.push(ContactUtils.createContact(tizenContacts[index], fields));
+                    }
+                }
+                else {
+                    contacts.push(ContactUtils.createContact(tizenContacts[0], fields));
+                }
+
+                // return results
+                successCB(contacts);
+            },
+            function(error) {
+                if (typeof failCB === 'function') {
+                    failCB(ContactError.UNKNOWN_ERROR);
+                }
+            },
+            tizenFilter,
+            null);
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/manager.js
+define("cordova/plugin/tizen/manager", function(require, exports, module) {
+var cordova = require('cordova');
+
+module.exports = {
+    exec: function (successCallback, errorCallback, clazz, action, args) {
+        var plugin = require('cordova/plugin/tizen/' + clazz);
+
+        if (plugin && typeof plugin[action] === 'function') {
+            var result = plugin[action](successCallback, errorCallback, args);
+            return result || {status: cordova.callbackStatus.NO_RESULT};
+        }
+
+        return {"status" : cordova.callbackStatus.CLASS_NOT_FOUND_EXCEPTION, "message" : "Function " + clazz + "::" + action + " cannot be found"};
+    },
+    resume: function () {},
+    pause: function () {},
+    destroy: function () {}
+};
+
+});
+
+// file: lib/common/utils.js
+define("cordova/utils", function(require, exports, module) {
+var utils = exports;
+
+/**
+ * Returns an indication of whether the argument is an array or not
+ */
+utils.isArray = function(a) {
+    return Object.prototype.toString.call(a) == '[object Array]';
+};
+
+/**
+ * Returns an indication of whether the argument is a Date or not
+ */
+utils.isDate = function(d) {
+    return Object.prototype.toString.call(d) == '[object Date]';
+};
+
+/**
+ * Does a deep clone of the object.
+ */
+utils.clone = function(obj) {
+    if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
+        return obj;
+    }
+
+    var retVal, i;
+
+    if(utils.isArray(obj)){
+        retVal = [];
+        for(i = 0; i < obj.length; ++i){
+            retVal.push(utils.clone(obj[i]));
+        }
+        return retVal;
+    }
+
+    retVal = {};
+    for(i in obj){
+        if(!(i in retVal) || retVal[i] != obj[i]) {
+            retVal[i] = utils.clone(obj[i]);
+        }
+    }
+    return retVal;
+};
+
+/**
+ * Returns a wrappered version of the function
+ */
+utils.close = function(context, func, params) {
+    if (typeof params == 'undefined') {
+        return function() {
+            return func.apply(context, arguments);
+        };
+    } else {
+        return function() {
+            return func.apply(context, params);
+        };
+    }
+};
+
+/**
+ * Create a UUID
+ */
+utils.createUUID = function() {
+    return UUIDcreatePart(4) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(6);
+};
+
+/**
+ * Extends a child object from a parent object using classical inheritance
+ * pattern.
+ */
+utils.extend = (function() {
+    // proxy used to establish prototype chain
+    var F = function() {};
+    // extend Child from Parent
+    return function(Child, Parent) {
+        F.prototype = Parent.prototype;
+        Child.prototype = new F();
+        Child.__super__ = Parent.prototype;
+        Child.prototype.constructor = Child;
+    };
+}());
+
+/**
+ * Alerts a message in any available way: alert or console.log.
+ */
+utils.alert = function(msg) {
+    if (alert) {
+        alert(msg);
+    } else if (console && console.log) {
+        console.log(msg);
+    }
+};
+
+/**
+ * Formats a string and arguments following it ala sprintf()
+ *
+ * see utils.vformat() for more information
+ */
+utils.format = function(formatString /* ,... */) {
+    var args = [].slice.call(arguments, 1);
+    return utils.vformat(formatString, args);
+};
+
+/**
+ * Formats a string and arguments following it ala vsprintf()
+ *
+ * format chars:
+ *   %j - format arg as JSON
+ *   %o - format arg as JSON
+ *   %c - format arg as ''
+ *   %% - replace with '%'
+ * any other char following % will format it's
+ * arg via toString().
+ *
+ * for rationale, see FireBug's Console API:
+ *    http://getfirebug.com/wiki/index.php/Console_API
+ */
+utils.vformat = function(formatString, args) {
+    if (formatString === null || formatString === undefined) return "";
+    if (arguments.length == 1) return formatString.toString();
+    if (typeof formatString != "string") return formatString.toString();
+
+    var pattern = /(.*?)%(.)(.*)/;
+    var rest    = formatString;
+    var result  = [];
+
+    while (args.length) {
+        var arg   = args.shift();
+        var match = pattern.exec(rest);
+
+        if (!match) break;
+
+        rest = match[3];
+
+        result.push(match[1]);
+
+        if (match[2] == '%') {
+            result.push('%');
+            args.unshift(arg);
+            continue;
+        }
+
+        result.push(formatted(arg, match[2]));
+    }
+
+    result.push(rest);
+
+    return result.join('');
+};
+
+//------------------------------------------------------------------------------
+function UUIDcreatePart(length) {
+    var uuidpart = "";
+    for (var i=0; i<length; i++) {
+        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
+        if (uuidchar.length == 1) {
+            uuidchar = "0" + uuidchar;
+        }
+        uuidpart += uuidchar;
+    }
+    return uuidpart;
+}
+
+//------------------------------------------------------------------------------
+function formatted(object, formatChar) {
+
+    try {
+        switch(formatChar) {
+            case 'j':
+            case 'o': return JSON.stringify(object);
+            case 'c': return '';
+        }
+    }
+    catch (e) {
+        return "error JSON.stringify()ing argument: " + e;
+    }
+
+    if ((object === null) || (object === undefined)) {
+        return Object.prototype.toString.call(object);
+    }
+
+    return object.toString();
+}
+
+});
+
+
+window.cordova = require('cordova');
+
+// file: lib/scripts/bootstrap.js
+(function (context) {
+    var channel = require("cordova/channel"),
+        _self = {
+            boot: function () {
+                /**
+                 * Create all cordova objects once page has fully loaded and native side is ready.
+                 */
+                channel.join(function() {
+                    var builder = require('cordova/builder'),
+                        base = require('cordova/common'),
+                        platform = require('cordova/platform');
+
+                    // Drop the common globals into the window object, but be nice and don't overwrite anything.
+                    builder.build(base.objects).intoButDontClobber(window);
+
+                    // Drop the platform-specific globals into the window object
+                    // and clobber any existing object.
+                    builder.build(platform.objects).intoAndClobber(window);
+
+                    // Merge the platform-specific overrides/enhancements into
+                    // the window object.
+                    if (typeof platform.merges !== 'undefined') {
+                        builder.build(platform.merges).intoAndMerge(window);
+                    }
+
+                    // Call the platform-specific initialization
+                    platform.initialize();
+
+                    // Fire event to notify that all objects are created
+                    channel.onCordovaReady.fire();
+
+                    // Fire onDeviceReady event once all constructors have run and
+                    // cordova info has been received from native side.
+                    channel.join(function() {
+                        require('cordova').fireDocumentEvent('deviceready');
+                    }, channel.deviceReadyChannelsArray);
+
+                }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);
+            }
+        };
+
+    // boot up once native side is ready
+    channel.onNativeReady.subscribeOnce(_self.boot);
+
+    // _nativeReady is global variable that the native side can set
+    // to signify that the native code is ready. It is a global since
+    // it may be called before any cordova JS is ready.
+    if (window._nativeReady) {
+        channel.onNativeReady.fire();
+    }
+
+}(window));
+
+// file: lib/scripts/bootstrap-tizen.js
+require('cordova/channel').onNativeReady.fire();
+
+
+})();
\ No newline at end of file
diff --git a/samples/cordova-basic/css/style.css b/samples/cordova-basic/css/style.css
new file mode 100644
index 0000000..3f12cd3
--- /dev/null
+++ b/samples/cordova-basic/css/style.css
@@ -0,0 +1,120 @@
+* {
+    font-family: Lucida Sans, Arial, Helvetica, sans-serif;
+}
+
+body {
+    margin: 0px auto;
+}
+
+header h1 {
+    font-size: 36px;
+    margin: 0px;
+}
+
+header h2 {
+    font-size: 18px;
+    margin: 0px;
+    color: #888;
+    font-style: italic;
+}
+
+nav ul {
+    list-style: none;
+    padding: 0px;
+    display: block;
+    clear: right;
+    background-color: #666;
+    padding-left: 4px;
+    height: 24px;
+}
+
+nav ul li {
+    display: inline;
+    padding: 0px 20px 5px 10px;
+    height: 24px;
+    border-right: 1px solid #ccc;
+}
+
+nav ul li a {
+    color: #EFD3D3;
+    text-decoration: none;
+    font-size: 13px;
+    font-weight: bold;
+}
+
+nav ul li a:hover {
+    color: #fff;
+}
+
+article > header h1 {
+    font-size: 20px;
+    margin-left: 14px;
+}
+
+article > header h1 a {
+    color: #993333;
+}
+
+article > header h1 img {
+    vertical-align:middle;
+}
+
+article > section header h1 {
+    font-size: 16px;
+}
+
+article p {
+    clear: both;
+}
+
+article > section video {
+    width: 480px;
+    height: 200px;
+}
+
+article > section div.no-html5-video,
+article > section div#no-canvas {
+    width: 480px;
+    height: 40px;
+    border: 1px solid #993333;
+    text-align: center;
+    color: #993333;
+    font-size: 13px;
+    font-style: italic;
+    background-color: #F7E9E9;
+}
+
+article > section div#no-canvas {
+    display: none;
+}
+
+article > section form {
+    border: 1px solid #888;
+    -moz-border-radius: 10px;
+    -webkit-border-radius: 10px;
+    border-radius: 10px;    
+    -moz-box-shadow: 10px 10px 5px #888;
+    -webkit-box-shadow: 10px 10px 5px #888;
+    box-shadow: 10px 10px 5px #888;
+    background-color: #eee;
+    padding: 10px;
+    margin-bottom: 30px;
+}
+
+article > section label {
+    font-weight: bold;
+    font-size: 13px;
+}
+
+article > section input {
+    margin-bottom: 3px;
+    font-size: 13px;
+}
+
+footer p {
+    text-align: center;
+    font-size: 12px;
+    color: #888;
+    margin-top: 24px;
+}
+
diff --git a/samples/cordova-basic/icon.png b/samples/cordova-basic/icon.png
new file mode 100755
index 0000000..eef3cd9
--- /dev/null
+++ b/samples/cordova-basic/icon.png
Binary files differ
diff --git a/samples/cordova-basic/images/ic_cordova_32.png b/samples/cordova-basic/images/ic_cordova_32.png
new file mode 100755
index 0000000..b6fbeb8
--- /dev/null
+++ b/samples/cordova-basic/images/ic_cordova_32.png
Binary files differ
diff --git a/samples/cordova-basic/index.html b/samples/cordova-basic/index.html
new file mode 100644
index 0000000..174c1b5
--- /dev/null
+++ b/samples/cordova-basic/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, target-densityDpi=device-dpi">
+    <meta name="description" content="Cordova Tizen basic template generated by Tizen Web IDE"/>
+
+    <title>Tizen Web IDE - Tizen - Tizen basic Application</title>
+
+    <script type="text/javascript" src="cordova-2.0.0.js"></script>
+    
+    <link rel="stylesheet" type="text/css" href="css/style.css"/>
+    <script src="js/main.js"></script>
+</head>
+
+<body>
+  <header>
+    <hgroup>
+      <h1>Tizen Cordova Application</h1>
+      <h2>An empty template of a Cordova Tizen application</h2>
+    </hgroup>
+  </header>
+
+  <nav>
+    <ul>
+       <li><a href="#">Home</a></li>
+       <li><a href="#">About Us</a></li>
+       <li><a href="#">Contact Us</a></li>
+    </ul>
+  </nav>
+
+  <article>
+    <header>
+      <h1>
+        <img src="images/ic_cordova_32.png" /> Application Name
+      </h1>
+    </header>
+    <p>This is an empty template of a Cordova Tizen Web Application. Tizen will support multiple device categories:
+      <ul>
+        <li>smartphones, tablets and smart TVs
+        <li>netbooks, in-vehicle infotainment devices
+      </ul>
+    </p>
+    <section>
+      <p>This is a basic section of a document.</p>
+      <p>The following button displays live battery info by using the Cordova JavaScript API.</p>
+      <div id="divbutton1">
+        <button onclick="startBatteryInfoMonitoring();">Battery Info</button>
+      </div>
+    </section>
+  </article>
+
+  <footer>
+    <p>&copy; 2012 Company Name. All rights reserved.</p>
+  </footer>    
+</body>
+</html>
diff --git a/samples/cordova-basic/js/main.js b/samples/cordova-basic/js/main.js
new file mode 100644
index 0000000..eccea34
--- /dev/null
+++ b/samples/cordova-basic/js/main.js
@@ -0,0 +1,25 @@
+var deviceReady = false;
+
+function startBatteryInfoMonitoring() {
+	window.addEventListener("batterystatus", function (info) {
+		var batteryInfoStr = "Level = " + info.level + "%, Status: " + ((info.isPlugged) ? "Plugged" : "Unplugged");
+		document.getElementById('divbutton1').innerHTML = batteryInfoStr;
+	}, false);
+}
+
+// Initialize function called when page loading is finished
+var init = function () {
+    console.log("init() called");
+    document.addEventListener("deviceready", function() {
+        deviceReady = true;
+        console.log("Device = " + device.platform + ", Version = " + device.version);
+    }, false);
+
+    window.setTimeout(function() {
+        if (!deviceReady) {
+            alert("Cordova initialization failed !!!");
+        }
+    }, 1000);
+};
+
+window.onload = init;
diff --git a/samples/cordova-basic/sounds/beep.wav b/samples/cordova-basic/sounds/beep.wav
new file mode 100644
index 0000000..1e9797c
--- /dev/null
+++ b/samples/cordova-basic/sounds/beep.wav
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/.project b/samples/cordova-tizen-web-ui/.project
new file mode 100644
index 0000000..ace254a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/.project
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>cordova-tizen-web-ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>json.validation.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.jslint.nature.JSLintBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.project.builder.WACBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.css.nature.CSSBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+		<nature>json.validation.nature</nature>
+		<nature>org.tizen.web.jslint.nature.JSLintNature</nature>
+		<nature>org.tizen.web.WACnature</nature>
+		<nature>org.tizen.web.css.nature.CSSNature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+	</natures>
+</projectDescription>
diff --git a/samples/cordova-tizen-web-ui/config.xml b/samples/cordova-tizen-web-ui/config.xml
new file mode 100644
index 0000000..96cd10c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/config.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" version="2.0 Beta" viewmodes="fullscreen" id="http://yourdomain/cordova-tizen-web-ui">  
+	<icon src="icon.png"/>  
+	<content src="index.html"/>  
+	<feature name="http://tizen.org/api/application" required="true"/>  
+	<feature name="http://tizen.org/api/application.kill" required="true"/>  
+	<feature name="http://tizen.org/api/application.launch" required="true"/>  
+	<feature name="http://tizen.org/api/application.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact" required="true"/>  
+	<feature name="http://tizen.org/api/contact.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact.write" required="true"/>  
+	<feature name="http://tizen.org/api/systeminfo" required="true"/>  
+	<feature name="http://tizen.org/api/time" required="true"/>  
+	<feature name="http://tizen.org/api/time.read" required="true"/>  
+	<feature name="http://tizen.org/api/time.write" required="true"/>  
+	<feature name="http://tizen.org/api/tizen" required="true"/>  
+	<name>cordova-tizen-web-ui</name> 
+</widget>
diff --git a/samples/cordova-tizen-web-ui/cordova-2.0.0.js b/samples/cordova-tizen-web-ui/cordova-2.0.0.js
new file mode 100644
index 0000000..ee17d0d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/cordova-2.0.0.js
@@ -0,0 +1,6957 @@
+// commit 870218e03979cb7fb6fcae8cd8532008d163d6cc
+
+// File generated at :: Thu Aug 02 2012 17:18:02 GMT+0200 (CEST)
+
+/*
+ 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.
+*/
+
+;(function() {
+
+// file: lib/scripts/require.js
+var require,
+    define;
+
+(function () {
+    var modules = {};
+
+    function build(module) {
+        var factory = module.factory;
+        module.exports = {};
+        delete module.factory;
+        factory(require, module.exports, module);
+        return module.exports;
+    }
+
+    require = function (id) {
+        if (!modules[id]) {
+            throw "module " + id + " not found";
+        }
+        return modules[id].factory ? build(modules[id]) : modules[id].exports;
+    };
+
+    define = function (id, factory) {
+        if (modules[id]) {
+            throw "module " + id + " already defined";
+        }
+
+        modules[id] = {
+            id: id,
+            factory: factory
+        };
+    };
+
+    define.remove = function (id) {
+        delete modules[id];
+    };
+
+})();
+
+//Export for use in node
+if (typeof module === "object" && typeof require === "function") {
+    module.exports.require = require;
+    module.exports.define = define;
+}
+// file: lib/cordova.js
+define("cordova", function(require, exports, module) {
+var channel = require('cordova/channel');
+
+/**
+ * Listen for DOMContentLoaded and notify our channel subscribers.
+ */
+document.addEventListener('DOMContentLoaded', function() {
+    channel.onDOMContentLoaded.fire();
+}, false);
+if (document.readyState == 'complete' || document.readyState == 'interactive') {
+    channel.onDOMContentLoaded.fire();
+}
+
+/**
+ * Intercept calls to addEventListener + removeEventListener and handle deviceready,
+ * resume, and pause events.
+ */
+var m_document_addEventListener = document.addEventListener;
+var m_document_removeEventListener = document.removeEventListener;
+var m_window_addEventListener = window.addEventListener;
+var m_window_removeEventListener = window.removeEventListener;
+
+/**
+ * Houses custom event handlers to intercept on document + window event listeners.
+ */
+var documentEventHandlers = {},
+    windowEventHandlers = {};
+
+document.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof documentEventHandlers[e] != 'undefined') {
+        if (evt === 'deviceready') {
+            documentEventHandlers[e].subscribeOnce(handler);
+        } else {
+            documentEventHandlers[e].subscribe(handler);
+        }
+    } else {
+        m_document_addEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof windowEventHandlers[e] != 'undefined') {
+        windowEventHandlers[e].subscribe(handler);
+    } else {
+        m_window_addEventListener.call(window, evt, handler, capture);
+    }
+};
+
+document.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof documentEventHandlers[e] != "undefined") {
+        documentEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_document_removeEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof windowEventHandlers[e] != "undefined") {
+        windowEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_window_removeEventListener.call(window, evt, handler, capture);
+    }
+};
+
+function createEvent(type, data) {
+    var event = document.createEvent('Events');
+    event.initEvent(type, false, false);
+    if (data) {
+        for (var i in data) {
+            if (data.hasOwnProperty(i)) {
+                event[i] = data[i];
+            }
+        }
+    }
+    return event;
+}
+
+if(typeof window.console === "undefined") {
+    window.console = {
+        log:function(){}
+    };
+}
+
+var cordova = {
+    define:define,
+    require:require,
+    /**
+     * Methods to add/remove your own addEventListener hijacking on document + window.
+     */
+    addWindowEventHandler:function(event, opts) {
+        return (windowEventHandlers[event] = channel.create(event, opts));
+    },
+    addDocumentEventHandler:function(event, opts) {
+        return (documentEventHandlers[event] = channel.create(event, opts));
+    },
+    removeWindowEventHandler:function(event) {
+        delete windowEventHandlers[event];
+    },
+    removeDocumentEventHandler:function(event) {
+        delete documentEventHandlers[event];
+    },
+    /**
+     * Retreive original event handlers that were replaced by Cordova
+     *
+     * @return object
+     */
+    getOriginalHandlers: function() {
+        return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
+        'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
+    },
+    /**
+     * Method to fire event from native code
+     */
+    fireDocumentEvent: function(type, data) {
+        var evt = createEvent(type, data);
+        if (typeof documentEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                documentEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            document.dispatchEvent(evt);
+        }
+    },
+    fireWindowEvent: function(type, data) {
+        var evt = createEvent(type,data);
+        if (typeof windowEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                windowEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            window.dispatchEvent(evt);
+        }
+    },
+    // TODO: this is Android only; think about how to do this better
+    shuttingDown:false,
+    UsePolling:false,
+    // END TODO
+
+    // TODO: iOS only
+    // This queue holds the currently executing command and all pending
+    // commands executed with cordova.exec().
+    commandQueue:[],
+    // Indicates if we're currently in the middle of flushing the command
+    // queue on the native side.
+    commandQueueFlushing:false,
+    // END TODO
+    /**
+     * Plugin callback mechanism.
+     */
+    callbackId: 0,
+    callbacks:  {},
+    callbackStatus: {
+        NO_RESULT: 0,
+        OK: 1,
+        CLASS_NOT_FOUND_EXCEPTION: 2,
+        ILLEGAL_ACCESS_EXCEPTION: 3,
+        INSTANTIATION_EXCEPTION: 4,
+        MALFORMED_URL_EXCEPTION: 5,
+        IO_EXCEPTION: 6,
+        INVALID_ACTION: 7,
+        JSON_EXCEPTION: 8,
+        ERROR: 9
+    },
+
+    /**
+     * Called by native code when returning successful result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackSuccess: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+
+            // If result is to be sent to callback
+            if (args.status == cordova.callbackStatus.OK) {
+                try {
+                    if (cordova.callbacks[callbackId].success) {
+                        cordova.callbacks[callbackId].success(args.message);
+                    }
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+callbackId+" = "+e);
+                }
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+
+    /**
+     * Called by native code when returning error result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackError: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+            try {
+                if (cordova.callbacks[callbackId].fail) {
+                    cordova.callbacks[callbackId].fail(args.message);
+                }
+            }
+            catch (e) {
+                console.log("Error in error callback: "+callbackId+" = "+e);
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+    addConstructor: function(func) {
+        channel.onCordovaReady.subscribeOnce(function() {
+            try {
+                func();
+            } catch(e) {
+                console.log("Failed to run constructor: " + e);
+            }
+        });
+    }
+};
+
+// Register pause, resume and deviceready channels as events on document.
+channel.onPause = cordova.addDocumentEventHandler('pause');
+channel.onResume = cordova.addDocumentEventHandler('resume');
+channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
+
+module.exports = cordova;
+
+});
+
+// file: lib/common/builder.js
+define("cordova/builder", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+function each(objects, func, context) {
+    for (var prop in objects) {
+        if (objects.hasOwnProperty(prop)) {
+            func.apply(context, [objects[prop], prop]);
+        }
+    }
+}
+
+function include(parent, objects, clobber, merge) {
+    each(objects, function (obj, key) {
+        try {
+          var result = obj.path ? require(obj.path) : {};
+
+          if (clobber) {
+              // Clobber if it doesn't exist.
+              if (typeof parent[key] === 'undefined') {
+                  parent[key] = result;
+              } else if (typeof obj.path !== 'undefined') {
+                  // If merging, merge properties onto parent, otherwise, clobber.
+                  if (merge) {
+                      recursiveMerge(parent[key], result);
+                  } else {
+                      parent[key] = result;
+                  }
+              }
+              result = parent[key];
+          } else {
+            // Overwrite if not currently defined.
+            if (typeof parent[key] == 'undefined') {
+              parent[key] = result;
+            } else if (merge && typeof obj.path !== 'undefined') {
+              // If merging, merge parent onto result
+              recursiveMerge(result, parent[key]);
+              parent[key] = result;
+            } 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);
+          }
+        } catch(e) {
+          utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');
+        }
+    });
+}
+
+/**
+ * Merge properties from one object onto another recursively.  Properties from
+ * the src object will overwrite existing target property.
+ *
+ * @param target Object to merge properties into.
+ * @param src Object to merge properties from.
+ */
+function recursiveMerge(target, src) {
+    for (var prop in src) {
+        if (src.hasOwnProperty(prop)) {
+            if (typeof target.prototype !== 'undefined' && target.prototype.constructor === target) {
+                // If the target object is a constructor override off prototype.
+                target.prototype[prop] = src[prop];
+            } else {
+                target[prop] = typeof src[prop] === 'object' ? recursiveMerge(
+                        target[prop], src[prop]) : src[prop];
+            }
+        }
+    }
+    return target;
+}
+
+module.exports = {
+    build: function (objects) {
+        return {
+            intoButDontClobber: function (target) {
+                include(target, objects, false, false);
+            },
+            intoAndClobber: function(target) {
+                include(target, objects, true, false);
+            },
+            intoAndMerge: function(target) {
+                include(target, objects, true, true);
+            }
+        };
+    }
+};
+
+});
+
+// file: lib/common/channel.js
+define("cordova/channel", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+/**
+ * Custom pub-sub "channel" that can have functions subscribed to it
+ * This object is used to define and control firing of events for
+ * cordova initialization.
+ *
+ * The order of events during page load and Cordova startup is as follows:
+ *
+ * onDOMContentLoaded         Internal event that is received when the web page is loaded and parsed.
+ * onNativeReady              Internal event that indicates the Cordova native side is ready.
+ * onCordovaReady             Internal event fired when all Cordova JavaScript objects have been created.
+ * onCordovaInfoReady         Internal event fired when device properties are available.
+ * onCordovaConnectionReady   Internal event fired when the connection property has been set.
+ * onDeviceReady              User event fired to indicate that Cordova is ready
+ * onResume                   User event fired to indicate a start/resume lifecycle event
+ * onPause                    User event fired to indicate a pause lifecycle event
+ * onDestroy                  Internal event fired when app is being destroyed (User should use window.onunload event, not this one).
+ *
+ * The only Cordova events that user code should register for are:
+ *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
+ *      pause                 App has moved to background
+ *      resume                App has returned to foreground
+ *
+ * Listeners can be registered as:
+ *      document.addEventListener("deviceready", myDeviceReadyListener, false);
+ *      document.addEventListener("resume", myResumeListener, false);
+ *      document.addEventListener("pause", myPauseListener, false);
+ *
+ * The DOM lifecycle events should be used for saving and restoring state
+ *      window.onload
+ *      window.onunload
+ *
+ */
+
+/**
+ * Channel
+ * @constructor
+ * @param type  String the channel name
+ * @param opts  Object options to pass into the channel, currently
+ *                     supports:
+ *                     onSubscribe: callback that fires when
+ *                       something subscribes to the Channel. Sets
+ *                       context to the Channel.
+ *                     onUnsubscribe: callback that fires when
+ *                       something unsubscribes to the Channel. Sets
+ *                       context to the Channel.
+ */
+var Channel = function(type, opts) {
+    this.type = type;
+    this.handlers = {};
+    this.numHandlers = 0;
+    this.guid = 1;
+    this.fired = false;
+    this.enabled = true;
+    this.events = {
+        onSubscribe:null,
+        onUnsubscribe:null
+    };
+    if (opts) {
+        if (opts.onSubscribe) this.events.onSubscribe = opts.onSubscribe;
+        if (opts.onUnsubscribe) this.events.onUnsubscribe = opts.onUnsubscribe;
+    }
+},
+    channel = {
+        /**
+         * Calls the provided function only after all of the channels specified
+         * have been fired.
+         */
+        join: function (h, c) {
+            var i = c.length;
+            var len = i;
+            var f = function() {
+                if (!(--i)) h();
+            };
+            for (var j=0; j<len; j++) {
+                !c[j].fired?c[j].subscribeOnce(f):i--;
+            }
+            if (!i) h();
+        },
+        create: function (type, opts) {
+            channel[type] = new Channel(type, opts);
+            return channel[type];
+        },
+
+        /**
+         * cordova Channels that must fire before "deviceready" is fired.
+         */
+        deviceReadyChannelsArray: [],
+        deviceReadyChannelsMap: {},
+
+        /**
+         * Indicate that a feature needs to be initialized before it is ready to be used.
+         * This holds up Cordova's "deviceready" event until the feature has been initialized
+         * and Cordova.initComplete(feature) is called.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        waitForInitialization: function(feature) {
+            if (feature) {
+                var c = null;
+                if (this[feature]) {
+                    c = this[feature];
+                }
+                else {
+                    c = this.create(feature);
+                }
+                this.deviceReadyChannelsMap[feature] = c;
+                this.deviceReadyChannelsArray.push(c);
+            }
+        },
+
+        /**
+         * Indicate that initialization code has completed and the feature is ready to be used.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        initializationComplete: function(feature) {
+            var c = this.deviceReadyChannelsMap[feature];
+            if (c) {
+                c.fire();
+            }
+        }
+    };
+
+function forceFunction(f) {
+    if (f === null || f === undefined || typeof f != 'function') throw "Function required as first argument!";
+}
+
+/**
+ * Subscribes the given function to the channel. Any time that
+ * Channel.fire is called so too will the function.
+ * Optionally specify an execution context for the function
+ * and a guid that can be used to stop subscribing to the channel.
+ * Returns the guid.
+ */
+Channel.prototype.subscribe = function(f, c, g) {
+    // need a function to call
+    forceFunction(f);
+
+    var func = f;
+    if (typeof c == "object") { func = utils.close(c, f); }
+
+    g = g || func.observer_guid || f.observer_guid;
+    if (!g) {
+        // first time we've seen this subscriber
+        g = this.guid++;
+    }
+    else {
+        // subscriber already handled; dont set it twice
+        return g;
+    }
+    func.observer_guid = g;
+    f.observer_guid = g;
+    this.handlers[g] = func;
+    this.numHandlers++;
+    if (this.events.onSubscribe) this.events.onSubscribe.call(this);
+    if (this.fired) func.call(this);
+    return g;
+};
+
+/**
+ * Like subscribe but the function is only called once and then it
+ * auto-unsubscribes itself.
+ */
+Channel.prototype.subscribeOnce = function(f, c) {
+    // need a function to call
+    forceFunction(f);
+
+    var g = null;
+    var _this = this;
+    var m = function() {
+        f.apply(c || null, arguments);
+        _this.unsubscribe(g);
+    };
+    if (this.fired) {
+        if (typeof c == "object") { f = utils.close(c, f); }
+        f.apply(this, this.fireArgs);
+    } else {
+        g = this.subscribe(m);
+    }
+    return g;
+};
+
+/**
+ * Unsubscribes the function with the given guid from the channel.
+ */
+Channel.prototype.unsubscribe = function(g) {
+    // need a function to unsubscribe
+    if (g === null || g === undefined) { throw "You must pass _something_ into Channel.unsubscribe"; }
+
+    if (typeof g == 'function') { g = g.observer_guid; }
+    var handler = this.handlers[g];
+    if (handler) {
+        if (handler.observer_guid) handler.observer_guid=null;
+        this.handlers[g] = null;
+        delete this.handlers[g];
+        this.numHandlers--;
+        if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
+    }
+};
+
+/**
+ * Calls all functions subscribed to this channel.
+ */
+Channel.prototype.fire = function(e) {
+    if (this.enabled) {
+        var fail = false;
+        this.fired = true;
+        for (var item in this.handlers) {
+            var handler = this.handlers[item];
+            if (typeof handler == 'function') {
+                var rv = (handler.apply(this, arguments)===false);
+                fail = fail || rv;
+            }
+        }
+        this.fireArgs = arguments;
+        return !fail;
+    }
+    return true;
+};
+
+// defining them here so they are ready super fast!
+// DOM event that is received when the web page is loaded and parsed.
+channel.create('onDOMContentLoaded');
+
+// Event to indicate the Cordova native side is ready.
+channel.create('onNativeReady');
+
+// Event to indicate that all Cordova JavaScript objects have been created
+// and it's time to run plugin constructors.
+channel.create('onCordovaReady');
+
+// Event to indicate that device properties are available
+channel.create('onCordovaInfoReady');
+
+// Event to indicate that the connection property has been set.
+channel.create('onCordovaConnectionReady');
+
+// Event to indicate that Cordova is ready
+channel.create('onDeviceReady');
+
+// Event to indicate a resume lifecycle event
+channel.create('onResume');
+
+// Event to indicate a pause lifecycle event
+channel.create('onPause');
+
+// Event to indicate a destroy lifecycle event
+channel.create('onDestroy');
+
+// Channels that must fire before "deviceready" is fired.
+channel.waitForInitialization('onCordovaReady');
+channel.waitForInitialization('onCordovaConnectionReady');
+
+module.exports = channel;
+
+});
+
+// file: lib/common/common.js
+define("cordova/common", function(require, exports, module) {
+module.exports = {
+    objects: {
+        cordova: {
+            path: 'cordova',
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                },
+                logger: {
+                    path: 'cordova/plugin/logger'
+                }
+            }
+        },
+        Cordova: {
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        PhoneGap:{
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        navigator: {
+            children: {
+                notification: {
+                    path: 'cordova/plugin/notification'
+                },
+                accelerometer: {
+                    path: 'cordova/plugin/accelerometer'
+                },
+                battery: {
+                    path: 'cordova/plugin/battery'
+                },
+                camera:{
+                    path: 'cordova/plugin/Camera'
+                },
+                compass:{
+                    path: 'cordova/plugin/compass'
+                },
+                contacts: {
+                    path: 'cordova/plugin/contacts'
+                },
+                device:{
+                    children:{
+                        capture: {
+                            path: 'cordova/plugin/capture'
+                        }
+                    }
+                },
+                geolocation: {
+                    path: 'cordova/plugin/geolocation'
+                },
+                network: {
+                    children: {
+                        connection: {
+                            path: 'cordova/plugin/network'
+                        }
+                    }
+                },
+                splashscreen: {
+                    path: 'cordova/plugin/splashscreen'
+                }
+            }
+        },
+        Acceleration: {
+            path: 'cordova/plugin/Acceleration'
+        },
+        Camera:{
+            path: 'cordova/plugin/CameraConstants'
+        },
+        CameraPopoverOptions: {
+            path: 'cordova/plugin/CameraPopoverOptions'
+        },
+        CaptureError: {
+            path: 'cordova/plugin/CaptureError'
+        },
+        CaptureAudioOptions:{
+            path: 'cordova/plugin/CaptureAudioOptions'
+        },
+        CaptureImageOptions: {
+            path: 'cordova/plugin/CaptureImageOptions'
+        },
+        CaptureVideoOptions: {
+            path: 'cordova/plugin/CaptureVideoOptions'
+        },
+        CompassHeading:{
+            path: 'cordova/plugin/CompassHeading'
+        },
+        CompassError:{
+            path: 'cordova/plugin/CompassError'
+        },
+        ConfigurationData: {
+            path: 'cordova/plugin/ConfigurationData'
+        },
+        Connection: {
+            path: 'cordova/plugin/Connection'
+        },
+        Contact: {
+            path: 'cordova/plugin/Contact'
+        },
+        ContactAddress: {
+            path: 'cordova/plugin/ContactAddress'
+        },
+        ContactError: {
+            path: 'cordova/plugin/ContactError'
+        },
+        ContactField: {
+            path: 'cordova/plugin/ContactField'
+        },
+        ContactFindOptions: {
+            path: 'cordova/plugin/ContactFindOptions'
+        },
+        ContactName: {
+            path: 'cordova/plugin/ContactName'
+        },
+        ContactOrganization: {
+            path: 'cordova/plugin/ContactOrganization'
+        },
+        Coordinates: {
+            path: 'cordova/plugin/Coordinates'
+        },
+        device: {
+            path: 'cordova/plugin/device'
+        },
+        DirectoryEntry: {
+            path: 'cordova/plugin/DirectoryEntry'
+        },
+        DirectoryReader: {
+            path: 'cordova/plugin/DirectoryReader'
+        },
+        Entry: {
+            path: 'cordova/plugin/Entry'
+        },
+        File: {
+            path: 'cordova/plugin/File'
+        },
+        FileEntry: {
+            path: 'cordova/plugin/FileEntry'
+        },
+        FileError: {
+            path: 'cordova/plugin/FileError'
+        },
+        FileReader: {
+            path: 'cordova/plugin/FileReader'
+        },
+        FileSystem: {
+            path: 'cordova/plugin/FileSystem'
+        },
+        FileTransfer: {
+            path: 'cordova/plugin/FileTransfer'
+        },
+        FileTransferError: {
+            path: 'cordova/plugin/FileTransferError'
+        },
+        FileUploadOptions: {
+            path: 'cordova/plugin/FileUploadOptions'
+        },
+        FileUploadResult: {
+            path: 'cordova/plugin/FileUploadResult'
+        },
+        FileWriter: {
+            path: 'cordova/plugin/FileWriter'
+        },
+        Flags: {
+            path: 'cordova/plugin/Flags'
+        },
+        LocalFileSystem: {
+            path: 'cordova/plugin/LocalFileSystem'
+        },
+        Media: {
+            path: 'cordova/plugin/Media'
+        },
+        MediaError: {
+            path: 'cordova/plugin/MediaError'
+        },
+        MediaFile: {
+            path: 'cordova/plugin/MediaFile'
+        },
+        MediaFileData:{
+            path: 'cordova/plugin/MediaFileData'
+        },
+        Metadata:{
+            path: 'cordova/plugin/Metadata'
+        },
+        Position: {
+            path: 'cordova/plugin/Position'
+        },
+        PositionError: {
+            path: 'cordova/plugin/PositionError'
+        },
+        ProgressEvent: {
+            path: 'cordova/plugin/ProgressEvent'
+        },
+        requestFileSystem:{
+            path: 'cordova/plugin/requestFileSystem'
+        },
+        resolveLocalFileSystemURI:{
+            path: 'cordova/plugin/resolveLocalFileSystemURI'
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/exec.js
+define("cordova/exec", function(require, exports, module) {
+/**
+ * Execute a cordova command.  It is up to the native side whether this action
+ * is synchronous or asynchronous.  The native side can return:
+ *      Synchronous: PluginResult object as a JSON string
+ *      Asynchrounous: Empty string ""
+ * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
+ * depending upon the result of the action.
+ *
+ * @param {Function} successCB  The success callback
+ * @param {Function} failCB     The fail callback
+ * @param {String} service      The name of the service to use
+ * @param {String} action       Action to be run in cordova
+ * @param {String[]} [args]     Zero or more arguments to pass to the method
+ */
+
+var tizen = require('cordova/plugin/tizen/manager'),
+    cordova = require('cordova'),
+    utils = require('cordova/utils');
+
+module.exports = function(successCB, failCB, service, action, args) {
+
+    try {
+        var v = tizen.exec(successCB, failCB, service, action, args);
+
+        // If status is OK, then return value back to caller
+        if (v.status == cordova.callbackStatus.OK) {
+
+            // If there is a success callback, then call it now with returned value
+            if (successCB) {
+                try {
+                    successCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+ service + "." + action + " = " + e);
+                }
+
+            }
+            return v.message;
+        } else if (v.status == cordova.callbackStatus.NO_RESULT) {
+            // Nothing to do here
+        } else {
+            // If error, then display error
+            console.log("Error: " + service + "." + action + " Status=" + v.status + " Message=" + v.message);
+
+            // If there is a fail callback, then call it now with returned value
+            if (failCB) {
+                try {
+                    failCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in error callback: " + service + "." + action + " = "+e);
+                }
+            }
+            return null;
+        }
+    } catch (e) {
+        utils.alert("Error: " + e);
+    }
+};
+
+});
+
+// file: lib/tizen/platform.js
+define("cordova/platform", function(require, exports, module) {
+module.exports = {
+    id: "tizen",
+    initialize: function() {},
+    objects: {
+        device: {
+            path: "cordova/plugin/tizen/Device"
+        },
+        File: { // exists natively, override
+            path: "cordova/plugin/File"
+        },
+        FileReader: { // exists natively, override
+            path: "cordova/plugin/FileReader"
+        },
+        FileError: { //exists natively, override
+            path: "cordova/plugin/FileError"
+        }
+    },
+    merges: {
+        MediaError: { // exists natively
+            path: "cordova/plugin/tizen/MediaError"
+        },
+        navigator: {
+            children: {
+                device: {
+                    path: "cordova/plugin/tizen/Device"
+                },
+                contacts: {
+                    path: "cordova/plugin/tizen/contacts"
+                },
+               notification: {
+                   path: "cordova/plugin/tizen/Notification"
+               }
+            }
+        },
+        Contact: {
+            path: "cordova/plugin/tizen/Contact"
+        }
+    }
+};
+
+});
+
+// file: lib/common/plugin/Acceleration.js
+define("cordova/plugin/Acceleration", function(require, exports, module) {
+var Acceleration = function(x, y, z, timestamp) {
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.timestamp = timestamp || (new Date()).getTime();
+};
+
+module.exports = Acceleration;
+
+});
+
+// file: lib/common/plugin/Camera.js
+define("cordova/plugin/Camera", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    Camera = require('cordova/plugin/CameraConstants');
+
+var cameraExport = {};
+
+// Tack on the Camera Constants to the base camera plugin.
+for (var key in Camera) {
+    cameraExport[key] = Camera[key];
+}
+
+/**
+ * Gets a picture from source defined by "options.sourceType", and returns the
+ * image as defined by the "options.destinationType" option.
+
+ * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
+ *
+ * @param {Function} successCallback
+ * @param {Function} errorCallback
+ * @param {Object} options
+ */
+cameraExport.getPicture = function(successCallback, errorCallback, options) {
+    // successCallback required
+    if (typeof successCallback != "function") {
+        console.log("Camera Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback != "function")) {
+        console.log("Camera Error: errorCallback is not a function");
+        return;
+    }
+
+    var quality = 50;
+    if (options && typeof options.quality == "number") {
+        quality = options.quality;
+    } else if (options && typeof options.quality == "string") {
+        var qlity = parseInt(options.quality, 10);
+        if (isNaN(qlity) === false) {
+            quality = qlity.valueOf();
+        }
+    }
+
+    var destinationType = Camera.DestinationType.FILE_URI;
+    if (typeof options.destinationType == "number") {
+        destinationType = options.destinationType;
+    }
+
+    var sourceType = Camera.PictureSourceType.CAMERA;
+    if (typeof options.sourceType == "number") {
+        sourceType = options.sourceType;
+    }
+
+    var targetWidth = -1;
+    if (typeof options.targetWidth == "number") {
+        targetWidth = options.targetWidth;
+    } else if (typeof options.targetWidth == "string") {
+        var width = parseInt(options.targetWidth, 10);
+        if (isNaN(width) === false) {
+            targetWidth = width.valueOf();
+        }
+    }
+
+    var targetHeight = -1;
+    if (typeof options.targetHeight == "number") {
+        targetHeight = options.targetHeight;
+    } else if (typeof options.targetHeight == "string") {
+        var height = parseInt(options.targetHeight, 10);
+        if (isNaN(height) === false) {
+            targetHeight = height.valueOf();
+        }
+    }
+
+    var encodingType = Camera.EncodingType.JPEG;
+    if (typeof options.encodingType == "number") {
+        encodingType = options.encodingType;
+    }
+
+    var mediaType = Camera.MediaType.PICTURE;
+    if (typeof options.mediaType == "number") {
+        mediaType = options.mediaType;
+    }
+    var allowEdit = false;
+    if (typeof options.allowEdit == "boolean") {
+        allowEdit = options.allowEdit;
+    } else if (typeof options.allowEdit == "number") {
+        allowEdit = options.allowEdit <= 0 ? false : true;
+    }
+    var correctOrientation = false;
+    if (typeof options.correctOrientation == "boolean") {
+        correctOrientation = options.correctOrientation;
+    } else if (typeof options.correctOrientation == "number") {
+        correctOrientation = options.correctOrientation <=0 ? false : true;
+    }
+    var saveToPhotoAlbum = false;
+    if (typeof options.saveToPhotoAlbum == "boolean") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum;
+    } else if (typeof options.saveToPhotoAlbum == "number") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum <=0 ? false : true;
+    }
+    var popoverOptions = null;
+    if (typeof options.popoverOptions == "object") {
+        popoverOptions = options.popoverOptions;
+    }
+
+    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
+
+    exec(successCallback, errorCallback, "Camera", "takePicture", args);
+};
+
+cameraExport.cleanup = function(successCallback, errorCallback) {
+    exec(successCallback, errorCallback, "Camera", "cleanup", []);
+};
+
+module.exports = cameraExport;
+});
+
+// file: lib/common/plugin/CameraConstants.js
+define("cordova/plugin/CameraConstants", function(require, exports, module) {
+module.exports = {
+  DestinationType:{
+    DATA_URL: 0,         // Return base64 encoded string
+    FILE_URI: 1          // Return file uri (content://media/external/images/media/2 for Android)
+  },
+  EncodingType:{
+    JPEG: 0,             // Return JPEG encoded image
+    PNG: 1               // Return PNG encoded image
+  },
+  MediaType:{
+    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
+    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
+    ALLMEDIA : 2         // allow selection from all media types
+  },
+  PictureSourceType:{
+    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
+    CAMERA : 1,          // Take picture from camera
+    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
+  },
+  PopoverArrowDirection:{
+      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
+      ARROW_DOWN : 2,
+      ARROW_LEFT : 4,
+      ARROW_RIGHT : 8,
+      ARROW_ANY : 15
+  }
+};
+});
+
+// file: lib/common/plugin/CameraPopoverOptions.js
+define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
+var Camera = require('cordova/plugin/CameraConstants');
+
+/**
+ * Encapsulates options for iOS Popover image picker
+ */
+var CameraPopoverOptions = function(x,y,width,height,arrowDir){
+    // information of rectangle that popover should be anchored to
+    this.x = x || 0;
+    this.y = y || 32;
+    this.width = width || 320;
+    this.height = height || 480;
+    // The direction of the popover arrow
+    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
+};
+
+module.exports = CameraPopoverOptions;
+});
+
+// file: lib/common/plugin/CaptureAudioOptions.js
+define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
+/**
+ * Encapsulates all audio capture operation configuration options.
+ */
+var CaptureAudioOptions = function(){
+    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single sound clip in seconds.
+    this.duration = 0;
+    // The selected audio mode. Must match with one of the elements in supportedAudioModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureAudioOptions;
+});
+
+// file: lib/common/plugin/CaptureError.js
+define("cordova/plugin/CaptureError", function(require, exports, module) {
+/**
+ * The CaptureError interface encapsulates all errors in the Capture API.
+ */
+var CaptureError = function(c) {
+   this.code = c || null;
+};
+
+// Camera or microphone failed to capture image or sound.
+CaptureError.CAPTURE_INTERNAL_ERR = 0;
+// Camera application or audio capture application is currently serving other capture request.
+CaptureError.CAPTURE_APPLICATION_BUSY = 1;
+// Invalid use of the API (e.g. limit parameter has value less than one).
+CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
+// User exited camera application or audio capture application before capturing anything.
+CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
+// The requested capture operation is not supported.
+CaptureError.CAPTURE_NOT_SUPPORTED = 20;
+
+module.exports = CaptureError;
+});
+
+// file: lib/common/plugin/CaptureImageOptions.js
+define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
+/**
+ * Encapsulates all image capture operation configuration options.
+ */
+var CaptureImageOptions = function(){
+    // Upper limit of images user can take. Value must be equal or greater than 1.
+    this.limit = 1;
+    // The selected image mode. Must match with one of the elements in supportedImageModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureImageOptions;
+});
+
+// file: lib/common/plugin/CaptureVideoOptions.js
+define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
+/**
+ * Encapsulates all video capture operation configuration options.
+ */
+var CaptureVideoOptions = function(){
+    // Upper limit of videos user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single video clip in seconds.
+    this.duration = 0;
+    // The selected video mode. Must match with one of the elements in supportedVideoModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureVideoOptions;
+});
+
+// file: lib/common/plugin/CompassError.js
+define("cordova/plugin/CompassError", function(require, exports, module) {
+/**
+ *  CompassError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var CompassError = function(err) {
+    this.code = (err !== undefined ? err : null);
+};
+
+CompassError.COMPASS_INTERNAL_ERR = 0;
+CompassError.COMPASS_NOT_SUPPORTED = 20;
+
+module.exports = CompassError;
+});
+
+// file: lib/common/plugin/CompassHeading.js
+define("cordova/plugin/CompassHeading", function(require, exports, module) {
+var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
+  this.magneticHeading = (magneticHeading !== undefined ? magneticHeading : null);
+  this.trueHeading = (trueHeading !== undefined ? trueHeading : null);
+  this.headingAccuracy = (headingAccuracy !== undefined ? headingAccuracy : null);
+  this.timestamp = (timestamp !== undefined ? timestamp : new Date().getTime());
+};
+
+module.exports = CompassHeading;
+});
+
+// file: lib/common/plugin/ConfigurationData.js
+define("cordova/plugin/ConfigurationData", function(require, exports, module) {
+/**
+ * Encapsulates a set of parameters that the capture device supports.
+ */
+function ConfigurationData() {
+    // The ASCII-encoded string in lower case representing the media type.
+    this.type = null;
+    // The height attribute represents height of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0.
+    this.height = 0;
+    // The width attribute represents width of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0
+    this.width = 0;
+}
+
+module.exports = ConfigurationData;
+});
+
+// file: lib/common/plugin/Connection.js
+define("cordova/plugin/Connection", function(require, exports, module) {
+/**
+ * Network status
+ */
+module.exports = {
+        UNKNOWN: "unknown",
+        ETHERNET: "ethernet",
+        WIFI: "wifi",
+        CELL_2G: "2g",
+        CELL_3G: "3g",
+        CELL_4G: "4g",
+        NONE: "none"
+};
+});
+
+// file: lib/common/plugin/Contact.js
+define("cordova/plugin/Contact", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils');
+
+/**
+* Converts primitives into Complex Object
+* Currently only used for Date fields
+*/
+function convertIn(contact) {
+    var value = contact.birthday;
+    try {
+      contact.birthday = new Date(parseFloat(value));
+    } catch (exception){
+      console.log("Cordova Contact convertIn error: exception creating date.");
+    }
+    return contact;
+}
+
+/**
+* Converts Complex objects into primitives
+* Only conversion at present is for Dates.
+**/
+
+function convertOut(contact) {
+    var value = contact.birthday;
+    if (value !== null) {
+        // try to make it a Date object if it is not already
+        if (!utils.isDate(value)){
+            try {
+                value = new Date(value);
+            } catch(exception){
+                value = null;
+            }
+        }
+        if (utils.isDate(value)){
+            value = value.valueOf(); // convert to milliseconds
+        }
+        contact.birthday = value;
+    }
+    return contact;
+}
+
+/**
+* Contains information about a single contact.
+* @constructor
+* @param {DOMString} id unique identifier
+* @param {DOMString} displayName
+* @param {ContactName} name
+* @param {DOMString} nickname
+* @param {Array.<ContactField>} phoneNumbers array of phone numbers
+* @param {Array.<ContactField>} emails array of email addresses
+* @param {Array.<ContactAddress>} addresses array of addresses
+* @param {Array.<ContactField>} ims instant messaging user ids
+* @param {Array.<ContactOrganization>} organizations
+* @param {DOMString} birthday contact's birthday
+* @param {DOMString} note user notes about contact
+* @param {Array.<ContactField>} photos
+* @param {Array.<ContactField>} categories
+* @param {Array.<ContactField>} urls contact's web sites
+*/
+var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
+    ims, organizations, birthday, note, photos, categories, urls) {
+    this.id = id || null;
+    this.rawId = null;
+    this.displayName = displayName || null;
+    this.name = name || null; // ContactName
+    this.nickname = nickname || null;
+    this.phoneNumbers = phoneNumbers || null; // ContactField[]
+    this.emails = emails || null; // ContactField[]
+    this.addresses = addresses || null; // ContactAddress[]
+    this.ims = ims || null; // ContactField[]
+    this.organizations = organizations || null; // ContactOrganization[]
+    this.birthday = birthday || null;
+    this.note = note || null;
+    this.photos = photos || null; // ContactField[]
+    this.categories = categories || null; // ContactField[]
+    this.urls = urls || null; // ContactField[]
+};
+
+/**
+* Removes contact from device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.remove = function(successCB, errorCB) {
+    var fail = function(code) {
+        errorCB(new ContactError(code));
+    };
+    if (this.id === null) {
+        fail(ContactError.UNKNOWN_ERROR);
+    }
+    else {
+        exec(successCB, fail, "Contacts", "remove", [this.id]);
+    }
+};
+
+/**
+* Creates a deep copy of this Contact.
+* With the contact ID set to null.
+* @return copy of this Contact
+*/
+Contact.prototype.clone = function() {
+    var clonedContact = utils.clone(this);
+    var i;
+    clonedContact.id = null;
+    clonedContact.rawId = null;
+    // Loop through and clear out any id's in phones, emails, etc.
+    if (clonedContact.phoneNumbers) {
+        for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
+            clonedContact.phoneNumbers[i].id = null;
+        }
+    }
+    if (clonedContact.emails) {
+        for (i = 0; i < clonedContact.emails.length; i++) {
+            clonedContact.emails[i].id = null;
+        }
+    }
+    if (clonedContact.addresses) {
+        for (i = 0; i < clonedContact.addresses.length; i++) {
+            clonedContact.addresses[i].id = null;
+        }
+    }
+    if (clonedContact.ims) {
+        for (i = 0; i < clonedContact.ims.length; i++) {
+            clonedContact.ims[i].id = null;
+        }
+    }
+    if (clonedContact.organizations) {
+        for (i = 0; i < clonedContact.organizations.length; i++) {
+            clonedContact.organizations[i].id = null;
+        }
+    }
+    if (clonedContact.categories) {
+        for (i = 0; i < clonedContact.categories.length; i++) {
+            clonedContact.categories[i].id = null;
+        }
+    }
+    if (clonedContact.photos) {
+        for (i = 0; i < clonedContact.photos.length; i++) {
+            clonedContact.photos[i].id = null;
+        }
+    }
+    if (clonedContact.urls) {
+        for (i = 0; i < clonedContact.urls.length; i++) {
+            clonedContact.urls[i].id = null;
+        }
+    }
+    return clonedContact;
+};
+
+/**
+* Persists contact to device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.save = function(successCB, errorCB) {
+  var fail = function(code) {
+      errorCB(new ContactError(code));
+  };
+    var success = function(result) {
+      if (result) {
+          if (typeof successCB === 'function') {
+              var fullContact = require('cordova/plugin/contacts').create(result);
+              successCB(convertIn(fullContact));
+          }
+      }
+      else {
+          // no Entry object returned
+          fail(ContactError.UNKNOWN_ERROR);
+      }
+  };
+    var dupContact = convertOut(utils.clone(this));
+    exec(success, fail, "Contacts", "save", [dupContact]);
+};
+
+
+module.exports = Contact;
+
+});
+
+// file: lib/common/plugin/ContactAddress.js
+define("cordova/plugin/ContactAddress", function(require, exports, module) {
+/**
+* Contact address.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code
+* @param formatted // NOTE: not a W3C standard
+* @param streetAddress
+* @param locality
+* @param region
+* @param postalCode
+* @param country
+*/
+
+var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.formatted = formatted || null;
+    this.streetAddress = streetAddress || null;
+    this.locality = locality || null;
+    this.region = region || null;
+    this.postalCode = postalCode || null;
+    this.country = country || null;
+};
+
+module.exports = ContactAddress;
+});
+
+// file: lib/common/plugin/ContactError.js
+define("cordova/plugin/ContactError", function(require, exports, module) {
+/**
+ *  ContactError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var ContactError = function(err) {
+    this.code = (typeof err != 'undefined' ? err : null);
+};
+
+/**
+ * Error codes
+ */
+ContactError.UNKNOWN_ERROR = 0;
+ContactError.INVALID_ARGUMENT_ERROR = 1;
+ContactError.TIMEOUT_ERROR = 2;
+ContactError.PENDING_OPERATION_ERROR = 3;
+ContactError.IO_ERROR = 4;
+ContactError.NOT_SUPPORTED_ERROR = 5;
+ContactError.PERMISSION_DENIED_ERROR = 20;
+
+module.exports = ContactError;
+});
+
+// file: lib/common/plugin/ContactField.js
+define("cordova/plugin/ContactField", function(require, exports, module) {
+/**
+* Generic contact field.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param type
+* @param value
+* @param pref
+*/
+var ContactField = function(type, value, pref) {
+    this.id = null;
+    this.type = (type && type.toString()) || null;
+    this.value = (value && value.toString()) || null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+};
+
+module.exports = ContactField;
+});
+
+// file: lib/common/plugin/ContactFindOptions.js
+define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
+/**
+ * ContactFindOptions.
+ * @constructor
+ * @param filter used to match contacts against
+ * @param multiple boolean used to determine if more than one contact should be returned
+ */
+
+var ContactFindOptions = function(filter, multiple) {
+    this.filter = filter || '';
+    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
+};
+
+module.exports = ContactFindOptions;
+});
+
+// file: lib/common/plugin/ContactName.js
+define("cordova/plugin/ContactName", function(require, exports, module) {
+/**
+* Contact name.
+* @constructor
+* @param formatted // NOTE: not part of W3C standard
+* @param familyName
+* @param givenName
+* @param middle
+* @param prefix
+* @param suffix
+*/
+var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
+    this.formatted = formatted || null;
+    this.familyName = familyName || null;
+    this.givenName = givenName || null;
+    this.middleName = middle || null;
+    this.honorificPrefix = prefix || null;
+    this.honorificSuffix = suffix || null;
+};
+
+module.exports = ContactName;
+});
+
+// file: lib/common/plugin/ContactOrganization.js
+define("cordova/plugin/ContactOrganization", function(require, exports, module) {
+/**
+* Contact organization.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param name
+* @param dept
+* @param title
+* @param startDate
+* @param endDate
+* @param location
+* @param desc
+*/
+
+var ContactOrganization = function(pref, type, name, dept, title) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.name = name || null;
+    this.department = dept || null;
+    this.title = title || null;
+};
+
+module.exports = ContactOrganization;
+});
+
+// file: lib/common/plugin/Coordinates.js
+define("cordova/plugin/Coordinates", function(require, exports, module) {
+/**
+ * This class contains position information.
+ * @param {Object} lat
+ * @param {Object} lng
+ * @param {Object} alt
+ * @param {Object} acc
+ * @param {Object} head
+ * @param {Object} vel
+ * @param {Object} altacc
+ * @constructor
+ */
+var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
+    /**
+     * The latitude of the position.
+     */
+    this.latitude = lat;
+    /**
+     * The longitude of the position,
+     */
+    this.longitude = lng;
+    /**
+     * The accuracy of the position.
+     */
+    this.accuracy = acc;
+    /**
+     * The altitude of the position.
+     */
+    this.altitude = (alt !== undefined ? alt : null);
+    /**
+     * The direction the device is moving at the position.
+     */
+    this.heading = (head !== undefined ? head : null);
+    /**
+     * The velocity with which the device is moving at the position.
+     */
+    this.speed = (vel !== undefined ? vel : null);
+
+    if (this.speed === 0 || this.speed === null) {
+        this.heading = NaN;
+    }
+
+    /**
+     * The altitude accuracy of the position.
+     */
+    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
+};
+
+module.exports = Coordinates;
+
+});
+
+// file: lib/common/plugin/DirectoryEntry.js
+define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileError = require('cordova/plugin/FileError'),
+    DirectoryReader = require('cordova/plugin/DirectoryReader');
+
+/**
+ * An interface representing a directory on the file system.
+ *
+ * {boolean} isFile always false (readonly)
+ * {boolean} isDirectory always true (readonly)
+ * {DOMString} name of the directory, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the directory (readonly)
+ * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
+ */
+var DirectoryEntry = function(name, fullPath) {
+     DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
+};
+
+utils.extend(DirectoryEntry, Entry);
+
+/**
+ * Creates a new DirectoryReader to read entries from this directory
+ */
+DirectoryEntry.prototype.createReader = function() {
+    return new DirectoryReader(this.fullPath);
+};
+
+/**
+ * Creates or looks up a directory
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
+ * @param {Flags} options to create or excluively create the directory
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
+};
+
+/**
+ * Deletes a directory and all of it's contents
+ *
+ * @param {Function} successCallback is called with no parameters
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
+};
+
+/**
+ * Creates or looks up a file
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
+ * @param {Flags} options to create or excluively create the file
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var FileEntry = require('cordova/plugin/FileEntry');
+        var entry = new FileEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
+};
+
+module.exports = DirectoryEntry;
+
+});
+
+// file: lib/common/plugin/DirectoryReader.js
+define("cordova/plugin/DirectoryReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError') ;
+
+/**
+ * An interface that lists the files and directories in a directory.
+ */
+function DirectoryReader(path) {
+    this.path = path || null;
+}
+
+/**
+ * Returns a list of entries from a directory.
+ *
+ * @param {Function} successCallback is called with a list of entries
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var retVal = [];
+        for (var i=0; i<result.length; i++) {
+            var entry = null;
+            if (result[i].isDirectory) {
+                entry = new (require('cordova/plugin/DirectoryEntry'))();
+            }
+            else if (result[i].isFile) {
+                entry = new (require('cordova/plugin/FileEntry'))();
+            }
+            entry.isDirectory = result[i].isDirectory;
+            entry.isFile = result[i].isFile;
+            entry.name = result[i].name;
+            entry.fullPath = result[i].fullPath;
+            retVal.push(entry);
+        }
+        successCallback(retVal);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "readEntries", [this.path]);
+};
+
+module.exports = DirectoryReader;
+
+});
+
+// file: lib/common/plugin/Entry.js
+define("cordova/plugin/Entry", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    Metadata = require('cordova/plugin/Metadata');
+
+/**
+ * Represents a file or directory on the local file system.
+ *
+ * @param isFile
+ *            {boolean} true if Entry is a file (readonly)
+ * @param isDirectory
+ *            {boolean} true if Entry is a directory (readonly)
+ * @param name
+ *            {DOMString} name of the file or directory, excluding the path
+ *            leading to it (readonly)
+ * @param fullPath
+ *            {DOMString} the absolute full path to the file or directory
+ *            (readonly)
+ */
+function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
+    this.isFile = (typeof isFile != 'undefined'?isFile:false);
+    this.isDirectory = (typeof isDirectory != 'undefined'?isDirectory:false);
+    this.name = name || '';
+    this.fullPath = fullPath || '';
+    this.filesystem = fileSystem || null;
+}
+
+/**
+ * Look up the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ */
+Entry.prototype.getMetadata = function(successCallback, errorCallback) {
+  var success = typeof successCallback !== 'function' ? null : function(lastModified) {
+      var metadata = new Metadata(lastModified);
+      successCallback(metadata);
+  };
+  var fail = typeof errorCallback !== 'function' ? null : function(code) {
+      errorCallback(new FileError(code));
+  };
+
+  exec(success, fail, "File", "getMetadata", [this.fullPath]);
+};
+
+/**
+ * Set the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ * @param metadataObject
+ *            {Object} keys and values to set
+ */
+Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
+
+  exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
+};
+
+/**
+ * Move a file or directory to a new location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to move this entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new DirectoryEntry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+    // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Copy a directory to a different location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to copy the entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new Entry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+
+        // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        // success callback
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Return a URL that can be used to identify this entry.
+ */
+Entry.prototype.toURL = function() {
+    // fullPath attribute contains the full URL
+    return this.fullPath;
+};
+
+/**
+ * Returns a URI that can be used to identify this entry.
+ *
+ * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
+ * @return uri
+ */
+Entry.prototype.toURI = function(mimeType) {
+    console.log("DEPRECATED: Update your code to use 'toURL'");
+    // fullPath attribute contains the full URI
+    return this.toURL();
+};
+
+/**
+ * Remove a file or directory. It is an error to attempt to delete a
+ * directory that is not empty. It is an error to attempt to delete a
+ * root directory of a file system.
+ *
+ * @param successCallback {Function} called with no parameters
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.remove = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "remove", [this.fullPath]);
+};
+
+/**
+ * Look up the parent DirectoryEntry of this entry.
+ *
+ * @param successCallback {Function} called with the parent DirectoryEntry object
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.getParent = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getParent", [this.fullPath]);
+};
+
+module.exports = Entry;
+});
+
+// file: lib/common/plugin/File.js
+define("cordova/plugin/File", function(require, exports, module) {
+/**
+ * Constructor.
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+
+var File = function(name, fullPath, type, lastModifiedDate, size){
+    this.name = name || '';
+    this.fullPath = fullPath || null;
+    this.type = type || null;
+    this.lastModifiedDate = lastModifiedDate || null;
+    this.size = size || 0;
+};
+
+module.exports = File;
+});
+
+// file: lib/common/plugin/FileEntry.js
+define("cordova/plugin/FileEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileWriter = require('cordova/plugin/FileWriter'),
+    File = require('cordova/plugin/File'),
+    FileError = require('cordova/plugin/FileError');
+
+/**
+ * An interface representing a file on the file system.
+ *
+ * {boolean} isFile always true (readonly)
+ * {boolean} isDirectory always false (readonly)
+ * {DOMString} name of the file, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the file (readonly)
+ * {FileSystem} filesystem on which the file resides (readonly)
+ */
+var FileEntry = function(name, fullPath) {
+     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
+};
+
+utils.extend(FileEntry, Entry);
+
+/**
+ * Creates a new FileWriter associated with the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new FileWriter
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
+    this.file(function(filePointer) {
+        var writer = new FileWriter(filePointer);
+
+        if (writer.fileName === null || writer.fileName === "") {
+            if (typeof errorCallback === "function") {
+                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
+            }
+        } else {
+            if (typeof successCallback === "function") {
+                successCallback(writer);
+            }
+        }
+    }, errorCallback);
+};
+
+/**
+ * Returns a File that represents the current state of the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new File object
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.file = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(f) {
+        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
+        successCallback(file);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
+};
+
+
+module.exports = FileEntry;
+});
+
+// file: lib/common/plugin/FileError.js
+define("cordova/plugin/FileError", function(require, exports, module) {
+/**
+ * FileError
+ */
+function FileError(error) {
+  this.code = error || null;
+}
+
+// File error codes
+// Found in DOMException
+FileError.NOT_FOUND_ERR = 1;
+FileError.SECURITY_ERR = 2;
+FileError.ABORT_ERR = 3;
+
+// Added by File API specification
+FileError.NOT_READABLE_ERR = 4;
+FileError.ENCODING_ERR = 5;
+FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
+FileError.INVALID_STATE_ERR = 7;
+FileError.SYNTAX_ERR = 8;
+FileError.INVALID_MODIFICATION_ERR = 9;
+FileError.QUOTA_EXCEEDED_ERR = 10;
+FileError.TYPE_MISMATCH_ERR = 11;
+FileError.PATH_EXISTS_ERR = 12;
+
+module.exports = FileError;
+});
+
+// file: lib/common/plugin/FileReader.js
+define("cordova/plugin/FileReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class reads the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To read from the SD card, the file name is "sdcard/my_file.txt"
+ * @constructor
+ */
+var FileReader = function() {
+    this.fileName = "";
+
+    this.readyState = 0; // FileReader.EMPTY
+
+    // File data
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onloadstart = null;    // When the read starts.
+    this.onprogress = null;     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)
+    this.onload = null;         // When the read has successfully completed.
+    this.onerror = null;        // When the read has failed (see errors).
+    this.onloadend = null;      // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the read has been aborted. For instance, by invoking the abort() method.
+};
+
+// States
+FileReader.EMPTY = 0;
+FileReader.LOADING = 1;
+FileReader.DONE = 2;
+
+/**
+ * Abort reading file.
+ */
+FileReader.prototype.abort = function() {
+    this.result = null;
+
+    if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
+      return;
+    }
+
+    this.readyState = FileReader.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === 'function') {
+        this.onabort(new ProgressEvent('abort', {target:this}));
+    }
+    // If load end callback
+    if (typeof this.onloadend === 'function') {
+        this.onloadend(new ProgressEvent('loadend', {target:this}));
+    }
+};
+
+/**
+ * Read text file.
+ *
+ * @param file          {File} File object containing file properties
+ * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
+ */
+FileReader.prototype.readAsText = function(file, encoding) {
+    // Figure out pathing
+    this.fileName = '';
+    if (typeof file.fullPath === 'undefined') {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    // Default encoding is UTF-8
+    var enc = encoding ? encoding : "UTF-8";
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // null result
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsText", [this.fileName, enc]);
+};
+
+
+/**
+ * Read file and return data as a base64 encoded data url.
+ * A data url is of the form:
+ *      data:[<mediatype>][;base64],<data>
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsDataURL = function(file) {
+    this.fileName = "";
+    if (typeof file.fullPath === "undefined") {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsDataURL", [this.fileName]);
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsBinaryString = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('method "readAsBinaryString" is not supported at this time.');
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsArrayBuffer = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('This method is not supported at this time.');
+};
+
+module.exports = FileReader;
+});
+
+// file: lib/common/plugin/FileSystem.js
+define("cordova/plugin/FileSystem", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+
+/**
+ * An interface representing a file system
+ *
+ * @constructor
+ * {DOMString} name the unique name of the file system (readonly)
+ * {DirectoryEntry} root directory of the file system (readonly)
+ */
+var FileSystem = function(name, root) {
+    this.name = name || null;
+    if (root) {
+        this.root = new DirectoryEntry(root.name, root.fullPath);
+    }
+};
+
+module.exports = FileSystem;
+
+});
+
+// file: lib/common/plugin/FileTransfer.js
+define("cordova/plugin/FileTransfer", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileTransferError = require('cordova/plugin/FileTransferError');
+
+/**
+ * FileTransfer uploads a file to a remote server.
+ * @constructor
+ */
+var FileTransfer = function() {};
+
+/**
+* Given an absolute file path, uploads a file on the device to a remote server
+* using a multipart HTTP request.
+* @param filePath {String}           Full path of the file on the device
+* @param server {String}             URL of the server to receive the file
+* @param successCallback (Function}  Callback to be invoked when upload has completed
+* @param errorCallback {Function}    Callback to be invoked upon error
+* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
+* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
+*/
+FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
+    // sanity parameter checking
+    if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
+    // check for options
+    var fileKey = null;
+    var fileName = null;
+    var mimeType = null;
+    var params = null;
+    var chunkedMode = true;
+    var headers = null;
+    if (options) {
+        fileKey = options.fileKey;
+        fileName = options.fileName;
+        mimeType = options.mimeType;
+        headers = options.headers;
+        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
+            chunkedMode = options.chunkedMode;
+        }
+        if (options.params) {
+            params = options.params;
+        }
+        else {
+            params = {};
+        }
+    }
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers]);
+};
+
+/**
+ * Downloads a file form a given URL and saves it to the specified directory.
+ * @param source {String}          URL of the server to receive the file
+ * @param target {String}         Full path of the file on the device
+ * @param successCallback (Function}  Callback to be invoked when upload has completed
+ * @param errorCallback {Function}    Callback to be invoked upon error
+ */
+FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
+    // sanity parameter checking
+    if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
+    var win = function(result) {
+        var entry = null;
+        if (result.isDirectory) {
+            entry = new (require('cordova/plugin/DirectoryEntry'))();
+        }
+        else if (result.isFile) {
+            entry = new (require('cordova/plugin/FileEntry'))();
+        }
+        entry.isDirectory = result.isDirectory;
+        entry.isFile = result.isFile;
+        entry.name = result.name;
+        entry.fullPath = result.fullPath;
+        successCallback(entry);
+    };
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
+};
+
+module.exports = FileTransfer;
+
+});
+
+// file: lib/common/plugin/FileTransferError.js
+define("cordova/plugin/FileTransferError", function(require, exports, module) {
+/**
+ * FileTransferError
+ * @constructor
+ */
+var FileTransferError = function(code, source, target, status) {
+    this.code = code || null;
+    this.source = source || null;
+    this.target = target || null;
+    this.http_status = status || null;
+};
+
+FileTransferError.FILE_NOT_FOUND_ERR = 1;
+FileTransferError.INVALID_URL_ERR = 2;
+FileTransferError.CONNECTION_ERR = 3;
+
+module.exports = FileTransferError;
+
+});
+
+// file: lib/common/plugin/FileUploadOptions.js
+define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
+/**
+ * Options to customize the HTTP request used to upload files.
+ * @constructor
+ * @param fileKey {String}   Name of file request parameter.
+ * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
+ * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
+ * @param params {Object}    Object with key: value params to send to the server.
+ * @param headers {Object}   Keys are header names, values are header values. Multiple
+ *                           headers of the same name are not supported.
+ */
+var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {
+    this.fileKey = fileKey || null;
+    this.fileName = fileName || null;
+    this.mimeType = mimeType || null;
+    this.params = params || null;
+    this.headers = headers || null;
+};
+
+module.exports = FileUploadOptions;
+
+});
+
+// file: lib/common/plugin/FileUploadResult.js
+define("cordova/plugin/FileUploadResult", function(require, exports, module) {
+/**
+ * FileUploadResult
+ * @constructor
+ */
+var FileUploadResult = function() {
+    this.bytesSent = 0;
+    this.responseCode = null;
+    this.response = null;
+};
+
+module.exports = FileUploadResult;
+});
+
+// file: lib/common/plugin/FileWriter.js
+define("cordova/plugin/FileWriter", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class writes to the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To write to the SD card, the file name is "sdcard/my_file.txt"
+ *
+ * @constructor
+ * @param file {File} File object containing file properties
+ * @param append if true write to the end of the file, otherwise overwrite the file
+ */
+var FileWriter = function(file) {
+    this.fileName = "";
+    this.length = 0;
+    if (file) {
+        this.fileName = file.fullPath || file;
+        this.length = file.size || 0;
+    }
+    // default is to write at the beginning of the file
+    this.position = 0;
+
+    this.readyState = 0; // EMPTY
+
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onwritestart = null;   // When writing starts
+    this.onprogress = null;     // While writing the file, and reporting partial file data
+    this.onwrite = null;        // When the write has successfully completed.
+    this.onwriteend = null;     // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
+    this.onerror = null;        // When the write has failed (see errors).
+};
+
+// States
+FileWriter.INIT = 0;
+FileWriter.WRITING = 1;
+FileWriter.DONE = 2;
+
+/**
+ * Abort writing file.
+ */
+FileWriter.prototype.abort = function() {
+    // check for invalid state
+    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // set error
+    this.error = new FileError(FileError.ABORT_ERR);
+
+    this.readyState = FileWriter.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === "function") {
+        this.onabort(new ProgressEvent("abort", {"target":this}));
+    }
+
+    // If write end callback
+    if (typeof this.onwriteend === "function") {
+        this.onwriteend(new ProgressEvent("writeend", {"target":this}));
+    }
+};
+
+/**
+ * Writes data to the file
+ *
+ * @param text to be written
+ */
+FileWriter.prototype.write = function(text) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":me}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // position always increases by bytes written because file would be extended
+            me.position += r;
+            // The length of the file is now where we are done writing.
+
+            me.length = me.position;
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "write", [this.fileName, text, this.position]);
+};
+
+/**
+ * Moves the file pointer to the location specified.
+ *
+ * If the offset is a negative number the position of the file
+ * pointer is rewound.  If the offset is greater than the file
+ * size the position is set to the end of the file.
+ *
+ * @param offset is the location to move the file pointer to.
+ */
+FileWriter.prototype.seek = function(offset) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    if (!offset && offset !== 0) {
+        return;
+    }
+
+    // See back from end of file.
+    if (offset < 0) {
+        this.position = Math.max(offset + this.length, 0);
+    }
+    // Offset is bigger then file size so set position
+    // to the end of the file.
+    else if (offset > this.length) {
+        this.position = this.length;
+    }
+    // Offset is between 0 and file size so set the position
+    // to start writing.
+    else {
+        this.position = offset;
+    }
+};
+
+/**
+ * Truncates the file to the size specified.
+ *
+ * @param size to chop the file at.
+ */
+FileWriter.prototype.truncate = function(size) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":this}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Update the length of the file
+            me.length = r;
+            me.position = Math.min(me.position, r);
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "truncate", [this.fileName, size]);
+};
+
+module.exports = FileWriter;
+
+});
+
+// file: lib/common/plugin/Flags.js
+define("cordova/plugin/Flags", function(require, exports, module) {
+/**
+ * Supplies arguments to methods that lookup or create files and directories.
+ *
+ * @param create
+ *            {boolean} file or directory if it doesn't exist
+ * @param exclusive
+ *            {boolean} used with create; if true the command will fail if
+ *            target path exists
+ */
+function Flags(create, exclusive) {
+    this.create = create || false;
+    this.exclusive = exclusive || false;
+}
+
+module.exports = Flags;
+});
+
+// file: lib/common/plugin/LocalFileSystem.js
+define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Represents a local file system.
+ */
+var LocalFileSystem = function() {
+
+};
+
+LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
+LocalFileSystem.PERSISTENT = 1; //persistent
+
+module.exports = LocalFileSystem;
+});
+
+// file: lib/common/plugin/Media.js
+define("cordova/plugin/Media", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+var mediaObjects = {};
+
+/**
+ * This class provides access to the device media, interfaces to both sound and video
+ *
+ * @constructor
+ * @param src                   The file name or url to play
+ * @param successCallback       The callback to be called when the file is done playing or recording.
+ *                                  successCallback()
+ * @param errorCallback         The callback to be called if there is an error.
+ *                                  errorCallback(int errorCode) - OPTIONAL
+ * @param statusCallback        The callback to be called when media status has changed.
+ *                                  statusCallback(int statusCode) - OPTIONAL
+ */
+var Media = function(src, successCallback, errorCallback, statusCallback) {
+
+    // successCallback optional
+    if (successCallback && (typeof successCallback !== "function")) {
+        console.log("Media Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Media Error: errorCallback is not a function");
+        return;
+    }
+
+    // statusCallback optional
+    if (statusCallback && (typeof statusCallback !== "function")) {
+        console.log("Media Error: statusCallback is not a function");
+        return;
+    }
+
+    this.id = utils.createUUID();
+    mediaObjects[this.id] = this;
+    this.src = src;
+    this.successCallback = successCallback;
+    this.errorCallback = errorCallback;
+    this.statusCallback = statusCallback;
+    this._duration = -1;
+    this._position = -1;
+    exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
+};
+
+// Media messages
+Media.MEDIA_STATE = 1;
+Media.MEDIA_DURATION = 2;
+Media.MEDIA_POSITION = 3;
+Media.MEDIA_ERROR = 9;
+
+// Media states
+Media.MEDIA_NONE = 0;
+Media.MEDIA_STARTING = 1;
+Media.MEDIA_RUNNING = 2;
+Media.MEDIA_PAUSED = 3;
+Media.MEDIA_STOPPED = 4;
+Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"];
+
+// "static" function to return existing objs.
+Media.get = function(id) {
+    return mediaObjects[id];
+};
+
+/**
+ * Start or resume playing audio file.
+ */
+Media.prototype.play = function(options) {
+    exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]);
+};
+
+/**
+ * Stop playing audio file.
+ */
+Media.prototype.stop = function() {
+    var me = this;
+    exec(function() {
+        me._position = 0;
+        me.successCallback();
+    }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
+};
+
+/**
+ * Seek or jump to a new time in the track..
+ */
+Media.prototype.seekTo = function(milliseconds) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+    }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]);
+};
+
+/**
+ * Pause playing audio file.
+ */
+Media.prototype.pause = function() {
+    exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]);
+};
+
+/**
+ * Get duration of an audio file.
+ * The duration is only set for audio that is playing, paused or stopped.
+ *
+ * @return      duration or -1 if not known.
+ */
+Media.prototype.getDuration = function() {
+    return this._duration;
+};
+
+/**
+ * Get position of audio.
+ */
+Media.prototype.getCurrentPosition = function(success, fail) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+        success(p);
+    }, fail, "Media", "getCurrentPositionAudio", [this.id]);
+};
+
+/**
+ * Start recording audio file.
+ */
+Media.prototype.startRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+};
+
+/**
+ * Stop recording audio file.
+ */
+Media.prototype.stopRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
+};
+
+/**
+ * Release the resources.
+ */
+Media.prototype.release = function() {
+    exec(null, this.errorCallback, "Media", "release", [this.id]);
+};
+
+/**
+ * Adjust the volume.
+ */
+Media.prototype.setVolume = function(volume) {
+    exec(null, null, "Media", "setVolume", [this.id, volume]);
+};
+
+/**
+ * Audio has status update.
+ * PRIVATE
+ *
+ * @param id            The media object id (string)
+ * @param status        The status code (int)
+ * @param msg           The status message (string)
+ */
+Media.onStatus = function(id, msg, value) {
+    var media = mediaObjects[id];
+    // If state update
+    if (msg === Media.MEDIA_STATE) {
+        if (value === Media.MEDIA_STOPPED) {
+            if (media.successCallback) {
+                media.successCallback();
+            }
+        }
+        if (media.statusCallback) {
+            media.statusCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_DURATION) {
+        media._duration = value;
+    }
+    else if (msg === Media.MEDIA_ERROR) {
+        if (media.errorCallback) {
+            // value should be a MediaError object when msg == MEDIA_ERROR
+            media.errorCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_POSITION) {
+        media._position = value;
+    }
+};
+
+module.exports = Media;
+});
+
+// file: lib/common/plugin/MediaError.js
+define("cordova/plugin/MediaError", function(require, exports, module) {
+/**
+ * This class contains information about any Media errors.
+ * @constructor
+ */
+var MediaError = function(code, msg) {
+    this.code = (code !== undefined ? code : null);
+    this.message = msg || "";
+};
+
+MediaError.MEDIA_ERR_NONE_ACTIVE    = 0;
+MediaError.MEDIA_ERR_ABORTED        = 1;
+MediaError.MEDIA_ERR_NETWORK        = 2;
+MediaError.MEDIA_ERR_DECODE         = 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+
+module.exports = MediaError;
+});
+
+// file: lib/common/plugin/MediaFile.js
+define("cordova/plugin/MediaFile", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    File = require('cordova/plugin/File'),
+    CaptureError = require('cordova/plugin/CaptureError');
+/**
+ * Represents a single file.
+ *
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+var MediaFile = function(name, fullPath, type, lastModifiedDate, size){
+    MediaFile.__super__.constructor.apply(this, arguments);
+};
+
+utils.extend(MediaFile, File);
+
+/**
+ * Request capture format data for a specific file and type
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ */
+MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
+    if (typeof this.fullPath === "undefined" || this.fullPath === null) {
+        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
+    } else {
+        exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]);
+    }
+};
+
+// TODO: can we axe this?
+/**
+ * Casts a PluginResult message property  (array of objects) to an array of MediaFile objects
+ * (used in Objective-C and Android)
+ *
+ * @param {PluginResult} pluginResult
+ */
+MediaFile.cast = function(pluginResult) {
+    var mediaFiles = [];
+    for (var i=0; i<pluginResult.message.length; i++) {
+        var mediaFile = new MediaFile();
+        mediaFile.name = pluginResult.message[i].name;
+        mediaFile.fullPath = pluginResult.message[i].fullPath;
+        mediaFile.type = pluginResult.message[i].type;
+        mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
+        mediaFile.size = pluginResult.message[i].size;
+        mediaFiles.push(mediaFile);
+    }
+    pluginResult.message = mediaFiles;
+    return pluginResult;
+};
+
+module.exports = MediaFile;
+
+});
+
+// file: lib/common/plugin/MediaFileData.js
+define("cordova/plugin/MediaFileData", function(require, exports, module) {
+/**
+ * MediaFileData encapsulates format information of a media file.
+ *
+ * @param {DOMString} codecs
+ * @param {long} bitrate
+ * @param {long} height
+ * @param {long} width
+ * @param {float} duration
+ */
+var MediaFileData = function(codecs, bitrate, height, width, duration){
+    this.codecs = codecs || null;
+    this.bitrate = bitrate || 0;
+    this.height = height || 0;
+    this.width = width || 0;
+    this.duration = duration || 0;
+};
+
+module.exports = MediaFileData;
+});
+
+// file: lib/common/plugin/Metadata.js
+define("cordova/plugin/Metadata", function(require, exports, module) {
+/**
+ * Information about the state of the file or directory
+ *
+ * {Date} modificationTime (readonly)
+ */
+var Metadata = function(time) {
+    this.modificationTime = (typeof time != 'undefined'?new Date(time):null);
+};
+
+module.exports = Metadata;
+});
+
+// file: lib/common/plugin/Position.js
+define("cordova/plugin/Position", function(require, exports, module) {
+var Coordinates = require('cordova/plugin/Coordinates');
+
+var Position = function(coords, timestamp) {
+    if (coords) {
+        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
+    } else {
+        this.coords = new Coordinates();
+    }
+    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
+};
+
+module.exports = Position;
+
+});
+
+// file: lib/common/plugin/PositionError.js
+define("cordova/plugin/PositionError", function(require, exports, module) {
+/**
+ * Position error object
+ *
+ * @constructor
+ * @param code
+ * @param message
+ */
+var PositionError = function(code, message) {
+    this.code = code || null;
+    this.message = message || '';
+};
+
+PositionError.PERMISSION_DENIED = 1;
+PositionError.POSITION_UNAVAILABLE = 2;
+PositionError.TIMEOUT = 3;
+
+module.exports = PositionError;
+});
+
+// file: lib/common/plugin/ProgressEvent.js
+define("cordova/plugin/ProgressEvent", function(require, exports, module) {
+// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
+// Feature test: See if we can instantiate a native ProgressEvent;
+// if so, use that approach,
+// otherwise fill-in with our own implementation.
+//
+// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
+var ProgressEvent = (function() {
+    /*
+    var createEvent = function(data) {
+        var event = document.createEvent('Events');
+        event.initEvent('ProgressEvent', false, false);
+        if (data) {
+            for (var i in data) {
+                if (data.hasOwnProperty(i)) {
+                    event[i] = data[i];
+                }
+            }
+            if (data.target) {
+                // TODO: cannot call <some_custom_object>.dispatchEvent
+                // need to first figure out how to implement EventTarget
+            }
+        }
+        return event;
+    };
+    try {
+        var ev = createEvent({type:"abort",target:document});
+        return function ProgressEvent(type, data) {
+            data.type = type;
+            return createEvent(data);
+        };
+    } catch(e){
+    */
+        return function ProgressEvent(type, dict) {
+            this.type = type;
+            this.bubbles = false;
+            this.cancelBubble = false;
+            this.cancelable = false;
+            this.lengthComputable = false;
+            this.loaded = dict && dict.loaded ? dict.loaded : 0;
+            this.total = dict && dict.total ? dict.total : 0;
+            this.target = dict && dict.target ? dict.target : null;
+        };
+    //}
+})();
+
+module.exports = ProgressEvent;
+});
+
+// file: lib/common/plugin/accelerometer.js
+define("cordova/plugin/accelerometer", function(require, exports, module) {
+/**
+ * This class provides access to device accelerometer data.
+ * @constructor
+ */
+var utils = require("cordova/utils"),
+    exec = require("cordova/exec"),
+    Acceleration = require('cordova/plugin/Acceleration');
+
+// Is the accel sensor running?
+var running = false;
+
+// Keeps reference to watchAcceleration calls.
+var timers = {};
+
+// Array of listeners; used to keep track of when we should call start and stop.
+var listeners = [];
+
+// Last returned acceleration object from native
+var accel = null;
+
+// Tells native to start.
+function start() {
+    exec(function(a) {
+        var tempListeners = listeners.slice(0);
+        accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].win(accel);
+        }
+    }, function(e) {
+        var tempListeners = listeners.slice(0);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].fail(e);
+        }
+    }, "Accelerometer", "start", []);
+    running = true;
+}
+
+// Tells native to stop.
+function stop() {
+    exec(null, null, "Accelerometer", "stop", []);
+    running = false;
+}
+
+// Adds a callback pair to the listeners array
+function createCallbackPair(win, fail) {
+    return {win:win, fail:fail};
+}
+
+// Removes a win/fail listener pair from the listeners array
+function removeListeners(l) {
+    var idx = listeners.indexOf(l);
+    if (idx > -1) {
+        listeners.splice(idx, 1);
+        if (listeners.length === 0) {
+            stop();
+        }
+    }
+}
+
+var accelerometer = {
+    /**
+     * Asynchronously aquires the current acceleration.
+     *
+     * @param {Function} successCallback    The function to call when the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     */
+    getCurrentAcceleration: function(successCallback, errorCallback, options) {
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "getCurrentAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        var p;
+        var win = function(a) {
+            removeListeners(p);
+            successCallback(a);
+        };
+        var fail = function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        };
+
+        p = createCallbackPair(win, fail);
+        listeners.push(p);
+
+        if (!running) {
+            start();
+        }
+    },
+
+    /**
+     * Asynchronously aquires the acceleration repeatedly at a given interval.
+     *
+     * @param {Function} successCallback    The function to call each time the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchAcceleration: function(successCallback, errorCallback, options) {
+        // Default interval (10 sec)
+        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
+
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "watchAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        // Keep reference to watch id, and report accel readings as often as defined in frequency
+        var id = utils.createUUID();
+
+        var p = createCallbackPair(function(){}, function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        });
+        listeners.push(p);
+
+        timers[id] = {
+            timer:window.setInterval(function() {
+                if (accel) {
+                    successCallback(accel);
+                }
+            }, frequency),
+            listeners:p
+        };
+
+        if (running) {
+            // If we're already running then immediately invoke the success callback
+            // but only if we have retreived a value, sample code does not check for null ...
+            if(accel) {
+                successCallback(accel);
+            }
+        } else {
+            start();
+        }
+
+        return id;
+    },
+
+    /**
+     * Clears the specified accelerometer watch.
+     *
+     * @param {String} id       The id of the watch returned from #watchAcceleration.
+     */
+    clearWatch: function(id) {
+        // Stop javascript timer & remove from timer list
+        if (id && timers[id]) {
+            window.clearInterval(timers[id].timer);
+            removeListeners(timers[id].listeners);
+            delete timers[id];
+        }
+    }
+};
+
+module.exports = accelerometer;
+
+});
+
+// file: lib/common/plugin/battery.js
+define("cordova/plugin/battery", function(require, exports, module) {
+/**
+ * This class contains information about the current battery status.
+ * @constructor
+ */
+var cordova = require('cordova'),
+    exec = require('cordova/exec');
+
+function handlers() {
+  return battery.channels.batterystatus.numHandlers +
+         battery.channels.batterylow.numHandlers +
+         battery.channels.batterycritical.numHandlers;
+}
+
+var Battery = function() {
+    this._level = null;
+    this._isPlugged = null;
+    // Create new event handlers on the window (returns a channel instance)
+    var subscriptionEvents = {
+      onSubscribe:this.onSubscribe,
+      onUnsubscribe:this.onUnsubscribe
+    };
+    this.channels = {
+      batterystatus:cordova.addWindowEventHandler("batterystatus", subscriptionEvents),
+      batterylow:cordova.addWindowEventHandler("batterylow", subscriptionEvents),
+      batterycritical:cordova.addWindowEventHandler("batterycritical", subscriptionEvents)
+    };
+};
+/**
+ * Event handlers for when callbacks get registered for the battery.
+ * Keep track of how many handlers we have so we can start and stop the native battery listener
+ * appropriately (and hopefully save on battery life!).
+ */
+Battery.prototype.onSubscribe = function() {
+  var me = battery;
+  // If we just registered the first handler, make sure native listener is started.
+  if (handlers() === 1) {
+    exec(me._status, me._error, "Battery", "start", []);
+  }
+};
+
+Battery.prototype.onUnsubscribe = function() {
+  var me = battery;
+
+  // If we just unregistered the last handler, make sure native listener is stopped.
+  if (handlers() === 0) {
+      exec(null, null, "Battery", "stop", []);
+  }
+};
+
+/**
+ * Callback for battery status
+ *
+ * @param {Object} info            keys: level, isPlugged
+ */
+Battery.prototype._status = function(info) {
+    if (info) {
+        var me = battery;
+    var level = info.level;
+        if (me._level !== level || me._isPlugged !== info.isPlugged) {
+            // Fire batterystatus event
+            cordova.fireWindowEvent("batterystatus", info);
+
+            // Fire low battery event
+            if (level === 20 || level === 5) {
+                if (level === 20) {
+                    cordova.fireWindowEvent("batterylow", info);
+                }
+                else {
+                    cordova.fireWindowEvent("batterycritical", info);
+                }
+            }
+        }
+        me._level = level;
+        me._isPlugged = info.isPlugged;
+    }
+};
+
+/**
+ * Error callback for battery start
+ */
+Battery.prototype._error = function(e) {
+    console.log("Error initializing Battery: " + e);
+};
+
+var battery = new Battery();
+
+module.exports = battery;
+});
+
+// file: lib/common/plugin/capture.js
+define("cordova/plugin/capture", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    MediaFile = require('cordova/plugin/MediaFile');
+
+/**
+ * Launches a capture of different types.
+ *
+ * @param (DOMString} type
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+function _capture(type, successCallback, errorCallback, options) {
+    var win = function(pluginResult) {
+        var mediaFiles = [];
+        var i;
+        for (i = 0; i < pluginResult.length; i++) {
+            var mediaFile = new MediaFile();
+            mediaFile.name = pluginResult[i].name;
+            mediaFile.fullPath = pluginResult[i].fullPath;
+            mediaFile.type = pluginResult[i].type;
+            mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
+            mediaFile.size = pluginResult[i].size;
+            mediaFiles.push(mediaFile);
+        }
+        successCallback(mediaFiles);
+    };
+    exec(win, errorCallback, "Capture", type, [options]);
+}
+/**
+ * The Capture interface exposes an interface to the camera and microphone of the hosting device.
+ */
+function Capture() {
+    this.supportedAudioModes = [];
+    this.supportedImageModes = [];
+    this.supportedVideoModes = [];
+}
+
+/**
+ * Launch audio recorder application for recording audio clip(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureAudioOptions} options
+ */
+Capture.prototype.captureAudio = function(successCallback, errorCallback, options){
+    _capture("captureAudio", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch camera application for taking image(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureImageOptions} options
+ */
+Capture.prototype.captureImage = function(successCallback, errorCallback, options){
+    _capture("captureImage", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch device camera application for recording video(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+Capture.prototype.captureVideo = function(successCallback, errorCallback, options){
+    _capture("captureVideo", successCallback, errorCallback, options);
+};
+
+
+module.exports = new Capture();
+
+});
+
+// file: lib/common/plugin/compass.js
+define("cordova/plugin/compass", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    utils = require('cordova/utils'),
+    CompassHeading = require('cordova/plugin/CompassHeading'),
+    CompassError = require('cordova/plugin/CompassError'),
+    timers = {},
+    compass = {
+        /**
+         * Asynchronously acquires the current heading.
+         * @param {Function} successCallback The function to call when the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {CompassOptions} options The options for getting the heading data (not used).
+         */
+        getCurrentHeading:function(successCallback, errorCallback, options) {
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var win = function(result) {
+                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
+                successCallback(ch);
+            };
+            var fail = function(code) {
+                var ce = new CompassError(code);
+                errorCallback(ce);
+            };
+
+            // Get heading
+            exec(win, fail, "Compass", "getHeading", [options]);
+        },
+
+        /**
+         * Asynchronously acquires the heading repeatedly at a given interval.
+         * @param {Function} successCallback The function to call each time the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {HeadingOptions} options The options for getting the heading data
+         * such as timeout and the frequency of the watch. For iOS, filter parameter
+         * specifies to watch via a distance filter rather than time.
+         */
+        watchHeading:function(successCallback, errorCallback, options) {
+            // Default interval (100 msec)
+            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
+            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
+
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var id = utils.createUUID();
+            if (filter > 0) {
+                // is an iOS request for watch by filter, no timer needed
+                timers[id] = "iOS";
+                compass.getCurrentHeading(successCallback, errorCallback, options);
+            } else {
+                // Start watch timer to get headings
+                timers[id] = window.setInterval(function() {
+                    compass.getCurrentHeading(successCallback, errorCallback);
+                }, frequency);
+            }
+
+            return id;
+        },
+
+        /**
+         * Clears the specified heading watch.
+         * @param {String} watchId The ID of the watch returned from #watchHeading.
+         */
+        clearWatch:function(id) {
+            // Stop javascript timer & remove from timer list
+            if (id && timers[id]) {
+                if (timers[id] != "iOS") {
+                      clearInterval(timers[id]);
+                  } else {
+                    // is iOS watch by filter so call into device to stop
+                    exec(null, null, "Compass", "stopHeading", []);
+                }
+                delete timers[id];
+            }
+        }
+    };
+
+module.exports = compass;
+});
+
+// file: lib/common/plugin/console-via-logger.js
+define("cordova/plugin/console-via-logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+
+var logger = require("cordova/plugin/logger");
+var utils  = require("cordova/utils");
+
+//------------------------------------------------------------------------------
+// object that we're exporting
+//------------------------------------------------------------------------------
+var console = module.exports;
+
+//------------------------------------------------------------------------------
+// copy of the original console object
+//------------------------------------------------------------------------------
+var WinConsole = window.console;
+
+//------------------------------------------------------------------------------
+// whether to use the logger
+//------------------------------------------------------------------------------
+var UseLogger = false;
+
+//------------------------------------------------------------------------------
+// Timers
+//------------------------------------------------------------------------------
+var Timers = {};
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+function noop() {}
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+console.useLogger = function (value) {
+    if (arguments.length) UseLogger = !!value;
+
+    if (UseLogger) {
+        if (logger.useConsole()) {
+            throw new Error("console and logger are too intertwingly");
+        }
+    }
+
+    return UseLogger;
+};
+
+//------------------------------------------------------------------------------
+console.log = function() {
+    if (logger.useConsole()) return;
+    logger.log.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.error = function() {
+    if (logger.useConsole()) return;
+    logger.error.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.warn = function() {
+    if (logger.useConsole()) return;
+    logger.warn.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.info = function() {
+    if (logger.useConsole()) return;
+    logger.info.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.debug = function() {
+    if (logger.useConsole()) return;
+    logger.debug.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.assert = function(expression) {
+    if (expression) return;
+
+    var message = utils.vformat(arguments[1], [].slice.call(arguments, 2));
+    console.log("ASSERT: " + message);
+};
+
+//------------------------------------------------------------------------------
+console.clear = function() {};
+
+//------------------------------------------------------------------------------
+console.dir = function(object) {
+    console.log("%o", object);
+};
+
+//------------------------------------------------------------------------------
+console.dirxml = function(node) {
+    console.log(node.innerHTML);
+};
+
+//------------------------------------------------------------------------------
+console.trace = noop;
+
+//------------------------------------------------------------------------------
+console.group = console.log;
+
+//------------------------------------------------------------------------------
+console.groupCollapsed = console.log;
+
+//------------------------------------------------------------------------------
+console.groupEnd = noop;
+
+//------------------------------------------------------------------------------
+console.time = function(name) {
+    Timers[name] = new Date().valueOf();
+};
+
+//------------------------------------------------------------------------------
+console.timeEnd = function(name) {
+    var timeStart = Timers[name];
+    if (!timeStart) {
+        console.warn("unknown timer: " + name);
+        return;
+    }
+
+    var timeElapsed = new Date().valueOf() - timeStart;
+    console.log(name + ": " + timeElapsed + "ms");
+};
+
+//------------------------------------------------------------------------------
+console.timeStamp = noop;
+
+//------------------------------------------------------------------------------
+console.profile = noop;
+
+//------------------------------------------------------------------------------
+console.profileEnd = noop;
+
+//------------------------------------------------------------------------------
+console.count = noop;
+
+//------------------------------------------------------------------------------
+console.exception = console.log;
+
+//------------------------------------------------------------------------------
+console.table = function(data, columns) {
+    console.log("%o", data);
+};
+
+//------------------------------------------------------------------------------
+// return a new function that calls both functions passed as args
+//------------------------------------------------------------------------------
+function wrapperedOrigCall(orgFunc, newFunc) {
+    return function() {
+        var args = [].slice.call(arguments);
+        try { orgFunc.apply(WinConsole, args); } catch (e) {}
+        try { newFunc.apply(console,    args); } catch (e) {}
+    };
+}
+
+//------------------------------------------------------------------------------
+// For every function that exists in the original console object, that
+// also exists in the new console object, wrap the new console method
+// with one that calls both
+//------------------------------------------------------------------------------
+for (var key in console) {
+    if (typeof WinConsole[key] == "function") {
+        console[key] = wrapperedOrigCall(WinConsole[key], console[key]);
+    }
+}
+
+});
+
+// file: lib/common/plugin/contacts.js
+define("cordova/plugin/contacts", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+* Represents a group of Contacts.
+* @constructor
+*/
+var contacts = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     * @param fields that should be searched
+     * @param successCB success callback
+     * @param errorCB error callback
+     * @param {ContactFindOptions} options that can be applied to contact searching
+     * @return array of Contacts matching search criteria
+     */
+    find:function(fields, successCB, errorCB, options) {
+        if (!successCB) {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+        if (!fields || (utils.isArray(fields) && fields.length === 0)) {
+            if (typeof errorCB === "function") {
+                errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+        } else {
+            var win = function(result) {
+                var cs = [];
+                for (var i = 0, l = result.length; i < l; i++) {
+                    cs.push(contacts.create(result[i]));
+                }
+                successCB(cs);
+            };
+            exec(win, errorCB, "Contacts", "search", [fields, options]);
+        }
+    },
+
+    /**
+     * This function creates a new contact, but it does not persist the contact
+     * to device storage. To persist the contact to device storage, invoke
+     * contact.save().
+     * @param properties an object who's properties will be examined to create a new Contact
+     * @returns new Contact object
+     */
+    create:function(properties) {
+        var i;
+        var contact = new Contact();
+        for (i in properties) {
+            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
+                contact[i] = properties[i];
+            }
+        }
+        return contact;
+    }
+};
+
+module.exports = contacts;
+
+});
+
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+var channel = require('cordova/channel'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+/**
+ * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+    this.available = false;
+    this.platform = null;
+    this.version = null;
+    this.name = null;
+    this.uuid = null;
+    this.cordova = null;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function(info) {
+            me.available = true;
+            me.platform = info.platform;
+            me.version = info.version;
+            me.name = info.name;
+            me.uuid = info.uuid;
+            me.cordova = info.cordova;
+            channel.onCordovaInfoReady.fire();
+        },function(e) {
+            me.available = false;
+            utils.alert("[ERROR] Error initializing Cordova: " + e);
+        });
+    });
+}
+
+/**
+ * Get device info
+ *
+ * @param {Function} successCallback The function to call when the heading data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
+ */
+Device.prototype.getInfo = function(successCallback, errorCallback) {
+
+    // successCallback required
+    if (typeof successCallback !== "function") {
+        console.log("Device Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Device Error: errorCallback is not a function");
+        return;
+    }
+
+    // Get info
+    exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/common/plugin/geolocation.js
+define("cordova/plugin/geolocation", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    PositionError = require('cordova/plugin/PositionError'),
+    Position = require('cordova/plugin/Position');
+
+var timers = {};   // list of timers in use
+
+// Returns default params, overrides if provided with values
+function parseParameters(options) {
+    var opt = {
+        maximumAge: 0,
+        enableHighAccuracy: false,
+        timeout: Infinity
+    };
+
+    if (options) {
+        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
+            opt.maximumAge = options.maximumAge;
+        }
+        if (options.enableHighAccuracy !== undefined) {
+            opt.enableHighAccuracy = options.enableHighAccuracy;
+        }
+        if (options.timeout !== undefined && !isNaN(options.timeout)) {
+            if (options.timeout < 0) {
+                opt.timeout = 0;
+            } else {
+                opt.timeout = options.timeout;
+            }
+        }
+    }
+
+    return opt;
+}
+
+// Returns a timeout failure, closed over a specified timeout value and error callback.
+function createTimeout(errorCallback, timeout) {
+    var t = setTimeout(function() {
+        clearTimeout(t);
+        t = null;
+        errorCallback({
+            code:PositionError.TIMEOUT,
+            message:"Position retrieval timed out."
+        });
+    }, timeout);
+    return t;
+}
+
+var geolocation = {
+    lastPosition:null, // reference to last known (cached) position returned
+    /**
+   * Asynchronously aquires the current position.
+   *
+   * @param {Function} successCallback    The function to call when the position data is available
+   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)
+   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)
+   */
+    getCurrentPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("getCurrentPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        // Timer var that will fire an error callback if no position is retrieved from native
+        // before the "timeout" param provided expires
+        var timeoutTimer = null;
+
+        var win = function(p) {
+            clearTimeout(timeoutTimer);
+            if (!timeoutTimer) {
+                // Timeout already happened, or native fired error callback for
+                // this geo request.
+                // Don't continue with success callback.
+                return;
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+        var fail = function(e) {
+            clearTimeout(timeoutTimer);
+            timeoutTimer = null;
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
+        // fire the success callback with the cached position.
+        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
+            successCallback(geolocation.lastPosition);
+        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
+        } else if (options.timeout === 0) {
+            fail({
+                code:PositionError.TIMEOUT,
+                message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
+            });
+        // Otherwise we have to call into native to retrieve a position.
+        } else {
+            if (options.timeout !== Infinity) {
+                // If the timeout value was not set to Infinity (default), then
+                // set up a timeout function that will fire the error callback
+                // if no successful position was retrieved before timeout expired.
+                timeoutTimer = createTimeout(fail, options.timeout);
+            } else {
+                // This is here so the check in the win function doesn't mess stuff up
+                // may seem weird but this guarantees timeoutTimer is
+                // always truthy before we call into native
+                timeoutTimer = true;
+            }
+            exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
+        }
+        return timeoutTimer;
+    },
+    /**
+     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,
+     * the successCallback is called with the new location.
+     *
+     * @param {Function} successCallback    The function to call each time the location data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)
+     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("watchPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        var id = utils.createUUID();
+
+        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
+        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
+
+        var fail = function(e) {
+            clearTimeout(timers[id]);
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        var win = function(p) {
+            clearTimeout(timers[id]);
+            if (options.timeout !== Infinity) {
+                timers[id] = createTimeout(fail, options.timeout);
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+
+        exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
+
+        return id;
+    },
+    /**
+     * Clears the specified heading watch.
+     *
+     * @param {String} id       The ID of the watch returned from #watchPosition
+     */
+    clearWatch:function(id) {
+        if (id && timers[id] !== undefined) {
+            clearTimeout(timers[id]);
+            delete timers[id];
+            exec(null, null, "Geolocation", "clearWatch", [id]);
+        }
+    }
+};
+
+module.exports = geolocation;
+
+});
+
+// file: lib/common/plugin/logger.js
+define("cordova/plugin/logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+// The logger module exports the following properties/functions:
+//
+// LOG                          - constant for the level LOG
+// ERROR                        - constant for the level ERROR
+// WARN                         - constant for the level WARN
+// INFO                         - constant for the level INFO
+// DEBUG                        - constant for the level DEBUG
+// logLevel()                   - returns current log level
+// logLevel(value)              - sets and returns a new log level
+// useConsole()                 - returns whether logger is using console
+// useConsole(value)            - sets and returns whether logger is using console
+// log(message,...)             - logs a message at level LOG
+// error(message,...)           - logs a message at level ERROR
+// warn(message,...)            - logs a message at level WARN
+// info(message,...)            - logs a message at level INFO
+// debug(message,...)           - logs a message at level DEBUG
+// logLevel(level,message,...)  - logs a message specified level
+//
+//------------------------------------------------------------------------------
+
+var logger = exports;
+
+var exec    = require('cordova/exec');
+var utils   = require('cordova/utils');
+
+var UseConsole   = true;
+var Queued       = [];
+var DeviceReady  = false;
+var CurrentLevel;
+
+/**
+ * Logging levels
+ */
+
+var Levels = [
+    "LOG",
+    "ERROR",
+    "WARN",
+    "INFO",
+    "DEBUG"
+];
+
+/*
+ * add the logging levels to the logger object and
+ * to a separate levelsMap object for testing
+ */
+
+var LevelsMap = {};
+for (var i=0; i<Levels.length; i++) {
+    var level = Levels[i];
+    LevelsMap[level] = i;
+    logger[level]    = level;
+}
+
+CurrentLevel = LevelsMap.WARN;
+
+/**
+ * Getter/Setter for the logging level
+ *
+ * Returns the current logging level.
+ *
+ * When a value is passed, sets the logging level to that value.
+ * The values should be one of the following constants:
+ *    logger.LOG
+ *    logger.ERROR
+ *    logger.WARN
+ *    logger.INFO
+ *    logger.DEBUG
+ *
+ * The value used determines which messages get printed.  The logging
+ * values above are in order, and only messages logged at the logging
+ * level or above will actually be displayed to the user.  Eg, the
+ * default level is WARN, so only messages logged with LOG, ERROR, or
+ * WARN will be displayed; INFO and DEBUG messages will be ignored.
+ */
+logger.level = function (value) {
+    if (arguments.length) {
+        if (LevelsMap[value] === null) {
+            throw new Error("invalid logging level: " + value);
+        }
+        CurrentLevel = LevelsMap[value];
+    }
+
+    return Levels[CurrentLevel];
+};
+
+/**
+ * Getter/Setter for the useConsole functionality
+ *
+ * When useConsole is true, the logger will log via the
+ * browser 'console' object.  Otherwise, it will use the
+ * native Logger plugin.
+ */
+logger.useConsole = function (value) {
+    if (arguments.length) UseConsole = !!value;
+
+    if (UseConsole) {
+        if (typeof console == "undefined") {
+            throw new Error("global console object is not defined");
+        }
+
+        if (typeof console.log != "function") {
+            throw new Error("global console object does not have a log function");
+        }
+
+        if (typeof console.useLogger == "function") {
+            if (console.useLogger()) {
+                throw new Error("console and logger are too intertwingly");
+            }
+        }
+    }
+
+    return UseConsole;
+};
+
+/**
+ * Logs a message at the LOG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.log   = function(message) { logWithArgs("LOG",   arguments); };
+
+/**
+ * Logs a message at the ERROR level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.error = function(message) { logWithArgs("ERROR", arguments); };
+
+/**
+ * Logs a message at the WARN level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.warn  = function(message) { logWithArgs("WARN",  arguments); };
+
+/**
+ * Logs a message at the INFO level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.info  = function(message) { logWithArgs("INFO",  arguments); };
+
+/**
+ * Logs a message at the DEBUG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.debug = function(message) { logWithArgs("DEBUG", arguments); };
+
+// log at the specified level with args
+function logWithArgs(level, args) {
+    args = [level].concat([].slice.call(args));
+    logger.logLevel.apply(logger, args);
+}
+
+/**
+ * Logs a message at the specified level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.logLevel = function(level, message /* , ... */) {
+    // format the message with the parameters
+    var formatArgs = [].slice.call(arguments, 2);
+    message    = utils.vformat(message, formatArgs);
+
+    if (LevelsMap[level] === null) {
+        throw new Error("invalid logging level: " + level);
+    }
+
+    if (LevelsMap[level] > CurrentLevel) return;
+
+    // queue the message if not yet at deviceready
+    if (!DeviceReady && !UseConsole) {
+        Queued.push([level, message]);
+        return;
+    }
+
+    // if not using the console, use the native logger
+    if (!UseConsole) {
+        exec(null, null, "Logger", "logLevel", [level, message]);
+        return;
+    }
+
+    // make sure console is not using logger
+    if (console.__usingCordovaLogger) {
+        throw new Error("console and logger are too intertwingly");
+    }
+
+    // log to the console
+    switch (level) {
+        case logger.LOG:   console.log(message); break;
+        case logger.ERROR: console.log("ERROR: " + message); break;
+        case logger.WARN:  console.log("WARN: "  + message); break;
+        case logger.INFO:  console.log("INFO: "  + message); break;
+        case logger.DEBUG: console.log("DEBUG: " + message); break;
+    }
+};
+
+// when deviceready fires, log queued messages
+logger.__onDeviceReady = function() {
+    if (DeviceReady) return;
+
+    DeviceReady = true;
+
+    for (var i=0; i<Queued.length; i++) {
+        var messageArgs = Queued[i];
+        logger.logLevel(messageArgs[0], messageArgs[1]);
+    }
+
+    Queued = null;
+};
+
+// add a deviceready event to log queued messages
+document.addEventListener("deviceready", logger.__onDeviceReady, false);
+
+});
+
+// file: lib/common/plugin/network.js
+define("cordova/plugin/network", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    cordova = require('cordova'),
+    channel = require('cordova/channel');
+
+var NetworkConnection = function () {
+    this.type = null;
+    this._firstRun = true;
+    this._timer = null;
+    this.timeout = 500;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function (info) {
+            me.type = info;
+            if (info === "none") {
+                // set a timer if still offline at the end of timer send the offline event
+                me._timer = setTimeout(function(){
+                    cordova.fireDocumentEvent("offline");
+                    me._timer = null;
+                    }, me.timeout);
+            } else {
+                // If there is a current offline event pending clear it
+                if (me._timer !== null) {
+                    clearTimeout(me._timer);
+                    me._timer = null;
+                }
+                cordova.fireDocumentEvent("online");
+            }
+
+            // should only fire this once
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+        },
+        function (e) {
+            // If we can't get the network info we should still tell Cordova
+            // to fire the deviceready event.
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+            console.log("Error initializing Network Connection: " + e);
+        });
+    });
+};
+
+/**
+ * Get connection info
+ *
+ * @param {Function} successCallback The function to call when the Connection data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)
+ */
+NetworkConnection.prototype.getInfo = function (successCallback, errorCallback) {
+    // Get info
+    exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
+};
+
+module.exports = new NetworkConnection();
+});
+
+// file: lib/common/plugin/notification.js
+define("cordova/plugin/notification", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Provides access to notifications on the device.
+ */
+
+module.exports = {
+
+    /**
+     * Open a native alert dialog, with a customizable title and button text.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} completeCallback   The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Alert)
+     * @param {String} buttonLabel          Label of the close button (default: OK)
+     */
+    alert: function(message, completeCallback, title, buttonLabel) {
+        var _title = (title || "Alert");
+        var _buttonLabel = (buttonLabel || "OK");
+        exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]);
+    },
+
+    /**
+     * Open a native confirm dialog, with a customizable title and button text.
+     * The result that the user selects is returned to the result callback.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Confirm)
+     * @param {String} buttonLabels         Comma separated list of the labels of the buttons (default: 'OK,Cancel')
+     */
+    confirm: function(message, resultCallback, title, buttonLabels) {
+        var _title = (title || "Confirm");
+        var _buttonLabels = (buttonLabels || "OK,Cancel");
+        exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
+    },
+
+    /**
+     * Causes the device to vibrate.
+     *
+     * @param {Integer} mills       The number of milliseconds to vibrate for.
+     */
+    vibrate: function(mills) {
+        exec(null, null, "Notification", "vibrate", [mills]);
+    },
+
+    /**
+     * Causes the device to beep.
+     * On Android, the default notification ringtone is played "count" times.
+     *
+     * @param {Integer} count       The number of beeps.
+     */
+    beep: function(count) {
+        exec(null, null, "Notification", "beep", [count]);
+    }
+};
+});
+
+// file: lib/common/plugin/requestFileSystem.js
+define("cordova/plugin/requestFileSystem", function(require, exports, module) {
+var FileError = require('cordova/plugin/FileError'),
+    FileSystem = require('cordova/plugin/FileSystem'),
+    exec = require('cordova/exec');
+
+/**
+ * Request a file system in which to store application data.
+ * @param type  local file system type
+ * @param size  indicates how much storage space, in bytes, the application expects to need
+ * @param successCallback  invoked with a FileSystem object
+ * @param errorCallback  invoked if error occurs retrieving file system
+ */
+var requestFileSystem = function(type, size, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    if (type < 0 || type > 3) {
+        fail(FileError.SYNTAX_ERR);
+    } else {
+        // if successful, return a FileSystem object
+        var success = function(file_system) {
+            if (file_system) {
+                if (typeof successCallback === 'function') {
+                    // grab the name and root from the file system object
+                    var result = new FileSystem(file_system.name, file_system.root);
+                    successCallback(result);
+                }
+            }
+            else {
+                // no FileSystem object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+        exec(success, fail, "File", "requestFileSystem", [type, size]);
+    }
+};
+
+module.exports = requestFileSystem;
+});
+
+// file: lib/common/plugin/resolveLocalFileSystemURI.js
+define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    FileError = require('cordova/plugin/FileError'),
+    exec = require('cordova/exec');
+
+/**
+ * Look up file system Entry referred to by local URI.
+ * @param {DOMString} uri  URI referring to a local file or directory
+ * @param successCallback  invoked with Entry object corresponding to URI
+ * @param errorCallback    invoked if error occurs retrieving file system entry
+ */
+module.exports = function(uri, successCallback, errorCallback) {
+    // error callback
+    var fail = function(error) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(error));
+        }
+    };
+    // sanity check for 'not:valid:filename'
+    if(!uri || uri.split(":").length > 2) {
+        setTimeout( function() {
+            fail(FileError.ENCODING_ERR);
+        },0);
+        return;
+    }
+    // if successful, return either a file or directory entry
+    var success = function(entry) {
+        var result;
+        if (entry) {
+            if (typeof successCallback === 'function') {
+                // create appropriate Entry object
+                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
+                try {
+                    successCallback(result);
+                }
+                catch (e) {
+                    console.log('Error invoking callback: ' + e);
+                }
+            }
+        }
+        else {
+            // no Entry object returned
+            fail(FileError.NOT_FOUND_ERR);
+        }
+    };
+
+    exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
+};
+
+});
+
+// file: lib/common/plugin/splashscreen.js
+define("cordova/plugin/splashscreen", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+var splashscreen = {
+    show:function() {
+        exec(null, null, "SplashScreen", "show", []);
+    },
+    hide:function() {
+        exec(null, null, "SplashScreen", "hide", []);
+    }
+};
+
+module.exports = splashscreen;
+});
+
+// file: lib/tizen/plugin/tizen/Accelerometer.js
+define("cordova/plugin/tizen/Accelerometer", function(require, exports, module) {
+var callback = null;
+
+module.exports = {
+    start: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+        callback = function (motion) {
+            successCallback({
+                x: motion.accelerationIncludingGravity.x,
+                y: motion.accelerationIncludingGravity.y,
+                z: motion.accelerationIncludingGravity.z,
+                timestamp: motion.timeStamp
+            });
+        };
+        window.addEventListener("devicemotion", callback);
+    },
+    stop: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+    }
+};
+});
+
+// file: lib/tizen/plugin/tizen/Battery.js
+define("cordova/plugin/tizen/Battery", function(require, exports, module) {
+/*global tizen:false */
+var id = null;
+
+module.exports = {
+    start: function(successCallback, errorCallback) {
+        var tizenSuccessCallback = function(power) {
+            if (successCallback) {
+                successCallback({level: Math.round(power.level * 100), isPlugged: power.isCharging});
+            }
+        };
+
+        if (id === null) {
+            id = tizen.systeminfo.addPropertyValueChangeListener("Power", tizenSuccessCallback);
+        }
+        tizen.systeminfo.getPropertyValue("Power", tizenSuccessCallback, errorCallback);
+    },
+
+    stop: function(successCallback, errorCallback) {
+        tizen.systeminfo.removePropertyValueChangeListener(id);
+        id = null;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Camera.js
+define("cordova/plugin/tizen/Camera", function(require, exports, module) {
+/*global tizen:false */
+var Camera = require('cordova/plugin/CameraConstants');
+
+function makeReplyCallback(successCallback, errorCallback) {
+    return {
+        onsuccess: function(reply) {
+            if (reply.length > 0) {
+                successCallback(reply[0].value);
+            } else {
+                errorCallback('Picture selection aborted');
+            }
+        },
+        onfail: function() {
+           console.log('The service launch failed');
+        }
+    };
+}
+
+module.exports = {
+    takePicture: function(successCallback, errorCallback, args) {
+        var destinationType = args[1],
+            sourceType = args[2],
+            encodingType = args[5],
+            mediaType = args[6];
+            // Not supported
+            /*
+            quality = args[0]
+            targetWidth = args[3]
+            targetHeight = args[4]
+            allowEdit = args[7]
+            correctOrientation = args[8]
+            saveToPhotoAlbum = args[9]
+            */
+
+        if (destinationType !== Camera.DestinationType.FILE_URI) {
+            errorCallback('DestinationType not supported');
+            return;
+        }
+        if (mediaType !== Camera.MediaType.PICTURE) {
+            errorCallback('MediaType not supported');
+            return;
+        }
+
+        var mimeType;
+        if (encodingType === Camera.EncodingType.JPEG) {
+            mimeType = 'image/jpeg';
+        } else if (encodingType === Camera.EncodingType.PNG) {
+            mimeType = 'image/png';
+        } else {
+            mimeType = 'image/*';
+        }
+
+        var serviceId;
+        if (sourceType === Camera.PictureSourceType.CAMERA) {
+            serviceId = 'http://tizen.org/appsvc/operation/create_content';
+        } else {
+            serviceId = 'http://tizen.org/appsvc/operation/pick';
+        }
+
+        var service = new tizen.ApplicationService(serviceId, null, mimeType, null);
+        tizen.application.launchService(service, null, null,
+                function(error) { errorCallback(error.message); },
+                makeReplyCallback(successCallback, errorCallback));
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Compass.js
+define("cordova/plugin/tizen/Compass", function(require, exports, module) {
+var CompassError = require('cordova/plugin/CompassError'),
+    callback = null, ready = false;
+
+module.exports = {
+    getHeading: function(successCallback, errorCallback) {
+        if (window.DeviceOrientationEvent !== undefined) {
+            callback = function (orientation) {
+                var heading = 360 - orientation.alpha;
+                if (ready) {
+                    successCallback({
+                        magneticHeading: heading,
+                        trueHeading: heading,
+                        headingAccuracy: 0,
+                        timestamp: orientation.timeStamp
+                    });
+                    window.removeEventListener("deviceorientation", callback);
+                }
+                ready = true;
+            };
+            ready = false; // workaround invalid first event value returned by WRT
+            window.addEventListener("deviceorientation", callback);
+        }
+        else {
+            errorCallback(CompassError.COMPASS_NOT_SUPPORTED);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Contact.js
+define("cordova/plugin/tizen/Contact", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// ------------------
+// Utility functions
+// ------------------
+
+
+/**
+ * Retrieves a Tizen Contact object from the device by its unique id.
+ *
+ * @param uid
+ *            Unique id of the contact on the device
+ * @return {tizen.Contact} Tizen Contact object or null if contact with
+ *         specified id is not found
+ */
+var findByUniqueId = function(id) {
+
+    if (!id) {
+        return null;
+    }
+
+    var tizenContact = null;
+
+    tizen.contact.getDefaultAddressBook().find(
+        function _successCallback(contacts){
+            tizenContact = contacts[0];
+        },
+        function _errorCallback(error){
+            console.log("tizen find error " + error);
+        },
+        new tizen.AttributeFilter('id', 'CONTAINS', id),
+        new tizen.SortMode('id', 'ASC'));
+
+    return tizenContact || null;
+};
+
+
+var traceTizenContact = function (tizenContact) {
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.id " + tizenContact.id);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.lastUpdated " + tizenContact.lastUpdated);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.name " + tizenContact.name);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.account " + tizenContact.account);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.addresses " + tizenContact.addresses);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.photoURI " + tizenContact.photoURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.phoneNumbers " + tizenContact.phoneNumbers);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.emails " + tizenContact.emails);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.birthday " + tizenContact.birthday);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.organization " + tizenContact.organization);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.notes " + tizenContact.notes);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.urls " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.isFavorite " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.ringtonesURI " + tizenContact.ringtonesURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.categories " + tizenContact.categories);
+};
+
+
+/**
+ * Creates a Tizen contact object from the W3C Contact object and persists
+ * it to device storage.
+ *
+ * @param {Contact}
+ *            contact The contact to save
+ * @return a new contact object with all properties set
+ */
+var saveToDevice = function(contact) {
+
+    if (!contact) {
+        return;
+    }
+
+    var tizenContact = null;
+    var update = false;
+    var i = 0;
+
+    // if the underlying Tizen Contact object already exists, retrieve it for
+    // update
+    if (contact.id) {
+        // we must attempt to retrieve the BlackBerry contact from the device
+        // because this may be an update operation
+        tizenContact = findByUniqueId(contact.id);
+    }
+
+    // contact not found on device, create a new one
+    if (!tizenContact) {
+        tizenContact = new tizen.Contact();
+    }
+    // update the existing contact
+    else {
+        update = true;
+    }
+
+    // NOTE: The user may be working with a partial Contact object, because only
+    // user-specified Contact fields are returned from a find operation (blame
+    // the W3C spec). If this is an update to an existing Contact, we don't
+    // want to clear an attribute from the contact database simply because the
+    // Contact object that the user passed in contains a null value for that
+    // attribute. So we only copy the non-null Contact attributes to the
+    // Tizen Contact object before saving.
+    //
+    // This means that a user must explicitly set a Contact attribute to a
+    // non-null value in order to update it in the contact database.
+    //
+    traceTizenContact (tizenContact);
+
+    // display name
+    if (contact.displayName !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            tizenContact.name.displayName = contact.displayName;
+        }
+    }
+
+    // name
+    if (contact.name !== null) {
+        if (contact.name.givenName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.firstName = contact.name.givenName;
+            }
+        }
+
+        if  (contact.name.middleName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.middleName = contact.name.middleName;
+            }
+        }
+
+        if (contact.name.familyName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.lastName = contact.name.familyName;
+            }
+        }
+
+        if (contact.name.honorificPrefix) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.prefix = contact.name.honorificPrefix;
+            }
+        }
+    }
+
+    // nickname
+    if (contact.nickname !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            if (!utils.isArray(tizenContact.name.nicknames))
+            {
+                tizenContact.name.nicknames = [];
+            }
+            tizenContact.name.nicknames[0] = contact.nickname;
+        }
+    }
+    else {
+        tizenContact.name.nicknames = [];
+    }
+
+    // note
+    if (contact.note !== null) {
+        if (tizenContact.note === null) {
+            tizenContact.note = [];
+        }
+        if (tizenContact.note !== null) {
+            tizenContact.note[0] = contact.note;
+        }
+    }
+
+    // photos
+    if (contact.photos && utils.isArray(contact.emails) && contact.emails.length > 0) {
+        tizenContact.photoURI = contact.photos[0];
+    }
+
+    if (utils.isDate(contact.birthday)) {
+        if (!utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday = new Date();
+        }
+        if (utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday.setDate(contact.birthday.getDate());
+        }
+    }
+
+    // Tizen supports many addresses
+    if (utils.isArray(contact.emails)) {
+
+        // if this is an update, re initialize email addresses
+        if (update) {
+            // doit on effacer sur un update??????
+        }
+
+        // copy the first three email addresses found
+        var emails = [];
+        for (i = 0; i < contact.emails.length; i += 1) {
+            var emailTypes = [];
+
+            emailTypes.push (contact.emails[i].type);
+
+            if (contact.emails[i].pref) {
+                emailTypes.push ("PREF");
+            }
+
+            emails.push(
+                new tizen.ContactEmailAddress(
+                    contact.emails[i].value,
+                    emailTypes)
+            );
+        }
+        tizenContact.emails = emails.length > 0 ? emails : [];
+    }
+    else {
+        tizenContact.emails = [];
+    }
+
+    // Tizen supports many phone numbers
+    // copy into appropriate fields based on type
+    if (utils.isArray(contact.phoneNumbers)) {
+        // if this is an update, re-initialize phone numbers
+        if (update) {
+        }
+
+        var phoneNumbers = [];
+
+        for (i = 0; i < contact.phoneNumbers.length; i += 1) {
+
+            if (!contact.phoneNumbers[i] || !contact.phoneNumbers[i].value) {
+                continue;
+            }
+
+             var phoneTypes = [];
+             phoneTypes.push (contact.phoneNumbers[i].type);
+
+             if (contact.phoneNumbers[i].pref) {
+                 phoneTypes.push ("PREF");
+             }
+
+            phoneNumbers.push(
+                new tizen.ContactPhoneNumber(
+                    contact.phoneNumbers[i].value,
+                    phoneTypes)
+            );
+        }
+
+        tizenContact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : [];
+    } else {
+        tizenContact.phoneNumbers = [];
+    }
+
+    if (utils.isArray(contact.addresses)) {
+        // if this is an update, re-initialize addresses
+        if (update) {
+        }
+
+        var addresses = [],
+            address = null;
+
+        for ( i = 0; i < contact.addresses.length; i += 1) {
+            address = contact.addresses[i];
+
+            if (!address || address.id === undefined || address.pref === undefined || address.type === undefined || address.formatted === undefined) {
+                continue;
+            }
+
+            var addressTypes = [];
+            addressTypes.push (address.type);
+
+            if (address.pref) {
+                addressTypes.push ("PREF");
+            }
+
+            addresses.push(
+                new tizen.ContactAddress({
+                         country:                   address.country,
+                         region :                   address.region,
+                         city:                      address.locality,
+                         streetAddress:             address.streetAddress,
+                         additionalInformation:     "",
+                         postalCode:                address.postalCode,
+                         types :                    addressTypes
+                }));
+
+        }
+        tizenContact.addresses = addresses.length > 0 ? addresses : [];
+
+    } else{
+        tizenContact.addresses = [];
+    }
+
+    // copy first url found to BlackBerry 'webpage' field
+    if (utils.isArray(contact.urls)) {
+        // if this is an update, re-initialize web page
+        if (update) {
+        }
+
+        var url = null,
+            urls = [];
+
+        for ( i = 0; i< contact.urls.length; i+= 1) {
+            url = contact.urls[i];
+
+            if (!url || !url.value) {
+                continue;
+            }
+
+            urls.push( new tizen.ContactWebSite(url.value, url.type));
+        }
+        tizenContact.urls = urls.length > 0 ? urls : [];
+    } else{
+        tizenContact.urls = [];
+    }
+
+    if (utils.isArray(contact.organizations && contact.organizations.length > 0) ) {
+        // if this is an update, re-initialize org attributes
+        var organization = contact.organizations[0];
+
+         tizenContact.organization = new tizen.ContacOrganization({
+             name:          organization.name,
+             department:    organization.department,
+             office:        "",
+             title:         organization.title,
+             role:          "",
+             logoURI:       ""
+         });
+    }
+
+    // categories
+    if (utils.isArray(contact.categories)) {
+        tizenContact.categories = [];
+
+        var category = null;
+
+        for (i = 0; i < contact.categories.length; i += 1) {
+            category = contact.categories[i];
+
+            if (typeof category === "string") {
+                tizenContact.categories.push(category);
+            }
+        }
+    }
+    else {
+        tizenContact.categories = [];
+    }
+
+    // save to device
+    // in tizen contact mean update or add
+    // later we might use addBatch and updateBatch
+    if (update){
+        tizen.contact.getDefaultAddressBook().update(tizenContact);
+    }
+    else {
+        tizen.contact.getDefaultAddressBook().add(tizenContact);
+    }
+
+    // Use the fully populated Tizen contact object to create a
+    // corresponding W3C contact object.
+    return ContactUtils.createContact(tizenContact, [ "*" ]);
+};
+
+
+/**
+ * Creates a Tizen ContactAddress object from a W3C ContactAddress.
+ *
+ * @return {tizen.ContactAddress} a Tizen ContactAddress object
+ */
+var createTizenAddress = function(address) {
+
+    var type = null,
+        pref = null,
+        typesAr = [];
+
+    if (address === null) {
+        return null;
+    }
+
+
+    var tizenAddress = new tizen.ContactAddress();
+
+    if (tizenAddress === null) {
+        return null;
+    }
+
+    typesAr.push(address.type);
+
+    if (address.pref) {
+        typesAr.push("PREF");
+    }
+
+    tizenAddress.country = address.country || "";
+    tizenAddress.region = address.region || "";
+    tizenAddress.city = address.locality || "";
+    tizenAddress.streetAddress = address.streetAddress || "";
+    tizenAddress.postalCode = address.postalCode || "";
+    tizenAddress.types = typesAr || "";
+
+    return tizenAddress;
+};
+
+module.exports = {
+    /**
+     * Persists contact to device storage.
+     */
+
+    save : function(successCB, failCB) {
+
+        try {
+            // save the contact and store it's unique id
+            var fullContact = saveToDevice(this);
+
+            this.id = fullContact.id;
+
+            // This contact object may only have a subset of properties
+            // if the save was an update of an existing contact. This is
+            // because the existing contact was likely retrieved using a
+            // subset of properties, so only those properties were set in the
+            // object. For this reason, invoke success with the contact object
+            // returned by saveToDevice since it is fully populated.
+
+            if (typeof successCB === 'function') {
+                successCB(fullContact);
+            }
+        }
+        catch (error) {
+            console.log('Error saving contact: ' +  error);
+
+            if (typeof failCB === 'function') {
+                failCB (new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    },
+
+    /**
+     * Removes contact from device storage.
+     *
+     * @param successCB
+     *            successCB callback
+     * @param failCB
+     *            error callback
+     */
+    remove : function (successCB, failCB) {
+
+        try {
+            // retrieve contact from device by id
+            var tizenContact = null;
+
+            if (this.id) {
+                tizenContact = findByUniqueId(this.id);
+            }
+
+
+            // if contact was found, remove it
+            if (tizenContact) {
+
+                tizen.contact.getDefaultAddressBook().remove(tizenContact.id);
+
+                if (typeof success === 'function') {
+                    successCB(this);
+                }
+            }
+            // attempting to remove a contact that hasn't been saved
+            else if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+        catch (error) {
+            console.log('Error removing contact ' + this.id + ": " + error);
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/ContactUtils.js
+define("cordova/plugin/tizen/ContactUtils", function(require, exports, module) {
+/*global tizen:false */
+var ContactAddress = require('cordova/plugin/ContactAddress'),
+    ContactName = require('cordova/plugin/ContactName'),
+    ContactField = require('cordova/plugin/ContactField'),
+    ContactOrganization = require('cordova/plugin/ContactOrganization'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+ * Mappings for each Contact field that may be used in a find operation. Maps
+ * W3C Contact fields to one or more fields in a Tizen contact object.
+ *
+ * Example: user searches with a filter on the Contact 'name' field:
+ *
+ * <code>Contacts.find(['name'], onSuccess, onFail, {filter:'Bob'});</code>
+ *
+ * The 'name' field does not exist in a Tizen contact. Instead, a filter
+ * expression will be built to search the Tizen contacts using the
+ * Tizen 'title', 'firstName' and 'lastName' fields.
+ */
+var fieldMappings = {
+    "id" : ["id"],
+    "displayName" : ["name.displayName"],
+    "nickname": ["name.nicknames"],
+    "name" : [ "name.prefix", "name.firstName", "name.lastName" ],
+    "phoneNumbers" : ["phoneNumbers.number","phoneNumbers.types"],
+    "emails" : ["emails.types", "emails.email"],
+    "addresses" : ["addresses.country","addresses.region","addresses.city","addresses.streetAddress","addresses.postalCode","addresses.country","addresses.types"],
+    "organizations" : ["organization.name","organization.department","organization.office", "organization.title"],
+    "birthday" : ["birthday"],
+    "note" : ["notes"],
+    "photos" : ["photoURI"],
+    "categories" : ["categories"],
+    "urls" : ["urls.url", "urls.type"]
+};
+
+/*
+ * Build an array of all of the valid W3C Contact fields. This is used to
+ * substitute all the fields when ["*"] is specified.
+ */
+var allFields = [];
+
+(function initializeAllFieldsMapping() {
+
+    for ( var key in fieldMappings) {
+        allFields.push(key);
+    }
+    // as we want it to be executed once
+    function initializeAllFieldsMapping() {
+    }
+
+})();
+
+/**
+ * Create a W3C ContactAddress object from a Tizen Address object
+ *
+ * @param {String}
+ *            type the type of address (e.g. work, home)
+ * @param {tizen.ContactAddress}
+ *            tizenAddress a Tizen Address object
+ * @return {ContactAddress} a contact address object or null if the specified
+ *         address is null
+ */
+var createContactAddress = function(type, tizenAddress) {
+    if (!tizenAddress) {
+        return null;
+    }
+
+    var streetAddress = tizenAddress.streetAddress;
+    var locality = tizenAddress.city || "";
+    var region = tizenAddress.region || "";
+    var postalCode = tizenAddress.postalCode || "";
+    var country = tizenAddress.country || "";
+    var formatted = streetAddress + ", " + locality + ", " + region + ", " + postalCode + ", " + country;
+
+    var contact = new ContactAddress(null, type, formatted, streetAddress, locality, region, postalCode, country);
+
+    return contact;
+};
+
+module.exports = {
+    /**
+     * Builds Tizen filter expressions for contact search using the
+     * contact fields and search filter provided.
+     *
+     * @param {String[]}
+     *            fields Array of Contact fields to search
+     * @param {String}
+     *            filter Filter, or search string
+     * @param {Boolean}
+     *                 multiple, one contacts or more wanted as result
+     * @return filter expression or null if fields is empty or filter is null or
+     *         empty
+     */
+
+    buildFilterExpression: function(fields, filter) {
+        // ensure filter exists
+        if (!filter || filter === "") {
+            return null;
+        }
+
+        if ((fields.length === 1) && (fields[0] === "*")) {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // build a filter expression using all Contact fields provided
+        var compositeFilter = null,
+            attributeFilter = null,
+            filterExpression = null,
+            matchFlag = "CONTAINS",
+            matchValue = filter,
+            attributesArray = [];
+
+        if (fields && utils.isArray(fields)) {
+
+            for ( var field in fields) {
+
+                if (!fields[field]) {
+                    continue;
+                }
+
+                // retrieve Tizen contact fields that map Cordova fields specified
+                // (tizenFields is a string or an array of strings)
+                var tizenFields = fieldMappings[fields[field]];
+
+                if (!tizenFields) {
+                    // does something maps
+                    continue;
+                }
+
+                // construct the filter expression using the Tizen fields
+                for ( var index in tizenFields) {
+                    attributeFilter = new tizen.AttributeFilter(tizenFields[index], matchFlag, matchValue);
+                    if (attributeFilter !== null) {
+                        attributesArray.push(attributeFilter);
+                    }
+                }
+            }
+        }
+
+        // fullfil tizen find attribute as a single or a composite attribute
+        if (attributesArray.length == 1 ) {
+            filterExpression = attributeFilter[0];
+        } else if (attributesArray.length > 1) {
+            // combine the filters as a Union
+            filterExpression = new tizen.CompositeFilter("UNION", attributesArray);
+        } else {
+            filterExpression = null;
+        }
+
+        return filterExpression;
+    },
+
+
+
+    /**
+     * Creates a Contact object from a Tizen Contact object, copying only
+     * the fields specified.
+     *
+     * This is intended as a privately used function but it is made globally
+     * available so that a Contact.save can convert a BlackBerry contact object
+     * into its W3C equivalent.
+     *
+     * @param {tizen.Contact}
+     *            tizenContact Tizen Contact object
+     * @param {String[]}
+     *            fields array of contact fields that should be copied
+     * @return {Contact} a contact object containing the specified fields or
+     *         null if the specified contact is null
+     */
+    createContact: function(tizenContact, fields) {
+
+        if (!tizenContact) {
+            return null;
+        }
+
+        // construct a new contact object
+        // always copy the contact id and displayName fields
+        var contact = new Contact(tizenContact.id, tizenContact.name.displayName);
+
+
+        // nothing to do
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            return contact;
+        } else if (fields.length === 1 && fields[0] === "*") {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // add the fields specified
+        for ( var key in fields) {
+
+            var field = fields[key],
+                index = 0;
+
+            if (!field) {
+                continue;
+            }
+
+            // name
+            if (field.indexOf('name') === 0) {
+
+                var formattedName = (tizenContact.name.prefix || "");
+
+                if (tizenContact.name.firstName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.firstName || "");
+                }
+
+                if (tizenContact.name.middleName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.middleName || "");
+                }
+
+                if (tizenContact.name.lastName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.lastName || "");
+                }
+
+                contact.name = new ContactName(
+                        formattedName,
+                        tizenContact.name.lastName,
+                        tizenContact.name.firstName,
+                        tizenContact.name.middleName,
+                        tizenContact.name.prefix,
+                        null);
+            }
+
+            // phoneNumbers
+            else if (field.indexOf('phoneNumbers') === 0) {
+
+                var phoneNumbers = [];
+
+                for (index = 0 ; index < tizenContact.phoneNumbers.length ; ++index) {
+
+                    phoneNumbers.push(
+                            new ContactField(
+                                    'PHONE',
+                                    tizenContact.phoneNumbers[index].number,
+                                    ((tizenContact.phoneNumbers[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+
+
+                contact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : null;
+            }
+
+            // emails
+            else if (field.indexOf('emails') === 0) {
+
+                var emails = [];
+
+                for (index = 0 ; index < tizenContact.emails.length ; ++index) {
+
+                    emails.push(
+                        new ContactField(
+                            'EMAILS',
+                            tizenContact.emails[index].email,
+                            ((tizenContact.emails[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+                contact.emails = emails.length > 0 ? emails : null;
+            }
+
+            // addresses
+            else if (field.indexOf('addresses') === 0) {
+
+                var addresses = [];
+                for (index = 0 ; index < tizenContact.addresses.length ; ++index) {
+
+                    addresses.push(
+                            new ContactAddress(
+                                    ((tizenContact.addresses[index].types[1] &&  tizenContact.addresses[index].types[1] === "PREF") ? true : false),
+                                    tizenContact.addresses[index].types[0] ? tizenContact.addresses[index].types[0] : "HOME",
+                                    null,
+                                    tizenContact.addresses[index].streetAddress,
+                                    tizenContact.addresses[index].city,
+                                    tizenContact.addresses[index].region,
+                                    tizenContact.addresses[index].postalCode,
+                                    tizenContact.addresses[index].country ));
+                }
+
+                contact.addresses = addresses.length > 0 ? addresses : null;
+            }
+
+            // birthday
+            else if (field.indexOf('birthday') === 0) {
+                if (utils.isDate(tizenContact.birthday)) {
+                    contact.birthday = tizenContact.birthday;
+                }
+            }
+
+            // note only one in Tizen Contact
+            else if (field.indexOf('note') === 0) {
+                if (tizenContact.note) {
+                    contact.note = tizenContact.note[0];
+                }
+            }
+
+            // organizations
+            else if (field.indexOf('organizations') === 0) {
+
+                var organizations = [];
+
+                // there's only one organization in a Tizen Address
+
+                if (tizenContact.organization) {
+                    organizations.push(
+                            new ContactOrganization(
+                                    true,
+                                    'WORK',
+                                    tizenContact.organization.name,
+                                    tizenContact.organization.department,
+                                    tizenContact.organization.jobTitle));
+                }
+
+                contact.organizations = organizations.length > 0 ? organizations : null;
+            }
+
+            // categories
+            else if (field.indexOf('categories') === 0) {
+
+                var categories = [];
+
+                if (tizenContact.categories) {
+
+                    for (index = 0 ; index < tizenContact.categories.length ; ++index) {
+                        categories.push(
+                                new ContactField(
+                                        'MAIN',
+                                        tizenContact.categories,
+                                        (index === 0) ));
+                    }
+
+                    contact.categories = categories.length > 0 ? categories : null;
+                }
+            }
+
+            // urls
+            else if (field.indexOf('urls') === 0) {
+                var urls = [];
+
+                if (tizenContact.urls) {
+                    for (index = 0 ; index <tizenContact.urls.length ; ++index) {
+                        urls.push(
+                                new ContactField(
+                                        tizenContact.urls[index].type,
+                                        tizenContact.urls[index].url,
+                                        (index === 0)));
+                    }
+                }
+
+                contact.urls = urls.length > 0 ? urls : null;
+            }
+
+            // photos
+            else if (field.indexOf('photos') === 0) {
+                var photos = [];
+
+                if (tizenContact.photoURI) {
+                    photos.push(new ContactField('URI', tizenContact.photoURI, true));
+                }
+
+                contact.photos = photos.length > 0 ? photos : null;
+            }
+        }
+
+        return contact;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Device.js
+define("cordova/plugin/tizen/Device", function(require, exports, module) {
+/*global tizen:false */
+var channel = require('cordova/channel');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+function Device() {
+    this.version = null;
+    this.uuid = null;
+    this.name = null;
+    this.cordova =  "2.0.0";
+    this.platform = "Tizen";
+
+    var me = this;
+
+    function onSuccessCallback(sysInfoProp) {
+        me.name = sysInfoProp.model;
+        me.uuid = sysInfoProp.imei;
+        me.version = sysInfoProp.version;
+        channel.onCordovaInfoReady.fire();
+    }
+
+    function onErrorCallback(error) {
+        console.log("error initializing cordova: " + error);
+    }
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getDeviceInfo(onSuccessCallback, onErrorCallback);
+    });
+}
+
+Device.prototype.getDeviceInfo = function(success, fail, args) {
+    tizen.systeminfo.getPropertyValue("Device", success, fail);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/tizen/plugin/tizen/File.js
+define("cordova/plugin/tizen/File", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileError = require('cordova/plugin/FileError'),
+    DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    File = require('cordova/plugin/File'),
+    FileSystem = require('cordova/plugin/FileSystem');
+
+var nativeRequestFileSystem = window.webkitRequestFileSystem,
+    nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL,
+    NativeFileReader = window.FileReader;
+
+function getFileSystemName(nativeFs) {
+    return (nativeFs.name.indexOf("Persistent") != -1) ? "persistent" : "temporary";
+}
+
+function makeEntry(entry) {
+    if (entry.isDirectory) {
+        return new DirectoryEntry(entry.name, decodeURI(entry.toURL()));
+    }
+    else {
+        return new FileEntry(entry.name, decodeURI(entry.toURL()));
+    }
+}
+
+module.exports = {
+    /* requestFileSystem */
+    requestFileSystem: function(successCallback, errorCallback, args) {
+        var type = args[0],
+            size = args[1];
+
+        nativeRequestFileSystem(type, size, function(nativeFs) {
+            successCallback(new FileSystem(getFileSystemName(nativeFs), makeEntry(nativeFs.root)));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* resolveLocalFileSystemURI */
+    resolveLocalFileSystemURI: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            successCallback(makeEntry(entry));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryReader */
+    readEntries: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(dirEntry) {
+            var reader = dirEntry.createReader();
+            reader.readEntries(function(entries) {
+                var retVal = [];
+                for (var i = 0; i < entries.length; i++) {
+                    retVal.push(makeEntry(entries[i]));
+                }
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* Entry */
+    getMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getMetadata(function(metaData) {
+                successCallback(metaData.modificationTime);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    moveTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.moveTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    copyTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.copyTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    remove: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.remove(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getParent: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getParent(function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileEntry */
+    getFileMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.file(function(file) {
+                var retVal = new File(file.name, decodeURI(entry.toURL()), file.type, file.lastModifiedDate, file.size);
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryEntry */
+    getDirectory: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getDirectory(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    removeRecursively: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.removeRecursively(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getFile: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getFile(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileReader */
+    readAsText: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            encoding = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsText(file, encoding);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    readAsDataURL: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsDataURL(file);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileWriter */
+    write: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            text = args[1],
+            position = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.position - position);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                var blob = new WebKitBlobBuilder();
+                blob.append(text);
+
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.seek(position);
+                writer.write(blob.getBlob('text/plain'));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    truncate: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            size = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.length);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.truncate(size);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/FileTransfer.js
+define("cordova/plugin/tizen/FileTransfer", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileEntry = require('cordova/plugin/FileEntry'),
+    FileTransferError = require('cordova/plugin/FileTransferError'),
+    FileUploadResult = require('cordova/plugin/FileUploadResult');
+
+var nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL;
+
+function getParentPath(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(0, pos + 1);
+}
+
+function getFileName(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(pos + 1);
+}
+
+module.exports = {
+    upload: function(successCallback, errorCallback, args) {
+        var filePath = args[0],
+            server = args[1],
+            fileKey = args[2],
+            fileName = args[3],
+            mimeType = args[4],
+            params = args[5],
+            /*trustAllHosts = args[6],*/
+            chunkedMode = args[7];
+
+        nativeResolveLocalFileSystemURI(filePath, function(entry) {
+            entry.file(function(file) {
+                function uploadFile(blobFile) {
+                    var fd = new FormData();
+
+                    fd.append(fileKey, blobFile, fileName);
+                    for (var prop in params) {
+                        if(params.hasOwnProperty(prop)) {
+                            fd.append(prop, params[prop]);
+                        }
+                    }
+
+                    var xhr = new XMLHttpRequest();
+                    xhr.open("POST", server);
+                    xhr.onload = function(evt) {
+                        if (xhr.status == 200) {
+                            var result = new FileUploadResult();
+                            result.bytesSent = file.size;
+                            result.responseCode = xhr.status;
+                            result.response = xhr.response;
+                            successCallback(result);
+                        } else if (xhr.status == 404) {
+                            errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                        } else {
+                            errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                        }
+                    };
+                    xhr.ontimeout = function(evt) {
+                        errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                    };
+
+                    xhr.send(fd);
+                }
+
+                var bytesPerChunk;
+                if (chunkedMode === true) {
+                    bytesPerChunk = 1024 * 1024; // 1MB chunk sizes.
+                } else {
+                    bytesPerChunk = file.size;
+                }
+                var start = 0;
+                var end = bytesPerChunk;
+                while (start < file.size) {
+                    var chunk = file.webkitSlice(start, end, mimeType);
+                    uploadFile(chunk);
+                    start = end;
+                    end = start + bytesPerChunk;
+                }
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            }
+            );
+        },
+        function(error) {
+            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+        }
+        );
+    },
+
+    download: function(successCallback, errorCallback, args) {
+        var url = args[0],
+            filePath = args[1];
+
+        var xhr = new XMLHttpRequest();
+
+        function writeFile(fileEntry) {
+            fileEntry.createWriter(function(writer) {
+                writer.onwriteend = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(new FileEntry(fileEntry.name, fileEntry.toURL()));
+                    } else {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    }
+                };
+
+                writer.onerror = function(evt) {
+                    errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                };
+
+                var builder = new WebKitBlobBuilder();
+                builder.append(xhr.response);
+                var blob = builder.getBlob();
+                writer.write(blob);
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            });
+        }
+
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState == xhr.DONE) {
+                if (xhr.status == 200 && xhr.response) {
+                    nativeResolveLocalFileSystemURI(getParentPath(filePath), function(dir) {
+                        dir.getFile(getFileName(filePath), {create: true}, writeFile, function(error) {
+                            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                        });
+                    }, function(error) {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    });
+                } else if (xhr.status == 404) {
+                    errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                } else {
+                    errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                }
+            }
+        };
+
+        xhr.open("GET", url, true);
+        xhr.responseType = "arraybuffer";
+        xhr.send();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Media.js
+define("cordova/plugin/tizen/Media", function(require, exports, module) {
+/*global Media:false, webkitURL:false */
+var MediaError = require('cordova/plugin/MediaError'),
+    audioObjects = {};
+
+module.exports = {
+    create: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::create() - id =" + id + ", src =" + src);
+        audioObjects[id] = new Audio(src);
+        audioObjects[id].onStalledCB = function () {
+            console.log("media::onStalled()");
+             audioObjects[id].timer = window.setTimeout(function () {
+                    audioObjects[id].pause();
+                    if (audioObjects[id].currentTime !== 0)
+                        audioObjects[id].currentTime = 0;
+                    console.log("media::onStalled() - MEDIA_ERROR -> " + MediaError.MEDIA_ERR_ABORTED);
+                    var err = new MediaError(MediaError.MEDIA_ERR_ABORTED, "Stalled");
+                    Media.onStatus(id, Media.MEDIA_ERROR, err);
+                }, 2000);
+        };
+        audioObjects[id].onEndedCB = function () {
+            console.log("media::onEndedCB() - MEDIA_STATE -> MEDIA_STOPPED");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        };
+        audioObjects[id].onErrorCB = function () {
+            console.log("media::onErrorCB() - MEDIA_ERROR -> " + event.srcElement.error);
+            Media.onStatus(id, Media.MEDIA_ERROR, event.srcElement.error);
+        };
+        audioObjects[id].onPlayCB = function () {
+            console.log("media::onPlayCB() - MEDIA_STATE -> MEDIA_STARTING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING);
+        };
+        audioObjects[id].onPlayingCB = function () {
+            console.log("media::onPlayingCB() - MEDIA_STATE -> MEDIA_RUNNING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING);
+        };
+        audioObjects[id].onDurationChangeCB = function () {
+            console.log("media::onDurationChangeCB() - MEDIA_DURATION -> " +  audioObjects[id].duration);
+            Media.onStatus(id, Media.MEDIA_DURATION, audioObjects[id].duration);
+        };
+        audioObjects[id].onTimeUpdateCB = function () {
+            console.log("media::onTimeUpdateCB() - MEDIA_POSITION -> " +  audioObjects[id].currentTime);
+            Media.onStatus(id, Media.MEDIA_POSITION, audioObjects[id].currentTime);
+        };
+        audioObjects[id].onCanPlayCB = function () {
+            console.log("media::onCanPlayCB()");
+            window.clearTimeout(audioObjects[id].timer);
+            audioObjects[id].play();
+        };
+      },
+    startPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1], options = args[2];
+        console.log("media::startPlayingAudio() - id =" + id + ", src =" + src + ", options =" + options);
+        audioObjects[id].addEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].addEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].addEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].addEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].addEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].addEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].addEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].addEventListener('stalled', audioObjects[id].onStalledCB);
+        audioObjects[id].play();
+    },
+    stopPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        audioObjects[id].pause();
+        if (audioObjects[id].currentTime !== 0)
+            audioObjects[id].currentTime = 0;
+        console.log("media::stopPlayingAudio() - MEDIA_STATE -> MEDIA_STOPPED");
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        audioObjects[id].removeEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].removeEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].removeEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].removeEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].removeEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].removeEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onStalledCB);
+    },
+    seekToAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], milliseconds = args[1];
+        console.log("media::seekToAudio()");
+         audioObjects[id].currentTime = milliseconds;
+        successCallback( audioObjects[id].currentTime);
+    },
+    pausePlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::pausePlayingAudio() - MEDIA_STATE -> MEDIA_PAUSED");
+        audioObjects[id].pause();
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED);
+    },
+    getCurrentPositionAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::getCurrentPositionAudio()");
+        successCallback(audioObjects[id].currentTime);
+    },
+    release: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        console.log("media::release()");
+    },
+    setVolume: function (successCallback, errorCallback, args) {
+        var id = args[0], volume = args[1];
+        console.log("media::setVolume()");
+        audioObjects[id].volume = volume;
+    },
+    startRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::startRecordingAudio() - id =" + id + ", src =" + src);
+
+        function gotStreamCB(stream) {
+            audioObjects[id].src = webkitURL.createObjectURL(stream);
+            console.log("media::startRecordingAudio() - stream CB");
+        }
+
+        function gotStreamFailedCB(error) {
+            console.log("media::startRecordingAudio() - error CB:" + error.toString());
+        }
+
+        if (navigator.webkitGetUserMedia) {
+            audioObjects[id] = new Audio();
+            navigator.webkitGetUserMedia('audio', gotStreamCB, gotStreamFailedCB);
+        } else {
+            console.log("webkitGetUserMedia not supported");
+        }
+        successCallback();
+    },
+    stopRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::stopRecordingAudio() - id =" + id);
+        audioObjects[id].pause();
+        successCallback();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/MediaError.js
+define("cordova/plugin/tizen/MediaError", function(require, exports, module) {
+
+// The MediaError object already exists on Tizen. This prevents the Cordova
+// version from being defined. This object is used to merge in differences
+// between Tizen and Cordova MediaError objects.
+module.exports = {
+        MEDIA_ERR_NONE_ACTIVE : 0,
+        MEDIA_ERR_NONE_SUPPORTED : 4
+};
+});
+
+// file: lib/tizen/plugin/tizen/NetworkStatus.js
+define("cordova/plugin/tizen/NetworkStatus", function(require, exports, module) {
+/*global tizen:false */
+var Connection = require('cordova/plugin/Connection');
+
+module.exports = {
+    getConnectionInfo: function (successCallback, errorCallback) {
+        var cncType = Connection.NONE;
+        var infoCount = 0;
+
+        function infoCB() {
+            infoCount++;
+            if (infoCount > 1)
+               successCallback(cncType);
+        }
+
+        function errorCB(error) {
+           console.log("Error: " + error.code + "," + error.name + "," + error.message);
+           infoCB();
+        }
+
+        function wifiSuccessCB(wifi) {
+            if ((wifi.status === "ON")  && (wifi.ipAddress.length !== 0))
+                cncType = Connection.WIFI;
+            infoCB();
+        }
+
+        function cellularSuccessCB(cell) {
+            if ((cncType === Connection.NONE) && (cell.status === "ON") && (cell.ipAddress.length !== 0))
+                cncType = Connection.CELL_2G;
+            infoCB();
+        }
+
+        if (tizen.systeminfo.isSupported('WifiNetwork')) {
+            tizen.systeminfo.getPropertyValue('WifiNetwork', wifiSuccessCB, errorCB);
+        }
+
+        if (tizen.systeminfo.isSupported('CellularNetwork')) {
+            tizen.systeminfo.getPropertyValue('CellularNetwork', cellularSuccessCB, errorCB);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Notification.js
+define("cordova/plugin/tizen/Notification", function(require, exports, module) {
+module.exports = {
+
+    alert: function(message, alertCallback, title, buttonName) {
+        return this.confirm(message, alertCallback, title, buttonName);
+    },
+
+    confirm: function(message, confirmCallback, title, buttonLabels) {
+        var index = null,
+            overlayElement = null,
+            popup = null,
+            element = null,
+            titleString = null,
+            messageString = null,
+            buttonString = null,
+            buttonsArray = null;
+
+        function initCss() {
+            var id = 'tizen-cordova-css';
+            if (document.getElementById(id))
+                return;
+
+            var rules = {
+                '.ui-popupwindow-screen' :  'background: #000000; opacity: 0.4;',
+                '.ui-popupwindow' : 'background: #828282; padding: 1px 1px; color: white; width: 80%; margin-left: 10%;',
+                '.popup-title' : 'background: #018ccc; padding: 5px 5px;',
+                '.popup-title p' : 'padding: 0px; margin: 0px; text-align: center;',
+                '.popup-text' : 'background: #2d2d2d; padding: 5px 5px;',
+                '.popup-text p' : 'padding: 0px; margin: 0px; text-align: center; vertical-align: middle; line-height:100px;',
+                '.popup-button-bg' : 'background: #424242; padding: 5px 5px;',
+                '.popup-button-bg ul' : 'list-style-type: none; width: 80%; margin-left: 10%; text-align: center; padding: 0px;',
+                '.popup-button-bg li' : 'display: inline;',
+                '.popup-button-bg li input' : 'border-radius: 4px 4px 4px 4px; border: 0px; background: #545454; padding: 5px 15px; color: white; min-width: 80px; margin: 0px 5px;'
+            };
+
+            var css = document.createElement('style');
+            css.type = 'text/css';
+            css.id = id;
+
+            var selector = null;
+            for (selector in rules) {
+                css.appendChild(document.createTextNode(selector + "{ " + rules[selector] + " }"));
+            }
+
+            document.getElementsByTagName("head")[0].appendChild(css);
+        }
+
+        initCss();
+
+        console.log ("message" , message);
+        console.log ("confirmCallback" , confirmCallback);
+        console.log ("title" , title);
+        console.log ("buttonLabels" , buttonLabels);
+
+        titleString = '<div class="popup-title"><p>' + title + '</p></div>';
+        messageString = '<div class="popup-text"><p>' + message + '</p></div>';
+        buttonString = '<div class="popup-button-bg"><ul>';
+
+        switch(typeof(buttonLabels))
+        {
+        case "string":
+            buttonsArray = buttonLabels.split(",");
+
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+
+        case "array":
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+        default:
+            console.log ("cordova/plugin/tizen/Notification, default, buttonLabels: ", buttonLabels);
+            break;
+        }
+
+        buttonString += '</ul></div>';
+
+        overlayElement = document.createElement("div");
+        overlayElement.className = 'ui-popupwindow-screen';
+
+        overlayElement.style.zIndex = 1001;
+        overlayElement.style.width = "100%";
+        overlayElement.style.height = "100%";
+        overlayElement.style.top = 0;
+        overlayElement.style.left = 0;
+        overlayElement.style.margin = 0;
+        overlayElement.style.padding = 0;
+        overlayElement.style.position = "absolute";
+
+        popup = document.createElement("div");
+        popup.className = "ui-popupwindow";
+        popup.style.position = "fixed";
+        popup.style.zIndex = 1002;
+        popup.innerHTML = titleString + messageString + buttonString;
+
+        document.body.appendChild(overlayElement);
+        document.body.appendChild(popup);
+
+        function createListener(button) {
+            return function() {
+                document.body.removeChild(overlayElement);
+                document.body.removeChild(popup);
+                confirmCallback(button.value);
+            };
+        }
+
+       for (index in buttonsArray) {
+           console.log ("index: ", index);
+
+           element = document.getElementById("popup-button-" + buttonsArray[index]);
+           element.addEventListener("click", createListener(element), false);
+       }
+    },
+
+    vibrate: function(milliseconds) {
+        console.log ("milliseconds" , milliseconds);
+
+        if (navigator.vibrate) {
+            navigator.vibrate(milliseconds);
+        }
+        else {
+            console.log ("cordova/plugin/tizen/Notification, vibrate API does not exists");
+        }
+    },
+
+    beep: function(count) {
+            console.log("notification:beep() - count = " + count);
+
+            var beepSound = new Audio("/sounds/beep.wav");
+            beepSound.cpt = 0;
+
+            beepSound.addEventListener('canplay', function () {
+                console.log("notification:beepSound() - canpay CB");
+                this.play();
+            });
+
+            beepSound.addEventListener('ended', function () {
+                console.log("notification:beepSound() - ended CB: cpt = " + this.cpt);
+                if (this.cpt !== 0) {
+                    if (this.currentTime !== 0)
+                        this.currentTime = 0;
+                    this.play();
+                    this.cpt--;
+                }
+            });
+
+            beepSound.addEventListener('error',  function () {
+                    console.log("notification:beepSound() - error CB");
+            });
+
+            beepSound.load();
+            beepSound.pause();
+            if (beepSound.currentTime !== 0)
+                beepSound.currentTime = 0;
+            beepSound.cpt = count - 1;
+            beepSound.play();
+    }
+};
+
+
+
+});
+
+// file: lib/tizen/plugin/tizen/contacts.js
+define("cordova/plugin/tizen/contacts", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils');
+
+module.exports = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     *
+     * @return array of Contacts matching search criteria
+     */
+    find : function(fields, successCB, failCB, options) {
+
+        // Success callback is required. Throw exception if not specified.
+        if (typeof successCB !== 'function') {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+
+        // Search qualifier is required and cannot be empty.
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+            return;
+        }
+
+        // options are optional
+        var filter ="",
+            multiple = false,
+            contacts = [],
+            tizenFilter = null;
+
+        if (options) {
+            filter = options.filter || "";
+            multiple =  options.multiple || false;
+        }
+
+        if (filter){
+            tizenFilter = ContactUtils.buildFilterExpression(fields, filter);
+        }
+
+        tizen.contact.getDefaultAddressBook().find(
+            function(tizenContacts) {
+                if (multiple) {
+                    for (var index in tizenContacts) {
+                        contacts.push(ContactUtils.createContact(tizenContacts[index], fields));
+                    }
+                }
+                else {
+                    contacts.push(ContactUtils.createContact(tizenContacts[0], fields));
+                }
+
+                // return results
+                successCB(contacts);
+            },
+            function(error) {
+                if (typeof failCB === 'function') {
+                    failCB(ContactError.UNKNOWN_ERROR);
+                }
+            },
+            tizenFilter,
+            null);
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/manager.js
+define("cordova/plugin/tizen/manager", function(require, exports, module) {
+var cordova = require('cordova');
+
+module.exports = {
+    exec: function (successCallback, errorCallback, clazz, action, args) {
+        var plugin = require('cordova/plugin/tizen/' + clazz);
+
+        if (plugin && typeof plugin[action] === 'function') {
+            var result = plugin[action](successCallback, errorCallback, args);
+            return result || {status: cordova.callbackStatus.NO_RESULT};
+        }
+
+        return {"status" : cordova.callbackStatus.CLASS_NOT_FOUND_EXCEPTION, "message" : "Function " + clazz + "::" + action + " cannot be found"};
+    },
+    resume: function () {},
+    pause: function () {},
+    destroy: function () {}
+};
+
+});
+
+// file: lib/common/utils.js
+define("cordova/utils", function(require, exports, module) {
+var utils = exports;
+
+/**
+ * Returns an indication of whether the argument is an array or not
+ */
+utils.isArray = function(a) {
+    return Object.prototype.toString.call(a) == '[object Array]';
+};
+
+/**
+ * Returns an indication of whether the argument is a Date or not
+ */
+utils.isDate = function(d) {
+    return Object.prototype.toString.call(d) == '[object Date]';
+};
+
+/**
+ * Does a deep clone of the object.
+ */
+utils.clone = function(obj) {
+    if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
+        return obj;
+    }
+
+    var retVal, i;
+
+    if(utils.isArray(obj)){
+        retVal = [];
+        for(i = 0; i < obj.length; ++i){
+            retVal.push(utils.clone(obj[i]));
+        }
+        return retVal;
+    }
+
+    retVal = {};
+    for(i in obj){
+        if(!(i in retVal) || retVal[i] != obj[i]) {
+            retVal[i] = utils.clone(obj[i]);
+        }
+    }
+    return retVal;
+};
+
+/**
+ * Returns a wrappered version of the function
+ */
+utils.close = function(context, func, params) {
+    if (typeof params == 'undefined') {
+        return function() {
+            return func.apply(context, arguments);
+        };
+    } else {
+        return function() {
+            return func.apply(context, params);
+        };
+    }
+};
+
+/**
+ * Create a UUID
+ */
+utils.createUUID = function() {
+    return UUIDcreatePart(4) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(6);
+};
+
+/**
+ * Extends a child object from a parent object using classical inheritance
+ * pattern.
+ */
+utils.extend = (function() {
+    // proxy used to establish prototype chain
+    var F = function() {};
+    // extend Child from Parent
+    return function(Child, Parent) {
+        F.prototype = Parent.prototype;
+        Child.prototype = new F();
+        Child.__super__ = Parent.prototype;
+        Child.prototype.constructor = Child;
+    };
+}());
+
+/**
+ * Alerts a message in any available way: alert or console.log.
+ */
+utils.alert = function(msg) {
+    if (alert) {
+        alert(msg);
+    } else if (console && console.log) {
+        console.log(msg);
+    }
+};
+
+/**
+ * Formats a string and arguments following it ala sprintf()
+ *
+ * see utils.vformat() for more information
+ */
+utils.format = function(formatString /* ,... */) {
+    var args = [].slice.call(arguments, 1);
+    return utils.vformat(formatString, args);
+};
+
+/**
+ * Formats a string and arguments following it ala vsprintf()
+ *
+ * format chars:
+ *   %j - format arg as JSON
+ *   %o - format arg as JSON
+ *   %c - format arg as ''
+ *   %% - replace with '%'
+ * any other char following % will format it's
+ * arg via toString().
+ *
+ * for rationale, see FireBug's Console API:
+ *    http://getfirebug.com/wiki/index.php/Console_API
+ */
+utils.vformat = function(formatString, args) {
+    if (formatString === null || formatString === undefined) return "";
+    if (arguments.length == 1) return formatString.toString();
+    if (typeof formatString != "string") return formatString.toString();
+
+    var pattern = /(.*?)%(.)(.*)/;
+    var rest    = formatString;
+    var result  = [];
+
+    while (args.length) {
+        var arg   = args.shift();
+        var match = pattern.exec(rest);
+
+        if (!match) break;
+
+        rest = match[3];
+
+        result.push(match[1]);
+
+        if (match[2] == '%') {
+            result.push('%');
+            args.unshift(arg);
+            continue;
+        }
+
+        result.push(formatted(arg, match[2]));
+    }
+
+    result.push(rest);
+
+    return result.join('');
+};
+
+//------------------------------------------------------------------------------
+function UUIDcreatePart(length) {
+    var uuidpart = "";
+    for (var i=0; i<length; i++) {
+        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
+        if (uuidchar.length == 1) {
+            uuidchar = "0" + uuidchar;
+        }
+        uuidpart += uuidchar;
+    }
+    return uuidpart;
+}
+
+//------------------------------------------------------------------------------
+function formatted(object, formatChar) {
+
+    try {
+        switch(formatChar) {
+            case 'j':
+            case 'o': return JSON.stringify(object);
+            case 'c': return '';
+        }
+    }
+    catch (e) {
+        return "error JSON.stringify()ing argument: " + e;
+    }
+
+    if ((object === null) || (object === undefined)) {
+        return Object.prototype.toString.call(object);
+    }
+
+    return object.toString();
+}
+
+});
+
+
+window.cordova = require('cordova');
+
+// file: lib/scripts/bootstrap.js
+(function (context) {
+    var channel = require("cordova/channel"),
+        _self = {
+            boot: function () {
+                /**
+                 * Create all cordova objects once page has fully loaded and native side is ready.
+                 */
+                channel.join(function() {
+                    var builder = require('cordova/builder'),
+                        base = require('cordova/common'),
+                        platform = require('cordova/platform');
+
+                    // Drop the common globals into the window object, but be nice and don't overwrite anything.
+                    builder.build(base.objects).intoButDontClobber(window);
+
+                    // Drop the platform-specific globals into the window object
+                    // and clobber any existing object.
+                    builder.build(platform.objects).intoAndClobber(window);
+
+                    // Merge the platform-specific overrides/enhancements into
+                    // the window object.
+                    if (typeof platform.merges !== 'undefined') {
+                        builder.build(platform.merges).intoAndMerge(window);
+                    }
+
+                    // Call the platform-specific initialization
+                    platform.initialize();
+
+                    // Fire event to notify that all objects are created
+                    channel.onCordovaReady.fire();
+
+                    // Fire onDeviceReady event once all constructors have run and
+                    // cordova info has been received from native side.
+                    channel.join(function() {
+                        require('cordova').fireDocumentEvent('deviceready');
+                    }, channel.deviceReadyChannelsArray);
+
+                }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);
+            }
+        };
+
+    // boot up once native side is ready
+    channel.onNativeReady.subscribeOnce(_self.boot);
+
+    // _nativeReady is global variable that the native side can set
+    // to signify that the native code is ready. It is a global since
+    // it may be called before any cordova JS is ready.
+    if (window._nativeReady) {
+        channel.onNativeReady.fire();
+    }
+
+}(window));
+
+// file: lib/scripts/bootstrap-tizen.js
+require('cordova/channel').onNativeReady.fire();
+
+
+})();
\ No newline at end of file
diff --git a/samples/cordova-tizen-web-ui/css/style.css b/samples/cordova-tizen-web-ui/css/style.css
new file mode 100644
index 0000000..25fa51c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/css/style.css
@@ -0,0 +1,2 @@
+body {
+}
diff --git a/samples/cordova-tizen-web-ui/icon.png b/samples/cordova-tizen-web-ui/icon.png
new file mode 100755
index 0000000..eef3cd9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/icon.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/index.html b/samples/cordova-tizen-web-ui/index.html
new file mode 100644
index 0000000..f5e3bce
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8"/>
+    <meta name="description" content="A Cordova Tizen Web UI FW single-page template generated by Tizen Web IDE"/>
+
+    <title>Tizen Web IDE - Template - Cordova Tizen - Tizen Web UI Framework - Single-Page</title>
+    <!--NOTE:
+        jquery.js and web-ui-fw.js must be included.
+        DO NOT REMOVE below code!
+    -->
+    <script src="tizen-web-ui-fw/0.1/js/jquery.js"></script>
+    <script src="tizen-web-ui-fw/0.1/js/tizen-web-ui-fw-libs.js"></script>
+    <script src="tizen-web-ui-fw/0.1/js/tizen-web-ui-fw.js"
+        data-framework-theme="tizen-gray" data-framework-viewport-scale="false"></script>
+
+    <!--NOTE:
+        Additional scripts and css files are to be placed here.
+        You can use jQuery namespace($) and all functionalities in jQuery
+        in your script.  For example:
+
+            <script src="main.js"></script>
+            <link rel="stylesheet" href="my.css">
+
+        When you want to manipulate elements in your code, you have to
+        use domReady for your code to work properly, like this;
+
+            domReady(function(){ ... });
+    -->
+    <script type="text/javascript" src="cordova-2.0.0.js"></script>
+        
+    <script type="text/javascript" src="./js/main.js"></script>
+    <link rel="stylesheet" type="text/css" href="./css/style.css"/>
+</head>
+
+<body>
+    <div data-role="page">
+        <div data-role="header" data-position="fixed">
+            <h1>Cordova Single-Page Application </h1>
+        </div><!-- /header -->
+
+        <div data-role="content">
+            <p>This is a Cordova single page boilerplate template that you can copy to build your first Cordova Tizen Web UI Framework page.</p>
+            <div id="myButton" data-role="button" data-inline="true">Battery Info</div>
+            <div id="myInfo" data-role="content" data-inline="true" hidden="hidden">
+            	<p>Battery Info.</p>
+            </div>
+        </div>
+        </div><!-- /content -->
+
+        <div data-role="footer" data-position="fixed">
+            <h4>Footer content</h4>
+        </div><!-- /footer -->
+    </div><!-- /page -->
+</body>
+</html>
diff --git a/samples/cordova-tizen-web-ui/js/main.js b/samples/cordova-tizen-web-ui/js/main.js
new file mode 100644
index 0000000..8d48a03
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/js/main.js
@@ -0,0 +1,27 @@
+var deviceReady = false;
+
+var init = function () {
+    console.log("init() called");
+    $("#myButton").click(function () {
+        $(this).remove();
+        $("#myInfo").show();
+        window.addEventListener("batterystatus", function(info) {
+            $("#myInfo").text("Level = " + info.level + "%, Status: " + ((info.isPlugged) ? "Plugged" : "Unplugged"));
+        }, false);
+    });
+    
+};
+
+window.onload = function () {
+    document.addEventListener("deviceready", function () {
+       deviceReady = true;
+       console.log("Device = " + device.platform + ", Version = " + device.version);
+       $(document).ready(init);
+    }, false);
+
+    window.setTimeout(function() {
+        if (!deviceReady) {
+            alert("Cordova initialization failed !!!");
+        }
+    }, 1000);
+};
diff --git a/samples/cordova-tizen-web-ui/sounds/beep.wav b/samples/cordova-tizen-web-ui/sounds/beep.wav
new file mode 100644
index 0000000..1e9797c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/sounds/beep.wav
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af-ZA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af-ZA.js
new file mode 100644
index 0000000..8588aef
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af-ZA.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture af-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "af-ZA", "default", {
+	name: "af-ZA",
+	englishName: "Afrikaans (South Africa)",
+	nativeName: "Afrikaans (Suid Afrika)",
+	language: "af",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
+				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
+				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
+			},
+			months: {
+				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af.js
new file mode 100644
index 0000000..0f17c0d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture af
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "af", "default", {
+	name: "af",
+	englishName: "Afrikaans",
+	nativeName: "Afrikaans",
+	language: "af",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
+				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
+				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
+			},
+			months: {
+				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am-ET.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am-ET.js
new file mode 100644
index 0000000..e603a0b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am-ET.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture am-ET
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "am-ET", "default", {
+	name: "am-ET",
+	englishName: "Amharic (Ethiopia)",
+	nativeName: "አማርኛ (ኢትዮጵያ)",
+	language: "am",
+	numberFormat: {
+		decimals: 1,
+		groupSizes: [3,0],
+		NaN: "NAN",
+		percent: {
+			pattern: ["-n%","n%"],
+			decimals: 1,
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			groupSizes: [3,0],
+			symbol: "ETB"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
+			},
+			months: {
+				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
+				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
+			},
+			AM: ["ጡዋት","ጡዋት","ጡዋት"],
+			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
+			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd '፣' MMMM d 'ቀን' yyyy",
+				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
+				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
+				M: "MMMM d ቀን",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am.js
new file mode 100644
index 0000000..fe1a37c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture am
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "am", "default", {
+	name: "am",
+	englishName: "Amharic",
+	nativeName: "አማርኛ",
+	language: "am",
+	numberFormat: {
+		decimals: 1,
+		groupSizes: [3,0],
+		NaN: "NAN",
+		percent: {
+			pattern: ["-n%","n%"],
+			decimals: 1,
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			groupSizes: [3,0],
+			symbol: "ETB"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
+			},
+			months: {
+				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
+				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
+			},
+			AM: ["ጡዋት","ጡዋት","ጡዋት"],
+			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
+			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd '፣' MMMM d 'ቀን' yyyy",
+				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
+				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
+				M: "MMMM d ቀን",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-AE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-AE.js
new file mode 100644
index 0000000..fdf1a51
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-AE.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-AE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-AE", "default", {
+	name: "ar-AE",
+	englishName: "Arabic (U.A.E.)",
+	nativeName: "العربية (الإمارات العربية المتحدة)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.إ.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-BH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-BH.js
new file mode 100644
index 0000000..b073e2c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-BH.js
@@ -0,0 +1,462 @@
+/*
+ * Globalize Culture ar-BH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-BH", "default", {
+	name: "ar-BH",
+	englishName: "Arabic (Bahrain)",
+	nativeName: "العربية (البحرين)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ب.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-DZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-DZ.js
new file mode 100644
index 0000000..75eaa7f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-DZ.js
@@ -0,0 +1,458 @@
+/*
+ * Globalize Culture ar-DZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-DZ", "default", {
+	name: "ar-DZ",
+	englishName: "Arabic (Algeria)",
+	nativeName: "العربية (الجزائر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.ج.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-EG.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-EG.js
new file mode 100644
index 0000000..9d2365c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-EG.js
@@ -0,0 +1,484 @@
+/*
+ * Globalize Culture ar-EG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-EG", "default", {
+	name: "ar-EG",
+	englishName: "Arabic (Egypt)",
+	nativeName: "العربية (مصر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ج.م.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-IQ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-IQ.js
new file mode 100644
index 0000000..0235336
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-IQ.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-IQ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-IQ", "default", {
+	name: "ar-IQ",
+	englishName: "Arabic (Iraq)",
+	nativeName: "العربية (العراق)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.ع.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-JO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-JO.js
new file mode 100644
index 0000000..152ce08
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-JO.js
@@ -0,0 +1,462 @@
+/*
+ * Globalize Culture ar-JO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-JO", "default", {
+	name: "ar-JO",
+	englishName: "Arabic (Jordan)",
+	nativeName: "العربية (الأردن)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ا.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-KW.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-KW.js
new file mode 100644
index 0000000..07d1f89
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-KW.js
@@ -0,0 +1,462 @@
+/*
+ * Globalize Culture ar-KW
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-KW", "default", {
+	name: "ar-KW",
+	englishName: "Arabic (Kuwait)",
+	nativeName: "العربية (الكويت)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ك.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LB.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LB.js
new file mode 100644
index 0000000..8c82f5a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LB.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-LB
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-LB", "default", {
+	name: "ar-LB",
+	englishName: "Arabic (Lebanon)",
+	nativeName: "العربية (لبنان)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.ل.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LY.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LY.js
new file mode 100644
index 0000000..5c16db8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LY.js
@@ -0,0 +1,462 @@
+/*
+ * Globalize Culture ar-LY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-LY", "default", {
+	name: "ar-LY",
+	englishName: "Arabic (Libya)",
+	nativeName: "العربية (ليبيا)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			decimals: 3,
+			symbol: "د.ل.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-MA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-MA.js
new file mode 100644
index 0000000..483eba8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-MA.js
@@ -0,0 +1,458 @@
+/*
+ * Globalize Culture ar-MA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-MA", "default", {
+	name: "ar-MA",
+	englishName: "Arabic (Morocco)",
+	nativeName: "العربية (المملكة المغربية)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.م.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-OM.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-OM.js
new file mode 100644
index 0000000..630fef0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-OM.js
@@ -0,0 +1,458 @@
+/*
+ * Globalize Culture ar-OM
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-OM", "default", {
+	name: "ar-OM",
+	englishName: "Arabic (Oman)",
+	nativeName: "العربية (عمان)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "ر.ع.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-QA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-QA.js
new file mode 100644
index 0000000..69839a2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-QA.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-QA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-QA", "default", {
+	name: "ar-QA",
+	englishName: "Arabic (Qatar)",
+	nativeName: "العربية (قطر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.ق.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SA.js
new file mode 100644
index 0000000..86c73cd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SA.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-SA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-SA", "default", {
+	name: "ar-SA",
+	englishName: "Arabic (Saudi Arabia)",
+	nativeName: "العربية (المملكة العربية السعودية)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SY.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SY.js
new file mode 100644
index 0000000..1444e7e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SY.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-SY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-SY", "default", {
+	name: "ar-SY",
+	englishName: "Arabic (Syria)",
+	nativeName: "العربية (سوريا)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-TN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-TN.js
new file mode 100644
index 0000000..47eb3ca
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-TN.js
@@ -0,0 +1,463 @@
+/*
+ * Globalize Culture ar-TN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-TN", "default", {
+	name: "ar-TN",
+	englishName: "Arabic (Tunisia)",
+	nativeName: "العربية (تونس)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ت.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-YE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-YE.js
new file mode 100644
index 0000000..2d25f2f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-YE.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-YE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-YE", "default", {
+	name: "ar-YE",
+	englishName: "Arabic (Yemen)",
+	nativeName: "العربية (اليمن)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.ي.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar.js
new file mode 100644
index 0000000..31938bd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar", "default", {
+	name: "ar",
+	englishName: "Arabic",
+	nativeName: "العربية",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn-CL.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn-CL.js
new file mode 100644
index 0000000..12a7ebe
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn-CL.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture arn-CL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "arn-CL", "default", {
+	name: "arn-CL",
+	englishName: "Mapudungun (Chile)",
+	nativeName: "Mapudungun (Chile)",
+	language: "arn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn.js
new file mode 100644
index 0000000..9839cd9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture arn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "arn", "default", {
+	name: "arn",
+	englishName: "Mapudungun",
+	nativeName: "Mapudungun",
+	language: "arn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as-IN.js
new file mode 100644
index 0000000..ead83ba
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as-IN.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture as-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "as-IN", "default", {
+	name: "as-IN",
+	englishName: "Assamese (India)",
+	nativeName: "অসমীয়া (ভাৰত)",
+	language: "as",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","n$"],
+			groupSizes: [3,2],
+			symbol: "ট"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্রবাৰ","শনিবাৰ","ৰবিবাৰ"],
+				namesAbbr: ["সোম.","মঙ্গল.","বুধ.","বৃহ.","শুক্র.","শনি.","ৰবি."],
+				namesShort: ["সো","ম","বু","বৃ","শু","শ","র"]
+			},
+			months: {
+				names: ["জানুৱাৰী","ফেব্রুৱাৰী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টেম্বর","অক্টোবর","নবেম্বর","ডিচেম্বর",""],
+				namesAbbr: ["জানু","ফেব্রু","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টে","অক্টো","নবে","ডিচে",""]
+			},
+			AM: ["ৰাতিপু","ৰাতিপু","ৰাতিপু"],
+			PM: ["আবেলি","আবেলি","আবেলি"],
+			eras: [{"name":"খ্রীষ্টাব্দ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "yyyy,MMMM dd, dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy,MMMM dd, dddd tt h:mm",
+				F: "yyyy,MMMM dd, dddd tt h:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM,yy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as.js
new file mode 100644
index 0000000..f20cccf
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture as
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "as", "default", {
+	name: "as",
+	englishName: "Assamese",
+	nativeName: "অসমীয়া",
+	language: "as",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","n$"],
+			groupSizes: [3,2],
+			symbol: "ট"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্রবাৰ","শনিবাৰ","ৰবিবাৰ"],
+				namesAbbr: ["সোম.","মঙ্গল.","বুধ.","বৃহ.","শুক্র.","শনি.","ৰবি."],
+				namesShort: ["সো","ম","বু","বৃ","শু","শ","র"]
+			},
+			months: {
+				names: ["জানুৱাৰী","ফেব্রুৱাৰী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টেম্বর","অক্টোবর","নবেম্বর","ডিচেম্বর",""],
+				namesAbbr: ["জানু","ফেব্রু","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টে","অক্টো","নবে","ডিচে",""]
+			},
+			AM: ["ৰাতিপু","ৰাতিপু","ৰাতিপু"],
+			PM: ["আবেলি","আবেলি","আবেলি"],
+			eras: [{"name":"খ্রীষ্টাব্দ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "yyyy,MMMM dd, dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy,MMMM dd, dddd tt h:mm",
+				F: "yyyy,MMMM dd, dddd tt h:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM,yy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl-AZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl-AZ.js
new file mode 100644
index 0000000..5808bdf
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl-AZ.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az-Cyrl-AZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az-Cyrl-AZ", "default", {
+	name: "az-Cyrl-AZ",
+	englishName: "Azeri (Cyrillic, Azerbaijan)",
+	nativeName: "Азәрбајҹан (Азәрбајҹан)",
+	language: "az-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "ман."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],
+				namesAbbr: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],
+				namesShort: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"]
+			},
+			months: {
+				names: ["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["јанвар","феврал","март","апрел","мај","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","мая","ијун","ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl.js
new file mode 100644
index 0000000..786b81f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az-Cyrl", "default", {
+	name: "az-Cyrl",
+	englishName: "Azeri (Cyrillic)",
+	nativeName: "Азәрбајҹан дили",
+	language: "az-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "ман."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],
+				namesAbbr: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],
+				namesShort: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"]
+			},
+			months: {
+				names: ["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["јанвар","феврал","март","апрел","мај","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","мая","ијун","ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn-AZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn-AZ.js
new file mode 100644
index 0000000..a70d637
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn-AZ.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az-Latn-AZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az-Latn-AZ", "default", {
+	name: "az-Latn-AZ",
+	englishName: "Azeri (Latin, Azerbaijan)",
+	nativeName: "Azərbaycan­ılı (Azərbaycan)",
+	language: "az-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn.js
new file mode 100644
index 0000000..a8175c2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az-Latn", "default", {
+	name: "az-Latn",
+	englishName: "Azeri (Latin)",
+	nativeName: "Azərbaycan­ılı",
+	language: "az-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az.js
new file mode 100644
index 0000000..94c9ad0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az", "default", {
+	name: "az",
+	englishName: "Azeri",
+	nativeName: "Azərbaycan­ılı",
+	language: "az",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba-RU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba-RU.js
new file mode 100644
index 0000000..b5f9559
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba-RU.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture ba-RU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ba-RU", "default", {
+	name: "ba-RU",
+	englishName: "Bashkir (Russia)",
+	nativeName: "Башҡорт (Россия)",
+	language: "ba",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ",",
+			symbol: "һ."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Йәкшәмбе","Дүшәмбе","Шишәмбе","Шаршамбы","Кесаҙна","Йома","Шәмбе"],
+				namesAbbr: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"],
+				namesShort: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"]
+			},
+			months: {
+				names: ["ғинуар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь",""],
+				namesAbbr: ["ғин","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy 'й'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'й' H:mm",
+				F: "d MMMM yyyy 'й' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba.js
new file mode 100644
index 0000000..b026451
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture ba
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ba", "default", {
+	name: "ba",
+	englishName: "Bashkir",
+	nativeName: "Башҡорт",
+	language: "ba",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ",",
+			symbol: "һ."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Йәкшәмбе","Дүшәмбе","Шишәмбе","Шаршамбы","Кесаҙна","Йома","Шәмбе"],
+				namesAbbr: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"],
+				namesShort: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"]
+			},
+			months: {
+				names: ["ғинуар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь",""],
+				namesAbbr: ["ғин","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy 'й'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'й' H:mm",
+				F: "d MMMM yyyy 'й' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be-BY.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be-BY.js
new file mode 100644
index 0000000..9f736f2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be-BY.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture be-BY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "be-BY", "default", {
+	name: "be-BY",
+	englishName: "Belarusian (Belarus)",
+	nativeName: "Беларускі (Беларусь)",
+	language: "be",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],
+				namesAbbr: ["нд","пн","аў","ср","чц","пт","сб"],
+				namesShort: ["нд","пн","аў","ср","чц","пт","сб"]
+			},
+			months: {
+				names: ["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			monthsGenitive: {
+				names: ["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be.js
new file mode 100644
index 0000000..422a644
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture be
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "be", "default", {
+	name: "be",
+	englishName: "Belarusian",
+	nativeName: "Беларускі",
+	language: "be",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],
+				namesAbbr: ["нд","пн","аў","ср","чц","пт","сб"],
+				namesShort: ["нд","пн","аў","ср","чц","пт","сб"]
+			},
+			months: {
+				names: ["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			monthsGenitive: {
+				names: ["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg-BG.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg-BG.js
new file mode 100644
index 0000000..bf3e085
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg-BG.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture bg-BG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bg-BG", "default", {
+	name: "bg-BG",
+	englishName: "Bulgarian (Bulgaria)",
+	nativeName: "български (България)",
+	language: "bg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "- безкрайност",
+		positiveInfinity: "+ безкрайност",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "лв."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],
+				namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"],
+				namesShort: ["н","п","в","с","ч","п","с"]
+			},
+			months: {
+				names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"след новата ера","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy 'г.'",
+				D: "dd MMMM yyyy 'г.'",
+				t: "HH:mm 'ч.'",
+				T: "HH:mm:ss 'ч.'",
+				f: "dd MMMM yyyy 'г.' HH:mm 'ч.'",
+				F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'",
+				M: "dd MMMM",
+				Y: "MMMM yyyy 'г.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg.js
new file mode 100644
index 0000000..06574e6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture bg
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bg", "default", {
+	name: "bg",
+	englishName: "Bulgarian",
+	nativeName: "български",
+	language: "bg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "- безкрайност",
+		positiveInfinity: "+ безкрайност",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "лв."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],
+				namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"],
+				namesShort: ["н","п","в","с","ч","п","с"]
+			},
+			months: {
+				names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"след новата ера","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy 'г.'",
+				D: "dd MMMM yyyy 'г.'",
+				t: "HH:mm 'ч.'",
+				T: "HH:mm:ss 'ч.'",
+				f: "dd MMMM yyyy 'г.' HH:mm 'ч.'",
+				F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'",
+				M: "dd MMMM",
+				Y: "MMMM yyyy 'г.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-BD.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-BD.js
new file mode 100644
index 0000000..7f746f8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-BD.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture bn-BD
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bn-BD", "default", {
+	name: "bn-BD",
+	englishName: "Bengali (Bangladesh)",
+	nativeName: "বাংলা (বাংলাদেশ)",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "৳"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-IN.js
new file mode 100644
index 0000000..169e4af
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-IN.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture bn-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bn-IN", "default", {
+	name: "bn-IN",
+	englishName: "Bengali (India)",
+	nativeName: "বাংলা (ভারত)",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "টা"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn.js
new file mode 100644
index 0000000..9a07ddb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture bn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bn", "default", {
+	name: "bn",
+	englishName: "Bengali",
+	nativeName: "বাংলা",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "টা"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo-CN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo-CN.js
new file mode 100644
index 0000000..b337e02
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo-CN.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture bo-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bo-CN", "default", {
+	name: "bo-CN",
+	englishName: "Tibetan (PRC)",
+	nativeName: "བོད་ཡིག (ཀྲུང་ཧྭ་མི་དམངས་སྤྱི་མཐུན་རྒྱལ་ཁབ།)",
+	language: "bo",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ཨང་ཀི་མིན་པ།",
+		negativeInfinity: "མོ་གྲངས་ཚད་མེད་ཆུང་བ།",
+		positiveInfinity: "ཕོ་གྲངས་ཚད་མེད་ཆེ་བ།",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["གཟའ་ཉི་མ།","གཟའ་ཟླ་བ།","གཟའ་མིག་དམར།","གཟའ་ལྷག་པ།","གཟའ་ཕུར་བུ།","གཟའ་པ་སངས།","གཟའ་སྤེན་པ།"],
+				namesAbbr: ["ཉི་མ།","ཟླ་བ།","མིག་དམར།","ལྷག་པ།","ཕུར་བུ།","པ་སངས།","སྤེན་པ།"],
+				namesShort: ["༧","༡","༢","༣","༤","༥","༦"]
+			},
+			months: {
+				names: ["སྤྱི་ཟླ་དང་པོ།","སྤྱི་ཟླ་གཉིས་པ།","སྤྱི་ཟླ་གསུམ་པ།","སྤྱི་ཟླ་བཞི་པ།","སྤྱི་ཟླ་ལྔ་པ།","སྤྱི་ཟླ་དྲུག་པ།","སྤྱི་ཟླ་བདུན་པ།","སྤྱི་ཟླ་བརྒྱད་པ།","སྤྱི་ཟླ་དགུ་པ།","སྤྱི་ཟླ་བཅུ་པོ།","སྤྱི་ཟླ་བཅུ་གཅིག་པ།","སྤྱི་ཟླ་བཅུ་གཉིས་པ།",""],
+				namesAbbr: ["ཟླ་ ༡","ཟླ་ ༢","ཟླ་ ༣","ཟླ་ ༤","ཟླ་ ༥","ཟླ་ ༦","ཟླ་ ༧","ཟླ་ ༨","ཟླ་ ༩","ཟླ་ ༡༠","ཟླ་ ༡༡","ཟླ་ ༡༢",""]
+			},
+			AM: ["སྔ་དྲོ","སྔ་དྲོ","སྔ་དྲོ"],
+			PM: ["ཕྱི་དྲོ","ཕྱི་དྲོ","ཕྱི་དྲོ"],
+			eras: [{"name":"སྤྱི་ལོ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ལོའི་ཟླ' M'ཚེས' d",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm",
+				F: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm:ss",
+				M: "'ཟླ་' M'ཚེས'd",
+				Y: "yyyy.M"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo.js
new file mode 100644
index 0000000..f36be06
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture bo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bo", "default", {
+	name: "bo",
+	englishName: "Tibetan",
+	nativeName: "བོད་ཡིག",
+	language: "bo",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ཨང་ཀི་མིན་པ།",
+		negativeInfinity: "མོ་གྲངས་ཚད་མེད་ཆུང་བ།",
+		positiveInfinity: "ཕོ་གྲངས་ཚད་མེད་ཆེ་བ།",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["གཟའ་ཉི་མ།","གཟའ་ཟླ་བ།","གཟའ་མིག་དམར།","གཟའ་ལྷག་པ།","གཟའ་ཕུར་བུ།","གཟའ་པ་སངས།","གཟའ་སྤེན་པ།"],
+				namesAbbr: ["ཉི་མ།","ཟླ་བ།","མིག་དམར།","ལྷག་པ།","ཕུར་བུ།","པ་སངས།","སྤེན་པ།"],
+				namesShort: ["༧","༡","༢","༣","༤","༥","༦"]
+			},
+			months: {
+				names: ["སྤྱི་ཟླ་དང་པོ།","སྤྱི་ཟླ་གཉིས་པ།","སྤྱི་ཟླ་གསུམ་པ།","སྤྱི་ཟླ་བཞི་པ།","སྤྱི་ཟླ་ལྔ་པ།","སྤྱི་ཟླ་དྲུག་པ།","སྤྱི་ཟླ་བདུན་པ།","སྤྱི་ཟླ་བརྒྱད་པ།","སྤྱི་ཟླ་དགུ་པ།","སྤྱི་ཟླ་བཅུ་པོ།","སྤྱི་ཟླ་བཅུ་གཅིག་པ།","སྤྱི་ཟླ་བཅུ་གཉིས་པ།",""],
+				namesAbbr: ["ཟླ་ ༡","ཟླ་ ༢","ཟླ་ ༣","ཟླ་ ༤","ཟླ་ ༥","ཟླ་ ༦","ཟླ་ ༧","ཟླ་ ༨","ཟླ་ ༩","ཟླ་ ༡༠","ཟླ་ ༡༡","ཟླ་ ༡༢",""]
+			},
+			AM: ["སྔ་དྲོ","སྔ་དྲོ","སྔ་དྲོ"],
+			PM: ["ཕྱི་དྲོ","ཕྱི་དྲོ","ཕྱི་དྲོ"],
+			eras: [{"name":"སྤྱི་ལོ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ལོའི་ཟླ' M'ཚེས' d",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm",
+				F: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm:ss",
+				M: "'ཟླ་' M'ཚེས'd",
+				Y: "yyyy.M"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br-FR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br-FR.js
new file mode 100644
index 0000000..73a711c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br-FR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture br-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "br-FR", "default", {
+	name: "br-FR",
+	englishName: "Breton (France)",
+	nativeName: "brezhoneg (Frañs)",
+	language: "br",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NkN",
+		negativeInfinity: "-Anfin",
+		positiveInfinity: "+Anfin",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],
+				namesAbbr: ["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],
+				namesShort: ["Su","Lu","Mz","Mc","Ya","Gw","Sa"]
+			},
+			months: {
+				names: ["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu",""],
+				namesAbbr: ["Gen.","C'hwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"g. J.-K.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br.js
new file mode 100644
index 0000000..cac444b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture br
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "br", "default", {
+	name: "br",
+	englishName: "Breton",
+	nativeName: "brezhoneg",
+	language: "br",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NkN",
+		negativeInfinity: "-Anfin",
+		positiveInfinity: "+Anfin",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],
+				namesAbbr: ["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],
+				namesShort: ["Su","Lu","Mz","Mc","Ya","Gw","Sa"]
+			},
+			months: {
+				names: ["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu",""],
+				namesAbbr: ["Gen.","C'hwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"g. J.-K.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl-BA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl-BA.js
new file mode 100644
index 0000000..dea619b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl-BA.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture bs-Cyrl-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs-Cyrl-BA", "default", {
+	name: "bs-Cyrl-BA",
+	englishName: "Bosnian (Cyrillic, Bosnia and Herzegovina)",
+	nativeName: "босански (Босна и Херцеговина)",
+	language: "bs-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl.js
new file mode 100644
index 0000000..47d2fa5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture bs-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs-Cyrl", "default", {
+	name: "bs-Cyrl",
+	englishName: "Bosnian (Cyrillic)",
+	nativeName: "босански",
+	language: "bs-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn-BA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn-BA.js
new file mode 100644
index 0000000..08c41d8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn-BA.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture bs-Latn-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs-Latn-BA", "default", {
+	name: "bs-Latn-BA",
+	englishName: "Bosnian (Latin, Bosnia and Herzegovina)",
+	nativeName: "bosanski (Bosna i Hercegovina)",
+	language: "bs-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn.js
new file mode 100644
index 0000000..f962bb3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture bs-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs-Latn", "default", {
+	name: "bs-Latn",
+	englishName: "Bosnian (Latin)",
+	nativeName: "bosanski",
+	language: "bs-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs.js
new file mode 100644
index 0000000..3fac524
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture bs
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs", "default", {
+	name: "bs",
+	englishName: "Bosnian",
+	nativeName: "bosanski",
+	language: "bs",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca-ES.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca-ES.js
new file mode 100644
index 0000000..b882330
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca-ES.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture ca-ES
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ca-ES", "default", {
+	name: "ca-ES",
+	englishName: "Catalan (Catalan)",
+	nativeName: "català (català)",
+	language: "ca",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "Infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],
+				namesAbbr: ["dg.","dl.","dt.","dc.","dj.","dv.","ds."],
+				namesShort: ["dg","dl","dt","dc","dj","dv","ds"]
+			},
+			months: {
+				names: ["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre",""],
+				namesAbbr: ["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' / 'MMMM' / 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' / 'MMMM' / 'yyyy HH:mm",
+				F: "dddd, d' / 'MMMM' / 'yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' / 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca.js
new file mode 100644
index 0000000..5b515d8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture ca
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ca", "default", {
+	name: "ca",
+	englishName: "Catalan",
+	nativeName: "català",
+	language: "ca",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "Infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],
+				namesAbbr: ["dg.","dl.","dt.","dc.","dj.","dv.","ds."],
+				namesShort: ["dg","dl","dt","dc","dj","dv","ds"]
+			},
+			months: {
+				names: ["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre",""],
+				namesAbbr: ["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' / 'MMMM' / 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' / 'MMMM' / 'yyyy HH:mm",
+				F: "dddd, d' / 'MMMM' / 'yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' / 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co-FR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co-FR.js
new file mode 100644
index 0000000..203fecb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co-FR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture co-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "co-FR", "default", {
+	name: "co-FR",
+	englishName: "Corsican (France)",
+	nativeName: "Corsu (France)",
+	language: "co",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Mica numericu",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "+Infinitu",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumenica","luni","marti","mercuri","ghjovi","venderi","sabbatu"],
+				namesAbbr: ["dum.","lun.","mar.","mer.","ghj.","ven.","sab."],
+				namesShort: ["du","lu","ma","me","gh","ve","sa"]
+			},
+			months: {
+				names: ["ghjennaghju","ferraghju","marzu","aprile","maghju","ghjunghju","lugliu","aostu","settembre","ottobre","nuvembre","dicembre",""],
+				namesAbbr: ["ghje","ferr","marz","apri","magh","ghju","lugl","aost","sett","otto","nuve","dice",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"dopu J-C","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co.js
new file mode 100644
index 0000000..885b5af
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture co
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "co", "default", {
+	name: "co",
+	englishName: "Corsican",
+	nativeName: "Corsu",
+	language: "co",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Mica numericu",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "+Infinitu",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumenica","luni","marti","mercuri","ghjovi","venderi","sabbatu"],
+				namesAbbr: ["dum.","lun.","mar.","mer.","ghj.","ven.","sab."],
+				namesShort: ["du","lu","ma","me","gh","ve","sa"]
+			},
+			months: {
+				names: ["ghjennaghju","ferraghju","marzu","aprile","maghju","ghjunghju","lugliu","aostu","settembre","ottobre","nuvembre","dicembre",""],
+				namesAbbr: ["ghje","ferr","marz","apri","magh","ghju","lugl","aost","sett","otto","nuve","dice",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"dopu J-C","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs-CZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs-CZ.js
new file mode 100644
index 0000000..fd1c5c3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs-CZ.js
@@ -0,0 +1,85 @@
+/*
+ * Globalize Culture cs-CZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "cs-CZ", "default", {
+	name: "cs-CZ",
+	englishName: "Czech (Czech Republic)",
+	nativeName: "čeština (Česká republika)",
+	language: "cs",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Není číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Kč"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],
+				namesAbbr: ["ne","po","út","st","čt","pá","so"],
+				namesShort: ["ne","po","út","st","čt","pá","so"]
+			},
+			months: {
+				names: ["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["dop.","dop.","DOP."],
+			PM: ["odp.","odp.","ODP."],
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs.js
new file mode 100644
index 0000000..4d6397b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs.js
@@ -0,0 +1,85 @@
+/*
+ * Globalize Culture cs
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "cs", "default", {
+	name: "cs",
+	englishName: "Czech",
+	nativeName: "čeština",
+	language: "cs",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Není číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Kč"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],
+				namesAbbr: ["ne","po","út","st","čt","pá","so"],
+				namesShort: ["ne","po","út","st","čt","pá","so"]
+			},
+			months: {
+				names: ["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["dop.","dop.","DOP."],
+			PM: ["odp.","odp.","ODP."],
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy-GB.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy-GB.js
new file mode 100644
index 0000000..83e37b6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy-GB.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture cy-GB
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "cy-GB", "default", {
+	name: "cy-GB",
+	englishName: "Welsh (United Kingdom)",
+	nativeName: "Cymraeg (y Deyrnas Unedig)",
+	language: "cy",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],
+				namesAbbr: ["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],
+				namesShort: ["Su","Ll","Ma","Me","Ia","Gw","Sa"]
+			},
+			months: {
+				names: ["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr",""],
+				namesAbbr: ["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy.js
new file mode 100644
index 0000000..fdaba63
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture cy
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "cy", "default", {
+	name: "cy",
+	englishName: "Welsh",
+	nativeName: "Cymraeg",
+	language: "cy",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],
+				namesAbbr: ["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],
+				namesShort: ["Su","Ll","Ma","Me","Ia","Gw","Sa"]
+			},
+			months: {
+				names: ["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr",""],
+				namesAbbr: ["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da-DK.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da-DK.js
new file mode 100644
index 0000000..703722c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da-DK.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture da-DK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "da-DK", "default", {
+	name: "da-DK",
+	englishName: "Danish (Denmark)",
+	nativeName: "dansk (Danmark)",
+	language: "da",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da.js
new file mode 100644
index 0000000..259e63e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture da
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "da", "default", {
+	name: "da",
+	englishName: "Danish",
+	nativeName: "dansk",
+	language: "da",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-AT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-AT.js
new file mode 100644
index 0000000..d00ffc5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-AT.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture de-AT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-AT", "default", {
+	name: "de-AT",
+	englishName: "German (Austria)",
+	nativeName: "Deutsch (Österreich)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd. MMMM yyyy HH:mm",
+				F: "dddd, dd. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-CH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-CH.js
new file mode 100644
index 0000000..4cd202a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-CH.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture de-CH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-CH", "default", {
+	name: "de-CH",
+	englishName: "German (Switzerland)",
+	nativeName: "Deutsch (Schweiz)",
+	language: "de",
+	numberFormat: {
+		",": "'",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "Fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-DE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-DE.js
new file mode 100644
index 0000000..5466bd7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-DE.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture de-DE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-DE", "default", {
+	name: "de-DE",
+	englishName: "German (Germany)",
+	nativeName: "Deutsch (Deutschland)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LI.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LI.js
new file mode 100644
index 0000000..b821044
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LI.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture de-LI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-LI", "default", {
+	name: "de-LI",
+	englishName: "German (Liechtenstein)",
+	nativeName: "Deutsch (Liechtenstein)",
+	language: "de",
+	numberFormat: {
+		",": "'",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "CHF"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LU.js
new file mode 100644
index 0000000..76f5feb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LU.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture de-LU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-LU", "default", {
+	name: "de-LU",
+	englishName: "German (Luxembourg)",
+	nativeName: "Deutsch (Luxemburg)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de.js
new file mode 100644
index 0000000..a2183ac
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture de
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de", "default", {
+	name: "de",
+	englishName: "German",
+	nativeName: "Deutsch",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb-DE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb-DE.js
new file mode 100644
index 0000000..04ad511
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb-DE.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture dsb-DE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "dsb-DE", "default", {
+	name: "dsb-DE",
+	englishName: "Lower Sorbian (Germany)",
+	nativeName: "dolnoserbšćina (Nimska)",
+	language: "dsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekońcne",
+		positiveInfinity: "+njekońcne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njeźela","ponjeźele","wałtora","srjoda","stwortk","pětk","sobota"],
+				namesAbbr: ["nje","pon","wał","srj","stw","pět","sob"],
+				namesShort: ["n","p","w","s","s","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'goź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'goź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb.js
new file mode 100644
index 0000000..f75129e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture dsb
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "dsb", "default", {
+	name: "dsb",
+	englishName: "Lower Sorbian",
+	nativeName: "dolnoserbšćina",
+	language: "dsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekońcne",
+		positiveInfinity: "+njekońcne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njeźela","ponjeźele","wałtora","srjoda","stwortk","pětk","sobota"],
+				namesAbbr: ["nje","pon","wał","srj","stw","pět","sob"],
+				namesShort: ["n","p","w","s","s","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'goź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'goź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv-MV.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv-MV.js
new file mode 100644
index 0000000..367a759
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv-MV.js
@@ -0,0 +1,164 @@
+/*
+ * Globalize Culture dv-MV
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "dv-MV", "default", {
+	name: "dv-MV",
+	englishName: "Divehi (Maldives)",
+	nativeName: "ދިވެހިބަސް (ދިވެހި ރާއްޖެ)",
+	language: "dv",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["n $-","n $"],
+			symbol: "ރ."
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""],
+				namesAbbr: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"ހިޖްރީ","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd/MM/yyyy HH:mm",
+				F: "dd/MM/yyyy HH:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""],
+				namesAbbr: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"މީލާދީ","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yy",
+				D: "ddd, yyyy MMMM dd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "ddd, yyyy MMMM dd HH:mm",
+				F: "ddd, yyyy MMMM dd HH:mm:ss",
+				Y: "yyyy, MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv.js
new file mode 100644
index 0000000..04043e8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv.js
@@ -0,0 +1,164 @@
+/*
+ * Globalize Culture dv
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "dv", "default", {
+	name: "dv",
+	englishName: "Divehi",
+	nativeName: "ދިވެހިބަސް",
+	language: "dv",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["n $-","n $"],
+			symbol: "ރ."
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""],
+				namesAbbr: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd/MM/yyyy HH:mm",
+				F: "dd/MM/yyyy HH:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""],
+				namesAbbr: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"މީލާދީ","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yy",
+				D: "ddd, yyyy MMMM dd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "ddd, yyyy MMMM dd HH:mm",
+				F: "ddd, yyyy MMMM dd HH:mm:ss",
+				Y: "yyyy, MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el-GR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el-GR.js
new file mode 100644
index 0000000..a598e0d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el-GR.js
@@ -0,0 +1,82 @@
+/*
+ * Globalize Culture el-GR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "el-GR", "default", {
+	name: "el-GR",
+	englishName: "Greek (Greece)",
+	nativeName: "Ελληνικά (Ελλάδα)",
+	language: "el",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "μη αριθμός",
+		negativeInfinity: "-Άπειρο",
+		positiveInfinity: "Άπειρο",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],
+				namesAbbr: ["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],
+				namesShort: ["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"]
+			},
+			months: {
+				names: ["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			monthsGenitive: {
+				names: ["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			AM: ["πμ","πμ","ΠΜ"],
+			PM: ["μμ","μμ","ΜΜ"],
+			eras: [{"name":"μ.Χ.","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el.js
new file mode 100644
index 0000000..7ab0a51
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el.js
@@ -0,0 +1,82 @@
+/*
+ * Globalize Culture el
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "el", "default", {
+	name: "el",
+	englishName: "Greek",
+	nativeName: "Ελληνικά",
+	language: "el",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "μη αριθμός",
+		negativeInfinity: "-Άπειρο",
+		positiveInfinity: "Άπειρο",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],
+				namesAbbr: ["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],
+				namesShort: ["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"]
+			},
+			months: {
+				names: ["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			monthsGenitive: {
+				names: ["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			AM: ["πμ","πμ","ΠΜ"],
+			PM: ["μμ","μμ","ΜΜ"],
+			eras: [{"name":"μ.Χ.","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-029.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-029.js
new file mode 100644
index 0000000..28a1705
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-029.js
@@ -0,0 +1,47 @@
+/*
+ * Globalize Culture en-029
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-029", "default", {
+	name: "en-029",
+	englishName: "English (Caribbean)",
+	nativeName: "English (Caribbean)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "MM/dd/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-AU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-AU.js
new file mode 100644
index 0000000..8c62088
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-AU.js
@@ -0,0 +1,52 @@
+/*
+ * Globalize Culture en-AU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-AU", "default", {
+	name: "en-AU",
+	englishName: "English (Australia)",
+	nativeName: "English (Australia)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-BZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-BZ.js
new file mode 100644
index 0000000..1dd1ba6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-BZ.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture en-BZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-BZ", "default", {
+	name: "en-BZ",
+	englishName: "English (Belize)",
+	nativeName: "English (Belize)",
+	numberFormat: {
+		currency: {
+			groupSizes: [3,0],
+			symbol: "BZ$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd MMMM yyyy hh:mm tt",
+				F: "dddd, dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-CA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-CA.js
new file mode 100644
index 0000000..7e0bab3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-CA.js
@@ -0,0 +1,49 @@
+/*
+ * Globalize Culture en-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-CA", "default", {
+	name: "en-CA",
+	englishName: "English (Canada)",
+	nativeName: "English (Canada)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "MMMM-dd-yy",
+				f: "MMMM-dd-yy h:mm tt",
+				F: "MMMM-dd-yy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-GB.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-GB.js
new file mode 100644
index 0000000..5167db7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-GB.js
@@ -0,0 +1,55 @@
+/*
+ * Globalize Culture en-GB
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-GB", "default", {
+	name: "en-GB",
+	englishName: "English (United Kingdom)",
+	nativeName: "English (United Kingdom)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IE.js
new file mode 100644
index 0000000..52772b1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IE.js
@@ -0,0 +1,57 @@
+/*
+ * Globalize Culture en-IE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-IE", "default", {
+	name: "en-IE",
+	englishName: "English (Ireland)",
+	nativeName: "English (Ireland)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IN.js
new file mode 100644
index 0000000..8dd0d36
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IN.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture en-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-IN", "default", {
+	name: "en-IN",
+	englishName: "English (India)",
+	nativeName: "English (India)",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "Rs."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-JM.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-JM.js
new file mode 100644
index 0000000..f1442b7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-JM.js
@@ -0,0 +1,51 @@
+/*
+ * Globalize Culture en-JM
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-JM", "default", {
+	name: "en-JM",
+	englishName: "English (Jamaica)",
+	nativeName: "English (Jamaica)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "J$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-MY.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-MY.js
new file mode 100644
index 0000000..5d6b8cc
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-MY.js
@@ -0,0 +1,56 @@
+/*
+ * Globalize Culture en-MY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-MY", "default", {
+	name: "en-MY",
+	englishName: "English (Malaysia)",
+	nativeName: "English (Malaysia)",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM, yyyy",
+				f: "dddd, d MMMM, yyyy h:mm tt",
+				F: "dddd, d MMMM, yyyy h:mm:ss tt",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-NZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-NZ.js
new file mode 100644
index 0000000..08c28e9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-NZ.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture en-NZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-NZ", "default", {
+	name: "en-NZ",
+	englishName: "English (New Zealand)",
+	nativeName: "English (New Zealand)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-PH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-PH.js
new file mode 100644
index 0000000..8be79eb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-PH.js
@@ -0,0 +1,39 @@
+/*
+ * Globalize Culture en-PH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-PH", "default", {
+	name: "en-PH",
+	englishName: "English (Republic of the Philippines)",
+	nativeName: "English (Philippines)",
+	numberFormat: {
+		currency: {
+			symbol: "Php"
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-SG.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-SG.js
new file mode 100644
index 0000000..a4aaf12
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-SG.js
@@ -0,0 +1,53 @@
+/*
+ * Globalize Culture en-SG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-SG", "default", {
+	name: "en-SG",
+	englishName: "English (Singapore)",
+	nativeName: "English (Singapore)",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM, yyyy",
+				f: "dddd, d MMMM, yyyy h:mm tt",
+				F: "dddd, d MMMM, yyyy h:mm:ss tt",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-TT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-TT.js
new file mode 100644
index 0000000..1ac4aa5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-TT.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture en-TT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-TT", "default", {
+	name: "en-TT",
+	englishName: "English (Trinidad and Tobago)",
+	nativeName: "English (Trinidad y Tobago)",
+	numberFormat: {
+		currency: {
+			groupSizes: [3,0],
+			symbol: "TT$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd MMMM yyyy hh:mm tt",
+				F: "dddd, dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-US.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-US.js
new file mode 100644
index 0000000..0958d1d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-US.js
@@ -0,0 +1,33 @@
+/*
+ * Globalize Culture en-US
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-US", "default", {
+	name: "en-US",
+	englishName: "English (United States)"
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZA.js
new file mode 100644
index 0000000..64f2a0c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZA.js
@@ -0,0 +1,61 @@
+/*
+ * Globalize Culture en-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-ZA", "default", {
+	name: "en-ZA",
+	englishName: "English (South Africa)",
+	nativeName: "English (South Africa)",
+	numberFormat: {
+		",": " ",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " "
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZW.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZW.js
new file mode 100644
index 0000000..8323c62
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZW.js
@@ -0,0 +1,39 @@
+/*
+ * Globalize Culture en-ZW
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-ZW", "default", {
+	name: "en-ZW",
+	englishName: "English (Zimbabwe)",
+	nativeName: "English (Zimbabwe)",
+	numberFormat: {
+		currency: {
+			symbol: "Z$"
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-AR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-AR.js
new file mode 100644
index 0000000..853296f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-AR.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture es-AR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-AR", "default", {
+	name: "es-AR",
+	englishName: "Spanish (Argentina)",
+	nativeName: "Español (Argentina)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-BO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-BO.js
new file mode 100644
index 0000000..f784f68
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-BO.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture es-BO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-BO", "default", {
+	name: "es-BO",
+	englishName: "Spanish (Bolivia)",
+	nativeName: "Español (Bolivia)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CL.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CL.js
new file mode 100644
index 0000000..769ad2c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CL.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture es-CL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-CL", "default", {
+	name: "es-CL",
+	englishName: "Spanish (Chile)",
+	nativeName: "Español (Chile)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CO.js
new file mode 100644
index 0000000..fb75fc9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CO.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture es-CO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-CO", "default", {
+	name: "es-CO",
+	englishName: "Spanish (Colombia)",
+	nativeName: "Español (Colombia)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CR.js
new file mode 100644
index 0000000..13b90cf
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CR.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture es-CR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-CR", "default", {
+	name: "es-CR",
+	englishName: "Spanish (Costa Rica)",
+	nativeName: "Español (Costa Rica)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			",": ".",
+			".": ",",
+			symbol: "₡"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-DO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-DO.js
new file mode 100644
index 0000000..33a4f99
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-DO.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture es-DO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-DO", "default", {
+	name: "es-DO",
+	englishName: "Spanish (Dominican Republic)",
+	nativeName: "Español (República Dominicana)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "RD$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-EC.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-EC.js
new file mode 100644
index 0000000..c2779ea
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-EC.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture es-EC
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-EC", "default", {
+	name: "es-EC",
+	englishName: "Spanish (Ecuador)",
+	nativeName: "Español (Ecuador)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-ES.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-ES.js
new file mode 100644
index 0000000..8a5b3df
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-ES.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture es-ES
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-ES", "default", {
+	name: "es-ES",
+	englishName: "Spanish (Spain, International Sort)",
+	nativeName: "Español (España, alfabetización internacional)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-GT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-GT.js
new file mode 100644
index 0000000..1e55ce6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-GT.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture es-GT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-GT", "default", {
+	name: "es-GT",
+	englishName: "Spanish (Guatemala)",
+	nativeName: "Español (Guatemala)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-HN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-HN.js
new file mode 100644
index 0000000..d392d64
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-HN.js
@@ -0,0 +1,71 @@
+/*
+ * Globalize Culture es-HN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-HN", "default", {
+	name: "es-HN",
+	englishName: "Spanish (Honduras)",
+	nativeName: "Español (Honduras)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			symbol: "L."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-MX.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-MX.js
new file mode 100644
index 0000000..7cbf393
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-MX.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture es-MX
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-MX", "default", {
+	name: "es-MX",
+	englishName: "Spanish (Mexico)",
+	nativeName: "Español (México)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-NI.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-NI.js
new file mode 100644
index 0000000..1b4a4c1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-NI.js
@@ -0,0 +1,71 @@
+/*
+ * Globalize Culture es-NI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-NI", "default", {
+	name: "es-NI",
+	englishName: "Spanish (Nicaragua)",
+	nativeName: "Español (Nicaragua)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			groupSizes: [3,0],
+			symbol: "C$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PA.js
new file mode 100644
index 0000000..6369ea7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PA.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture es-PA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-PA", "default", {
+	name: "es-PA",
+	englishName: "Spanish (Panama)",
+	nativeName: "Español (Panamá)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "B/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PE.js
new file mode 100644
index 0000000..b0261ac
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PE.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture es-PE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-PE", "default", {
+	name: "es-PE",
+	englishName: "Spanish (Peru)",
+	nativeName: "Español (Perú)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["$ -n","$ n"],
+			symbol: "S/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PR.js
new file mode 100644
index 0000000..63774f9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PR.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture es-PR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-PR", "default", {
+	name: "es-PR",
+	englishName: "Spanish (Puerto Rico)",
+	nativeName: "Español (Puerto Rico)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PY.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PY.js
new file mode 100644
index 0000000..6a1eed0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PY.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture es-PY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-PY", "default", {
+	name: "es-PY",
+	englishName: "Spanish (Paraguay)",
+	nativeName: "Español (Paraguay)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "Gs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-SV.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-SV.js
new file mode 100644
index 0000000..4b4d088
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-SV.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture es-SV
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-SV", "default", {
+	name: "es-SV",
+	englishName: "Spanish (El Salvador)",
+	nativeName: "Español (El Salvador)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-US.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-US.js
new file mode 100644
index 0000000..2e4a89a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-US.js
@@ -0,0 +1,62 @@
+/*
+ * Globalize Culture es-US
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-US", "default", {
+	name: "es-US",
+	englishName: "Spanish (United States)",
+	nativeName: "Español (Estados Unidos)",
+	language: "es",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sa"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-UY.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-UY.js
new file mode 100644
index 0000000..50d6a2b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-UY.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture es-UY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-UY", "default", {
+	name: "es-UY",
+	englishName: "Spanish (Uruguay)",
+	nativeName: "Español (Uruguay)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$U"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-VE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-VE.js
new file mode 100644
index 0000000..445181d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-VE.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture es-VE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-VE", "default", {
+	name: "es-VE",
+	englishName: "Spanish (Bolivarian Republic of Venezuela)",
+	nativeName: "Español (Republica Bolivariana de Venezuela)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "Bs. F."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es.js
new file mode 100644
index 0000000..6441bcd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture es
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es", "default", {
+	name: "es",
+	englishName: "Spanish",
+	nativeName: "español",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et-EE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et-EE.js
new file mode 100644
index 0000000..6164b31
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et-EE.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture et-EE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "et-EE", "default", {
+	name: "et-EE",
+	englishName: "Estonian (Estonia)",
+	nativeName: "eesti (Eesti)",
+	language: "et",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "avaldamatu",
+		negativeInfinity: "miinuslõpmatus",
+		positiveInfinity: "plusslõpmatus",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],
+				namesAbbr: ["P","E","T","K","N","R","L"],
+				namesShort: ["P","E","T","K","N","R","L"]
+			},
+			months: {
+				names: ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember",""],
+				namesAbbr: ["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets",""]
+			},
+			AM: ["EL","el","EL"],
+			PM: ["PL","pl","PL"],
+			patterns: {
+				d: "d.MM.yyyy",
+				D: "d. MMMM yyyy'. a.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy'. a.' H:mm",
+				F: "d. MMMM yyyy'. a.' H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy'. a.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et.js
new file mode 100644
index 0000000..bf3384f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture et
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "et", "default", {
+	name: "et",
+	englishName: "Estonian",
+	nativeName: "eesti",
+	language: "et",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "avaldamatu",
+		negativeInfinity: "miinuslõpmatus",
+		positiveInfinity: "plusslõpmatus",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],
+				namesAbbr: ["P","E","T","K","N","R","L"],
+				namesShort: ["P","E","T","K","N","R","L"]
+			},
+			months: {
+				names: ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember",""],
+				namesAbbr: ["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets",""]
+			},
+			AM: ["EL","el","EL"],
+			PM: ["PL","pl","PL"],
+			patterns: {
+				d: "d.MM.yyyy",
+				D: "d. MMMM yyyy'. a.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy'. a.' H:mm",
+				F: "d. MMMM yyyy'. a.' H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy'. a.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu-ES.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu-ES.js
new file mode 100644
index 0000000..2a98ef6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu-ES.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture eu-ES
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "eu-ES", "default", {
+	name: "eu-ES",
+	englishName: "Basque (Basque)",
+	nativeName: "euskara (euskara)",
+	language: "eu",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "EdZ",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "Infinitu",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],
+				namesAbbr: ["ig.","al.","as.","az.","og.","or.","lr."],
+				namesShort: ["ig","al","as","az","og","or","lr"]
+			},
+			months: {
+				names: ["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua",""],
+				namesAbbr: ["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dddd, yyyy.'eko' MMMM'k 'd",
+				t: "HH:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy.'eko' MMMM'k 'd HH:mm",
+				F: "dddd, yyyy.'eko' MMMM'k 'd H:mm:ss",
+				Y: "yyyy.'eko' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu.js
new file mode 100644
index 0000000..ab2f3d9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture eu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "eu", "default", {
+	name: "eu",
+	englishName: "Basque",
+	nativeName: "euskara",
+	language: "eu",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "EdZ",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "Infinitu",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],
+				namesAbbr: ["ig.","al.","as.","az.","og.","or.","lr."],
+				namesShort: ["ig","al","as","az","og","or","lr"]
+			},
+			months: {
+				names: ["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua",""],
+				namesAbbr: ["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dddd, yyyy.'eko' MMMM'k 'd",
+				t: "HH:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy.'eko' MMMM'k 'd HH:mm",
+				F: "dddd, yyyy.'eko' MMMM'k 'd H:mm:ss",
+				Y: "yyyy.'eko' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa-IR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa-IR.js
new file mode 100644
index 0000000..3386f5f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa-IR.js
@@ -0,0 +1,213 @@
+/*
+ * Globalize Culture fa-IR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fa-IR", "default", {
+	name: "fa-IR",
+	englishName: "Persian",
+	nativeName: "فارسى (ایران)",
+	language: "fa",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		currency: {
+			pattern: ["$n-","$ n"],
+			".": "/",
+			symbol: "ريال"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""],
+				namesAbbr: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy/MM/dd",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "yyyy/MM/dd hh:mm tt",
+				F: "yyyy/MM/dd hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa.js
new file mode 100644
index 0000000..580eac1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa.js
@@ -0,0 +1,213 @@
+/*
+ * Globalize Culture fa
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fa", "default", {
+	name: "fa",
+	englishName: "Persian",
+	nativeName: "فارسى",
+	language: "fa",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		currency: {
+			pattern: ["$n-","$ n"],
+			".": "/",
+			symbol: "ريال"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""],
+				namesAbbr: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy/MM/dd",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "yyyy/MM/dd hh:mm tt",
+				F: "yyyy/MM/dd hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi-FI.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi-FI.js
new file mode 100644
index 0000000..09f0dad
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi-FI.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture fi-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fi-FI", "default", {
+	name: "fi-FI",
+	englishName: "Finnish (Finland)",
+	nativeName: "suomi (Suomi)",
+	language: "fi",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],
+				namesAbbr: ["su","ma","ti","ke","to","pe","la"],
+				namesShort: ["su","ma","ti","ke","to","pe","la"]
+			},
+			months: {
+				names: ["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu",""],
+				namesAbbr: ["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM'ta 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM'ta 'yyyy H:mm",
+				F: "d. MMMM'ta 'yyyy H:mm:ss",
+				M: "d. MMMM'ta'",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi.js
new file mode 100644
index 0000000..e8fa06c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture fi
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fi", "default", {
+	name: "fi",
+	englishName: "Finnish",
+	nativeName: "suomi",
+	language: "fi",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],
+				namesAbbr: ["su","ma","ti","ke","to","pe","la"],
+				namesShort: ["su","ma","ti","ke","to","pe","la"]
+			},
+			months: {
+				names: ["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu",""],
+				namesAbbr: ["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM'ta 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM'ta 'yyyy H:mm",
+				F: "d. MMMM'ta 'yyyy H:mm:ss",
+				M: "d. MMMM'ta'",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil-PH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil-PH.js
new file mode 100644
index 0000000..3e6c8fa
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil-PH.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture fil-PH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fil-PH", "default", {
+	name: "fil-PH",
+	englishName: "Filipino (Philippines)",
+	nativeName: "Filipino (Pilipinas)",
+	language: "fil",
+	numberFormat: {
+		currency: {
+			symbol: "PhP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Linggo","Lunes","Martes","Mierkoles","Huebes","Biernes","Sabado"],
+				namesAbbr: ["Lin","Lun","Mar","Mier","Hueb","Bier","Saba"],
+				namesShort: ["L","L","M","M","H","B","S"]
+			},
+			months: {
+				names: ["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septyembre","Oktubre","Nobyembre","Disyembre",""],
+				namesAbbr: ["En","Peb","Mar","Abr","Mayo","Hun","Hul","Agos","Sept","Okt","Nob","Dis",""]
+			},
+			eras: [{"name":"Anno Domini","start":null,"offset":0}]
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil.js
new file mode 100644
index 0000000..6e4509f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture fil
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fil", "default", {
+	name: "fil",
+	englishName: "Filipino",
+	nativeName: "Filipino",
+	language: "fil",
+	numberFormat: {
+		currency: {
+			symbol: "PhP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Linggo","Lunes","Martes","Mierkoles","Huebes","Biernes","Sabado"],
+				namesAbbr: ["Lin","Lun","Mar","Mier","Hueb","Bier","Saba"],
+				namesShort: ["L","L","M","M","H","B","S"]
+			},
+			months: {
+				names: ["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septyembre","Oktubre","Nobyembre","Disyembre",""],
+				namesAbbr: ["En","Peb","Mar","Abr","Mayo","Hun","Hul","Agos","Sept","Okt","Nob","Dis",""]
+			},
+			eras: [{"name":"Anno Domini","start":null,"offset":0}]
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo-FO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo-FO.js
new file mode 100644
index 0000000..68783ce
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo-FO.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fo-FO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fo-FO", "default", {
+	name: "fo-FO",
+	englishName: "Faroese (Faroe Islands)",
+	nativeName: "føroyskt (Føroyar)",
+	language: "fo",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],
+				namesAbbr: ["sun","mán","týs","mik","hós","frí","leyg"],
+				namesShort: ["su","má","tý","mi","hó","fr","ley"]
+			},
+			months: {
+				names: ["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo.js
new file mode 100644
index 0000000..7b98c7d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fo", "default", {
+	name: "fo",
+	englishName: "Faroese",
+	nativeName: "føroyskt",
+	language: "fo",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],
+				namesAbbr: ["sun","mán","týs","mik","hós","frí","leyg"],
+				namesShort: ["su","má","tý","mi","hó","fr","ley"]
+			},
+			months: {
+				names: ["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-BE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-BE.js
new file mode 100644
index 0000000..e5d5b9b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-BE.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr-BE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-BE", "default", {
+	name: "fr-BE",
+	englishName: "French (Belgium)",
+	nativeName: "français (Belgique)",
+	language: "fr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CA.js
new file mode 100644
index 0000000..d91d60e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CA.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture fr-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-CA", "default", {
+	name: "fr-CA",
+	englishName: "French (Canada)",
+	nativeName: "français (Canada)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["(n $)","n $"],
+			",": " ",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CH.js
new file mode 100644
index 0000000..89d416b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CH.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture fr-CH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-CH", "default", {
+	name: "fr-CH",
+	englishName: "French (Switzerland)",
+	nativeName: "français (Suisse)",
+	language: "fr",
+	numberFormat: {
+		",": "'",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-FR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-FR.js
new file mode 100644
index 0000000..ddd833a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-FR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-FR", "default", {
+	name: "fr-FR",
+	englishName: "French (France)",
+	nativeName: "français (France)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-LU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-LU.js
new file mode 100644
index 0000000..1a3408f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-LU.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr-LU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-LU", "default", {
+	name: "fr-LU",
+	englishName: "French (Luxembourg)",
+	nativeName: "français (Luxembourg)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-MC.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-MC.js
new file mode 100644
index 0000000..a487097
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-MC.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr-MC
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-MC", "default", {
+	name: "fr-MC",
+	englishName: "French (Monaco)",
+	nativeName: "français (Principauté de Monaco)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr.js
new file mode 100644
index 0000000..a6ce16e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr", "default", {
+	name: "fr",
+	englishName: "French",
+	nativeName: "français",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy-NL.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy-NL.js
new file mode 100644
index 0000000..bf16672
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy-NL.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture fy-NL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fy-NL", "default", {
+	name: "fy-NL",
+	englishName: "Frisian (Netherlands)",
+	nativeName: "Frysk (Nederlân)",
+	language: "fy",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],
+				namesAbbr: ["Sn","Mo","Ti","Wo","To","Fr","Sn"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["jannewaris","febrewaris","maart","april","maaie","juny","july","augustus","septimber","oktober","novimber","desimber",""],
+				namesAbbr: ["jann","febr","mrt","apr","maaie","jun","jul","aug","sept","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy.js
new file mode 100644
index 0000000..7d617a0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture fy
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fy", "default", {
+	name: "fy",
+	englishName: "Frisian",
+	nativeName: "Frysk",
+	language: "fy",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],
+				namesAbbr: ["Sn","Mo","Ti","Wo","To","Fr","Sn"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["jannewaris","febrewaris","maart","april","maaie","juny","july","augustus","septimber","oktober","novimber","desimber",""],
+				namesAbbr: ["jann","febr","mrt","apr","maaie","jun","jul","aug","sept","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga-IE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga-IE.js
new file mode 100644
index 0000000..dabd2ca
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga-IE.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture ga-IE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ga-IE", "default", {
+	name: "ga-IE",
+	englishName: "Irish (Ireland)",
+	nativeName: "Gaeilge (Éire)",
+	language: "ga",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],
+				namesAbbr: ["Domh","Luan","Máir","Céad","Déar","Aoi","Sath"],
+				namesShort: ["Do","Lu","Má","Cé","De","Ao","Sa"]
+			},
+			months: {
+				names: ["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig",""],
+				namesAbbr: ["Ean","Feabh","Már","Aib","Bealt","Meith","Iúil","Lún","M.Fómh","D.Fómh","Samh","Noll",""]
+			},
+			AM: ["r.n.","r.n.","R.N."],
+			PM: ["i.n.","i.n.","I.N."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga.js
new file mode 100644
index 0000000..b7df294
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture ga
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ga", "default", {
+	name: "ga",
+	englishName: "Irish",
+	nativeName: "Gaeilge",
+	language: "ga",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],
+				namesAbbr: ["Domh","Luan","Máir","Céad","Déar","Aoi","Sath"],
+				namesShort: ["Do","Lu","Má","Cé","De","Ao","Sa"]
+			},
+			months: {
+				names: ["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig",""],
+				namesAbbr: ["Ean","Feabh","Már","Aib","Bealt","Meith","Iúil","Lún","M.Fómh","D.Fómh","Samh","Noll",""]
+			},
+			AM: ["r.n.","r.n.","R.N."],
+			PM: ["i.n.","i.n.","I.N."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd-GB.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd-GB.js
new file mode 100644
index 0000000..3716169
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd-GB.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture gd-GB
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gd-GB", "default", {
+	name: "gd-GB",
+	englishName: "Scottish Gaelic (United Kingdom)",
+	nativeName: "Gàidhlig (An Rìoghachd Aonaichte)",
+	language: "gd",
+	numberFormat: {
+		negativeInfinity: "-Neo-chrìochnachd",
+		positiveInfinity: "Neo-chrìochnachd",
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],
+				namesAbbr: ["Dòm","Lua","Mài","Cia","Ard","Hao","Sat"],
+				namesShort: ["D","L","M","C","A","H","S"]
+			},
+			months: {
+				names: ["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd",""],
+				namesAbbr: ["Fao","Gea","Màr","Gib","Cèi","Ògm","Iuc","Lùn","Sul","Dàm","Sam","Dùb",""]
+			},
+			AM: ["m","m","M"],
+			PM: ["f","f","F"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd.js
new file mode 100644
index 0000000..7c0c35b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture gd
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gd", "default", {
+	name: "gd",
+	englishName: "Scottish Gaelic",
+	nativeName: "Gàidhlig",
+	language: "gd",
+	numberFormat: {
+		negativeInfinity: "-Neo-chrìochnachd",
+		positiveInfinity: "Neo-chrìochnachd",
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],
+				namesAbbr: ["Dòm","Lua","Mài","Cia","Ard","Hao","Sat"],
+				namesShort: ["D","L","M","C","A","H","S"]
+			},
+			months: {
+				names: ["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd",""],
+				namesAbbr: ["Fao","Gea","Màr","Gib","Cèi","Ògm","Iuc","Lùn","Sul","Dàm","Sam","Dùb",""]
+			},
+			AM: ["m","m","M"],
+			PM: ["f","f","F"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl-ES.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl-ES.js
new file mode 100644
index 0000000..2f30b61
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl-ES.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture gl-ES
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gl-ES", "default", {
+	name: "gl-ES",
+	englishName: "Galician (Galician)",
+	nativeName: "galego (galego)",
+	language: "gl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","luns","martes","mércores","xoves","venres","sábado"],
+				namesAbbr: ["dom","luns","mar","mér","xov","ven","sáb"],
+				namesShort: ["do","lu","ma","mé","xo","ve","sá"]
+			},
+			months: {
+				names: ["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro",""],
+				namesAbbr: ["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl.js
new file mode 100644
index 0000000..a1fd8f1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture gl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gl", "default", {
+	name: "gl",
+	englishName: "Galician",
+	nativeName: "galego",
+	language: "gl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","luns","martes","mércores","xoves","venres","sábado"],
+				namesAbbr: ["dom","luns","mar","mér","xov","ven","sáb"],
+				namesShort: ["do","lu","ma","mé","xo","ve","sá"]
+			},
+			months: {
+				names: ["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro",""],
+				namesAbbr: ["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw-FR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw-FR.js
new file mode 100644
index 0000000..a6528d3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw-FR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture gsw-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gsw-FR", "default", {
+	name: "gsw-FR",
+	englishName: "Alsatian (France)",
+	nativeName: "Elsässisch (Frànkrisch)",
+	language: "gsw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Ohne Nummer",
+		negativeInfinity: "-Unendlich",
+		positiveInfinity: "+Unendlich",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sundàà","Mondàà","Dienschdàà","Mittwuch","Dunnerschdàà","Fridàà","Sàmschdàà"],
+				namesAbbr: ["Su.","Mo.","Di.","Mi.","Du.","Fr.","Sà."],
+				namesShort: ["Su","Mo","Di","Mi","Du","Fr","Sà"]
+			},
+			months: {
+				names: ["Jänner","Feverje","März","Àpril","Mai","Jüni","Jüli","Augscht","September","Oktower","Nowember","Dezember",""],
+				namesAbbr: ["Jän.","Fev.","März","Apr.","Mai","Jüni","Jüli","Aug.","Sept.","Okt.","Now.","Dez.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"Vor J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw.js
new file mode 100644
index 0000000..8eca7be
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture gsw
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gsw", "default", {
+	name: "gsw",
+	englishName: "Alsatian",
+	nativeName: "Elsässisch",
+	language: "gsw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Ohne Nummer",
+		negativeInfinity: "-Unendlich",
+		positiveInfinity: "+Unendlich",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sundàà","Mondàà","Dienschdàà","Mittwuch","Dunnerschdàà","Fridàà","Sàmschdàà"],
+				namesAbbr: ["Su.","Mo.","Di.","Mi.","Du.","Fr.","Sà."],
+				namesShort: ["Su","Mo","Di","Mi","Du","Fr","Sà"]
+			},
+			months: {
+				names: ["Jänner","Feverje","März","Àpril","Mai","Jüni","Jüli","Augscht","September","Oktower","Nowember","Dezember",""],
+				namesAbbr: ["Jän.","Fev.","März","Apr.","Mai","Jüni","Jüli","Aug.","Sept.","Okt.","Now.","Dez.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"Vor J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu-IN.js
new file mode 100644
index 0000000..b6c4009
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture gu-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gu-IN", "default", {
+	name: "gu-IN",
+	englishName: "Gujarati (India)",
+	nativeName: "ગુજરાતી (ભારત)",
+	language: "gu",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "રૂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],
+				namesAbbr: ["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],
+				namesShort: ["ર","સ","મ","બ","ગ","શ","શ"]
+			},
+			months: {
+				names: ["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર",""],
+				namesAbbr: ["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે",""]
+			},
+			AM: ["પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન"],
+			PM: ["ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu.js
new file mode 100644
index 0000000..cab1c0e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture gu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gu", "default", {
+	name: "gu",
+	englishName: "Gujarati",
+	nativeName: "ગુજરાતી",
+	language: "gu",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "રૂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],
+				namesAbbr: ["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],
+				namesShort: ["ર","સ","મ","બ","ગ","શ","શ"]
+			},
+			months: {
+				names: ["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર",""],
+				namesAbbr: ["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે",""]
+			},
+			AM: ["પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન"],
+			PM: ["ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn-NG.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn-NG.js
new file mode 100644
index 0000000..5ac8bd8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn-NG.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ha-Latn-NG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ha-Latn-NG", "default", {
+	name: "ha-Latn-NG",
+	englishName: "Hausa (Latin, Nigeria)",
+	nativeName: "Hausa (Nigeria)",
+	language: "ha-Latn",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn.js
new file mode 100644
index 0000000..049ca5a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ha-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ha-Latn", "default", {
+	name: "ha-Latn",
+	englishName: "Hausa (Latin)",
+	nativeName: "Hausa",
+	language: "ha-Latn",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha.js
new file mode 100644
index 0000000..07f4be8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ha
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ha", "default", {
+	name: "ha",
+	englishName: "Hausa",
+	nativeName: "Hausa",
+	language: "ha",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he-IL.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he-IL.js
new file mode 100644
index 0000000..b0bd6b8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he-IL.js
@@ -0,0 +1,97 @@
+/*
+ * Globalize Culture he-IL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "he-IL", "default", {
+	name: "he-IL",
+	englishName: "Hebrew (Israel)",
+	nativeName: "עברית (ישראל)",
+	language: "he",
+	isRTL: true,
+	numberFormat: {
+		NaN: "לא מספר",
+		negativeInfinity: "אינסוף שלילי",
+		positiveInfinity: "אינסוף חיובי",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "₪"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר",""],
+				namesAbbr: ["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ",""]
+			},
+			eras: [{"name":"לספירה","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Hebrew: {
+			name: "Hebrew",
+			"/": " ",
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["א","ב","ג","ד","ה","ו","ש"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"],
+				namesAbbr: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"]
+			},
+			eras: [{"name":"C.E.","start":null,"offset":0}],
+			twoDigitYearMax: 5790,
+			patterns: {
+				d: "dd MMMM yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he.js
new file mode 100644
index 0000000..bca17f3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he.js
@@ -0,0 +1,97 @@
+/*
+ * Globalize Culture he
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "he", "default", {
+	name: "he",
+	englishName: "Hebrew",
+	nativeName: "עברית",
+	language: "he",
+	isRTL: true,
+	numberFormat: {
+		NaN: "לא מספר",
+		negativeInfinity: "אינסוף שלילי",
+		positiveInfinity: "אינסוף חיובי",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "₪"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר",""],
+				namesAbbr: ["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ",""]
+			},
+			eras: [{"name":"לספירה","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Hebrew: {
+			name: "Hebrew",
+			"/": " ",
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["א","ב","ג","ד","ה","ו","ש"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"],
+				namesAbbr: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"]
+			},
+			eras: [{"name":"C.E.","start":null,"offset":0}],
+			twoDigitYearMax: 5790,
+			patterns: {
+				d: "dd MMMM yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi-IN.js
new file mode 100644
index 0000000..7e228b2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture hi-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hi-IN", "default", {
+	name: "hi-IN",
+	englishName: "Hindi (India)",
+	nativeName: "हिंदी (भारत)",
+	language: "hi",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi.js
new file mode 100644
index 0000000..15dc5d4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture hi
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hi", "default", {
+	name: "hi",
+	englishName: "Hindi",
+	nativeName: "हिंदी",
+	language: "hi",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-BA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-BA.js
new file mode 100644
index 0000000..63ff67e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-BA.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture hr-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hr-BA", "default", {
+	name: "hr-BA",
+	englishName: "Croatian (Latin, Bosnia and Herzegovina)",
+	nativeName: "hrvatski (Bosna i Hercegovina)",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-HR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-HR.js
new file mode 100644
index 0000000..f63a459
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-HR.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture hr-HR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hr-HR", "default", {
+	name: "hr-HR",
+	englishName: "Croatian (Croatia)",
+	nativeName: "hrvatski (Hrvatska)",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kn"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr.js
new file mode 100644
index 0000000..747e76c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture hr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hr", "default", {
+	name: "hr",
+	englishName: "Croatian",
+	nativeName: "hrvatski",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kn"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb-DE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb-DE.js
new file mode 100644
index 0000000..8588f95
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb-DE.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture hsb-DE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hsb-DE", "default", {
+	name: "hsb-DE",
+	englishName: "Upper Sorbian (Germany)",
+	nativeName: "hornjoserbšćina (Němska)",
+	language: "hsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekónčne",
+		positiveInfinity: "+njekónčne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],
+				namesAbbr: ["nje","pón","wut","srj","štw","pja","sob"],
+				namesShort: ["n","p","w","s","š","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'hodź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'hodź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb.js
new file mode 100644
index 0000000..a6ce654
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture hsb
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hsb", "default", {
+	name: "hsb",
+	englishName: "Upper Sorbian",
+	nativeName: "hornjoserbšćina",
+	language: "hsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekónčne",
+		positiveInfinity: "+njekónčne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],
+				namesAbbr: ["nje","pón","wut","srj","štw","pja","sob"],
+				namesShort: ["n","p","w","s","š","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'hodź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'hodź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu-HU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu-HU.js
new file mode 100644
index 0000000..e48037a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu-HU.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture hu-HU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hu-HU", "default", {
+	name: "hu-HU",
+	englishName: "Hungarian (Hungary)",
+	nativeName: "magyar (Magyarország)",
+	language: "hu",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nem szám",
+		negativeInfinity: "negatív végtelen",
+		positiveInfinity: "végtelen",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Ft"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],
+				namesAbbr: ["V","H","K","Sze","Cs","P","Szo"],
+				namesShort: ["V","H","K","Sze","Cs","P","Szo"]
+			},
+			months: {
+				names: ["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december",""],
+				namesAbbr: ["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec.",""]
+			},
+			AM: ["de.","de.","DE."],
+			PM: ["du.","du.","DU."],
+			eras: [{"name":"i.sz.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "yyyy. MMMM d.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy. MMMM d. H:mm",
+				F: "yyyy. MMMM d. H:mm:ss",
+				M: "MMMM d.",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu.js
new file mode 100644
index 0000000..5db2111
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture hu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hu", "default", {
+	name: "hu",
+	englishName: "Hungarian",
+	nativeName: "magyar",
+	language: "hu",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nem szám",
+		negativeInfinity: "negatív végtelen",
+		positiveInfinity: "végtelen",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Ft"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],
+				namesAbbr: ["V","H","K","Sze","Cs","P","Szo"],
+				namesShort: ["V","H","K","Sze","Cs","P","Szo"]
+			},
+			months: {
+				names: ["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december",""],
+				namesAbbr: ["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec.",""]
+			},
+			AM: ["de.","de.","DE."],
+			PM: ["du.","du.","DU."],
+			eras: [{"name":"i.sz.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "yyyy. MMMM d.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy. MMMM d. H:mm",
+				F: "yyyy. MMMM d. H:mm:ss",
+				M: "MMMM d.",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy-AM.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy-AM.js
new file mode 100644
index 0000000..d4b0e3f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy-AM.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture hy-AM
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hy-AM", "default", {
+	name: "hy-AM",
+	englishName: "Armenian (Armenia)",
+	nativeName: "Հայերեն (Հայաստան)",
+	language: "hy",
+	numberFormat: {
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "դր."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],
+				namesAbbr: ["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],
+				namesShort: ["Կ","Ե","Ե","Չ","Հ","Ո","Շ"]
+			},
+			months: {
+				names: ["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր",""],
+				namesAbbr: ["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM, yyyy H:mm",
+				F: "d MMMM, yyyy H:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy.js
new file mode 100644
index 0000000..914d70f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture hy
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hy", "default", {
+	name: "hy",
+	englishName: "Armenian",
+	nativeName: "Հայերեն",
+	language: "hy",
+	numberFormat: {
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "դր."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],
+				namesAbbr: ["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],
+				namesShort: ["Կ","Ե","Ե","Չ","Հ","Ո","Շ"]
+			},
+			months: {
+				names: ["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր",""],
+				namesAbbr: ["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM, yyyy H:mm",
+				F: "d MMMM, yyyy H:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id-ID.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id-ID.js
new file mode 100644
index 0000000..7f7c890
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id-ID.js
@@ -0,0 +1,75 @@
+/*
+ * Globalize Culture id-ID
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "id-ID", "default", {
+	name: "id-ID",
+	englishName: "Indonesian (Indonesia)",
+	nativeName: "Bahasa Indonesia (Indonesia)",
+	language: "id",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "Rp"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],
+				namesAbbr: ["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],
+				namesShort: ["M","S","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id.js
new file mode 100644
index 0000000..278522d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id.js
@@ -0,0 +1,75 @@
+/*
+ * Globalize Culture id
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "id", "default", {
+	name: "id",
+	englishName: "Indonesian",
+	nativeName: "Bahasa Indonesia",
+	language: "id",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "Rp"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],
+				namesAbbr: ["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],
+				namesShort: ["M","S","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig-NG.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig-NG.js
new file mode 100644
index 0000000..444f59f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig-NG.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ig-NG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ig-NG", "default", {
+	name: "ig-NG",
+	englishName: "Igbo (Nigeria)",
+	nativeName: "Igbo (Nigeria)",
+	language: "ig",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Onwa mbu","Onwa ibua","Onwa ato","Onwa ano","Onwa ise","Onwa isi","Onwa asa","Onwa asato","Onwa itolu","Onwa iri","Onwa iri n'ofu","Onwa iri n'ibua",""],
+				namesAbbr: ["mbu.","ibu.","ato.","ano.","ise","isi","asa","asa.","ito.","iri.","n'of.","n'ib.",""]
+			},
+			AM: ["Ututu","ututu","UTUTU"],
+			PM: ["Efifie","efifie","EFIFIE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig.js
new file mode 100644
index 0000000..bce5771
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ig
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ig", "default", {
+	name: "ig",
+	englishName: "Igbo",
+	nativeName: "Igbo",
+	language: "ig",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Onwa mbu","Onwa ibua","Onwa ato","Onwa ano","Onwa ise","Onwa isi","Onwa asa","Onwa asato","Onwa itolu","Onwa iri","Onwa iri n'ofu","Onwa iri n'ibua",""],
+				namesAbbr: ["mbu.","ibu.","ato.","ano.","ise","isi","asa","asa.","ito.","iri.","n'of.","n'ib.",""]
+			},
+			AM: ["Ututu","ututu","UTUTU"],
+			PM: ["Efifie","efifie","EFIFIE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii-CN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii-CN.js
new file mode 100644
index 0000000..7157e36
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii-CN.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture ii-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ii-CN", "default", {
+	name: "ii-CN",
+	englishName: "Yi (PRC)",
+	nativeName: "ꆈꌠꁱꂷ (ꍏꉸꏓꂱꇭꉼꇩ)",
+	language: "ii",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ꌗꂷꀋꉬ",
+		negativeInfinity: "ꀄꊭꌐꀋꉆ",
+		positiveInfinity: "ꈤꇁꑖꀋꉬ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ꑭꆏꑍ","ꆏꊂ꒔","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],
+				namesAbbr: ["ꑭꆏ","ꆏ꒔","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],
+				namesShort: ["ꆏ","꒔","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"]
+			},
+			months: {
+				names: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""],
+				namesAbbr: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""]
+			},
+			AM: ["ꂵꆪꈌꈐ","ꂵꆪꈌꈐ","ꂵꆪꈌꈐ"],
+			PM: ["ꂵꆪꈌꉈ","ꂵꆪꈌꉈ","ꂵꆪꈌꉈ"],
+			eras: [{"name":"ꇬꑼ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ꈎ' M'ꆪ' d'ꑍ'",
+				t: "tt h:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ꈎ' M'ꆪ' d'ꑍ' tt h:mm",
+				F: "yyyy'ꈎ' M'ꆪ' d'ꑍ' H:mm:ss",
+				M: "M'ꆪ' d'ꑍ'",
+				Y: "yyyy'ꈎ' M'ꆪ'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii.js
new file mode 100644
index 0000000..6aace19
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture ii
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ii", "default", {
+	name: "ii",
+	englishName: "Yi",
+	nativeName: "ꆈꌠꁱꂷ",
+	language: "ii",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ꌗꂷꀋꉬ",
+		negativeInfinity: "ꀄꊭꌐꀋꉆ",
+		positiveInfinity: "ꈤꇁꑖꀋꉬ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ꑭꆏꑍ","ꆏꊂ꒔","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],
+				namesAbbr: ["ꑭꆏ","ꆏ꒔","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],
+				namesShort: ["ꆏ","꒔","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"]
+			},
+			months: {
+				names: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""],
+				namesAbbr: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""]
+			},
+			AM: ["ꂵꆪꈌꈐ","ꂵꆪꈌꈐ","ꂵꆪꈌꈐ"],
+			PM: ["ꂵꆪꈌꉈ","ꂵꆪꈌꉈ","ꂵꆪꈌꉈ"],
+			eras: [{"name":"ꇬꑼ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ꈎ' M'ꆪ' d'ꑍ'",
+				t: "tt h:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ꈎ' M'ꆪ' d'ꑍ' tt h:mm",
+				F: "yyyy'ꈎ' M'ꆪ' d'ꑍ' H:mm:ss",
+				M: "M'ꆪ' d'ꑍ'",
+				Y: "yyyy'ꈎ' M'ꆪ'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is-IS.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is-IS.js
new file mode 100644
index 0000000..7af9121
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is-IS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture is-IS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "is-IS", "default", {
+	name: "is-IS",
+	englishName: "Icelandic (Iceland)",
+	nativeName: "íslenska (Ísland)",
+	language: "is",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],
+				namesAbbr: ["sun.","mán.","þri.","mið.","fim.","fös.","lau."],
+				namesShort: ["su","má","þr","mi","fi","fö","la"]
+			},
+			months: {
+				names: ["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember",""],
+				namesAbbr: ["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is.js
new file mode 100644
index 0000000..971e18a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture is
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "is", "default", {
+	name: "is",
+	englishName: "Icelandic",
+	nativeName: "íslenska",
+	language: "is",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],
+				namesAbbr: ["sun.","mán.","þri.","mið.","fim.","fös.","lau."],
+				namesShort: ["su","má","þr","mi","fi","fö","la"]
+			},
+			months: {
+				names: ["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember",""],
+				namesAbbr: ["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-CH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-CH.js
new file mode 100644
index 0000000..e231c2f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-CH.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture it-CH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "it-CH", "default", {
+	name: "it-CH",
+	englishName: "Italian (Switzerland)",
+	nativeName: "italiano (Svizzera)",
+	language: "it",
+	numberFormat: {
+		",": "'",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-IT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-IT.js
new file mode 100644
index 0000000..42ec54a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-IT.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture it-IT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "it-IT", "default", {
+	name: "it-IT",
+	englishName: "Italian (Italy)",
+	nativeName: "italiano (Italia)",
+	language: "it",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it.js
new file mode 100644
index 0000000..34594b0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture it
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "it", "default", {
+	name: "it",
+	englishName: "Italian",
+	nativeName: "italiano",
+	language: "it",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans-CA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans-CA.js
new file mode 100644
index 0000000..f546847
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans-CA.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture iu-Cans-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu-Cans-CA", "default", {
+	name: "iu-Cans-CA",
+	englishName: "Inuktitut (Syllabics, Canada)",
+	nativeName: "ᐃᓄᒃᑎᑐᑦ (ᑲᓇᑕᒥ)",
+	language: "iu-Cans",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ᓈᑦᑏᖑᔭ","ᓇᒡᒐᔾᔭᐅ","ᐊᐃᑉᐱᖅ","ᐱᖓᑦᓯᖅ","ᓯᑕᒻᒥᖅ","ᑕᓪᓕᕐᒥᖅ","ᓯᕙᑖᕐᕕᒃ"],
+				namesAbbr: ["ᓈᑦᑏ","ᓇᒡᒐ","ᐊᐃᑉᐱ","ᐱᖓᑦᓯ","ᓯᑕ","ᑕᓪᓕ","ᓯᕙᑖᕐᕕᒃ"],
+				namesShort: ["ᓈ","ᓇ","ᐊ","ᐱ","ᓯ","ᑕ","ᓯ"]
+			},
+			months: {
+				names: ["ᔮᓐᓄᐊᕆ","ᕖᕝᕗᐊᕆ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌᓯ","ᓯᑎᐱᕆ","ᐅᑐᐱᕆ","ᓄᕕᐱᕆ","ᑎᓯᐱᕆ",""],
+				namesAbbr: ["ᔮᓐᓄ","ᕖᕝᕗ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌ","ᓯᑎᐱ","ᐅᑐᐱ","ᓄᕕᐱ","ᑎᓯᐱ",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd,MMMM dd,yyyy",
+				f: "dddd,MMMM dd,yyyy h:mm tt",
+				F: "dddd,MMMM dd,yyyy h:mm:ss tt",
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans.js
new file mode 100644
index 0000000..62f15ab
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture iu-Cans
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu-Cans", "default", {
+	name: "iu-Cans",
+	englishName: "Inuktitut (Syllabics)",
+	nativeName: "ᐃᓄᒃᑎᑐᑦ",
+	language: "iu-Cans",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ᓈᑦᑏᖑᔭ","ᓇᒡᒐᔾᔭᐅ","ᐊᐃᑉᐱᖅ","ᐱᖓᑦᓯᖅ","ᓯᑕᒻᒥᖅ","ᑕᓪᓕᕐᒥᖅ","ᓯᕙᑖᕐᕕᒃ"],
+				namesAbbr: ["ᓈᑦᑏ","ᓇᒡᒐ","ᐊᐃᑉᐱ","ᐱᖓᑦᓯ","ᓯᑕ","ᑕᓪᓕ","ᓯᕙᑖᕐᕕᒃ"],
+				namesShort: ["ᓈ","ᓇ","ᐊ","ᐱ","ᓯ","ᑕ","ᓯ"]
+			},
+			months: {
+				names: ["ᔮᓐᓄᐊᕆ","ᕖᕝᕗᐊᕆ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌᓯ","ᓯᑎᐱᕆ","ᐅᑐᐱᕆ","ᓄᕕᐱᕆ","ᑎᓯᐱᕆ",""],
+				namesAbbr: ["ᔮᓐᓄ","ᕖᕝᕗ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌ","ᓯᑎᐱ","ᐅᑐᐱ","ᓄᕕᐱ","ᑎᓯᐱ",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd,MMMM dd,yyyy",
+				f: "dddd,MMMM dd,yyyy h:mm tt",
+				F: "dddd,MMMM dd,yyyy h:mm:ss tt",
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn-CA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn-CA.js
new file mode 100644
index 0000000..2fa1467
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn-CA.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture iu-Latn-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu-Latn-CA", "default", {
+	name: "iu-Latn-CA",
+	englishName: "Inuktitut (Latin, Canada)",
+	nativeName: "Inuktitut (Kanatami)",
+	language: "iu-Latn",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn.js
new file mode 100644
index 0000000..d2e54fa
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture iu-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu-Latn", "default", {
+	name: "iu-Latn",
+	englishName: "Inuktitut (Latin)",
+	nativeName: "Inuktitut",
+	language: "iu-Latn",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu.js
new file mode 100644
index 0000000..093956b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture iu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu", "default", {
+	name: "iu",
+	englishName: "Inuktitut",
+	nativeName: "Inuktitut",
+	language: "iu",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja-JP.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja-JP.js
new file mode 100644
index 0000000..a9469d7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja-JP.js
@@ -0,0 +1,100 @@
+/*
+ * Globalize Culture ja-JP
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ja-JP", "default", {
+	name: "ja-JP",
+	englishName: "Japanese (Japan)",
+	nativeName: "日本語 (日本)",
+	language: "ja",
+	numberFormat: {
+		NaN: "NaN (非数値)",
+		negativeInfinity: "-∞",
+		positiveInfinity: "+∞",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"西暦","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Japanese: {
+			name: "Japanese",
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "gg y/M/d",
+				D: "gg y'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "gg y'年'M'月'd'日' H:mm",
+				F: "gg y'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "gg y'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja.js
new file mode 100644
index 0000000..1539f99
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja.js
@@ -0,0 +1,100 @@
+/*
+ * Globalize Culture ja
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ja", "default", {
+	name: "ja",
+	englishName: "Japanese",
+	nativeName: "日本語",
+	language: "ja",
+	numberFormat: {
+		NaN: "NaN (非数値)",
+		negativeInfinity: "-∞",
+		positiveInfinity: "+∞",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"西暦","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Japanese: {
+			name: "Japanese",
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "gg y/M/d",
+				D: "gg y'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "gg y'年'M'月'd'日' H:mm",
+				F: "gg y'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "gg y'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka-GE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka-GE.js
new file mode 100644
index 0000000..97b767b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka-GE.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture ka-GE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ka-GE", "default", {
+	name: "ka-GE",
+	englishName: "Georgian (Georgia)",
+	nativeName: "ქართული (საქართველო)",
+	language: "ka",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Lari"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesAbbr: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesShort: ["კ","ო","ს","ო","ხ","პ","შ"]
+			},
+			months: {
+				names: ["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი",""],
+				namesAbbr: ["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'წლის' dd MM, dddd",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'წლის' dd MM, dddd H:mm",
+				F: "yyyy 'წლის' dd MM, dddd H:mm:ss",
+				M: "dd MM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka.js
new file mode 100644
index 0000000..6e19adf
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture ka
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ka", "default", {
+	name: "ka",
+	englishName: "Georgian",
+	nativeName: "ქართული",
+	language: "ka",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Lari"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesAbbr: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesShort: ["კ","ო","ს","ო","ხ","პ","შ"]
+			},
+			months: {
+				names: ["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი",""],
+				namesAbbr: ["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'წლის' dd MM, dddd",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'წლის' dd MM, dddd H:mm",
+				F: "yyyy 'წლის' dd MM, dddd H:mm:ss",
+				M: "dd MM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk-KZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk-KZ.js
new file mode 100644
index 0000000..138d486
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk-KZ.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture kk-KZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kk-KZ", "default", {
+	name: "kk-KZ",
+	englishName: "Kazakh (Kazakhstan)",
+	nativeName: "Қазақ (Қазақстан)",
+	language: "kk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			",": " ",
+			".": "-",
+			symbol: "Т"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],
+				namesAbbr: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],
+				namesShort: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"]
+			},
+			months: {
+				names: ["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан",""],
+				namesAbbr: ["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'ж.' H:mm",
+				F: "d MMMM yyyy 'ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk.js
new file mode 100644
index 0000000..7530988
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture kk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kk", "default", {
+	name: "kk",
+	englishName: "Kazakh",
+	nativeName: "Қазақ",
+	language: "kk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			",": " ",
+			".": "-",
+			symbol: "Т"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],
+				namesAbbr: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],
+				namesShort: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"]
+			},
+			months: {
+				names: ["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан",""],
+				namesAbbr: ["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'ж.' H:mm",
+				F: "d MMMM yyyy 'ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl-GL.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl-GL.js
new file mode 100644
index 0000000..03b9637
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl-GL.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture kl-GL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kl-GL", "default", {
+	name: "kl-GL",
+	englishName: "Greenlandic (Greenland)",
+	nativeName: "kalaallisut (Kalaallit Nunaat)",
+	language: "kl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			groupSizes: [3,0],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],
+				namesAbbr: ["sap","ata","mar","ping","sis","tal","arf"],
+				namesShort: ["sa","at","ma","pi","si","ta","ar"]
+			},
+			months: {
+				names: ["januari","februari","martsi","apriili","maaji","juni","juli","aggusti","septembari","oktobari","novembari","decembari",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl.js
new file mode 100644
index 0000000..cf71fed
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture kl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kl", "default", {
+	name: "kl",
+	englishName: "Greenlandic",
+	nativeName: "kalaallisut",
+	language: "kl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			groupSizes: [3,0],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],
+				namesAbbr: ["sap","ata","mar","ping","sis","tal","arf"],
+				namesShort: ["sa","at","ma","pi","si","ta","ar"]
+			},
+			months: {
+				names: ["januari","februari","martsi","apriili","maaji","juni","juli","aggusti","septembari","oktobari","novembari","decembari",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km-KH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km-KH.js
new file mode 100644
index 0000000..6c2ea1c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km-KH.js
@@ -0,0 +1,99 @@
+/*
+ * Globalize Culture km-KH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "km-KH", "default", {
+	name: "km-KH",
+	englishName: "Khmer (Cambodia)",
+	nativeName: "ខ្មែរ (កម្ពុជា)",
+	language: "km",
+	numberFormat: {
+		pattern: ["- n"],
+		groupSizes: [3,0],
+		NaN: "NAN",
+		negativeInfinity: "-- អនន្ត",
+		positiveInfinity: "អនន្ត",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			symbol: "៛"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ថ្ងៃអាទិត្យ","ថ្ងៃច័ន្ទ","ថ្ងៃអង្គារ","ថ្ងៃពុធ","ថ្ងៃព្រហស្បតិ៍","ថ្ងៃសុក្រ","ថ្ងៃសៅរ៍"],
+				namesAbbr: ["អាទិ.","ច.","អ.","ពុ","ព្រហ.","សុ.","ស."],
+				namesShort: ["អា","ច","អ","ពុ","ព្","សុ","ស"]
+			},
+			months: {
+				names: ["មករា","កុម្ភៈ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ",""],
+				namesAbbr: ["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"មុនគ.ស.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy H:mm tt",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "'ថ្ងៃទី' dd 'ខែ' MM",
+				Y: "'ខែ' MM 'ឆ្នាំ' yyyy"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm tt",
+				F: "dddd, MMMM dd, yyyy HH:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km.js
new file mode 100644
index 0000000..b3d9b4c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km.js
@@ -0,0 +1,99 @@
+/*
+ * Globalize Culture km
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "km", "default", {
+	name: "km",
+	englishName: "Khmer",
+	nativeName: "ខ្មែរ",
+	language: "km",
+	numberFormat: {
+		pattern: ["- n"],
+		groupSizes: [3,0],
+		NaN: "NAN",
+		negativeInfinity: "-- អនន្ត",
+		positiveInfinity: "អនន្ត",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			symbol: "៛"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ថ្ងៃអាទិត្យ","ថ្ងៃច័ន្ទ","ថ្ងៃអង្គារ","ថ្ងៃពុធ","ថ្ងៃព្រហស្បតិ៍","ថ្ងៃសុក្រ","ថ្ងៃសៅរ៍"],
+				namesAbbr: ["អាទិ.","ច.","អ.","ពុ","ព្រហ.","សុ.","ស."],
+				namesShort: ["អា","ច","អ","ពុ","ព្","សុ","ស"]
+			},
+			months: {
+				names: ["មករា","កុម្ភៈ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ",""],
+				namesAbbr: ["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"មុនគ.ស.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy H:mm tt",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "'ថ្ងៃទី' dd 'ខែ' MM",
+				Y: "'ខែ' MM 'ឆ្នាំ' yyyy"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm tt",
+				F: "dddd, MMMM dd, yyyy HH:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn-IN.js
new file mode 100644
index 0000000..23b8684
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture kn-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kn-IN", "default", {
+	name: "kn-IN",
+	englishName: "Kannada (India)",
+	nativeName: "ಕನ್ನಡ (ಭಾರತ)",
+	language: "kn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ರೂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],
+				namesAbbr: ["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],
+				namesShort: ["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"]
+			},
+			months: {
+				names: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""],
+				namesAbbr: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""]
+			},
+			AM: ["ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ"],
+			PM: ["ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn.js
new file mode 100644
index 0000000..43322e2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture kn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kn", "default", {
+	name: "kn",
+	englishName: "Kannada",
+	nativeName: "ಕನ್ನಡ",
+	language: "kn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ರೂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],
+				namesAbbr: ["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],
+				namesShort: ["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"]
+			},
+			months: {
+				names: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""],
+				namesAbbr: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""]
+			},
+			AM: ["ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ"],
+			PM: ["ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko-KR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko-KR.js
new file mode 100644
index 0000000..ce97685
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko-KR.js
@@ -0,0 +1,96 @@
+/*
+ * Globalize Culture ko-KR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ko-KR", "default", {
+	name: "ko-KR",
+	englishName: "Korean (Korea)",
+	nativeName: "한국어 (대한민국)",
+	language: "ko",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "₩"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"서기","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "yyyy'년' M'월'"
+			}
+		},
+		Korean: {
+			name: "Korean",
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"단기","start":null,"offset":-2333}],
+			twoDigitYearMax: 4362,
+			patterns: {
+				d: "gg yyyy-MM-dd",
+				D: "gg yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "gg yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "gg yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "gg yyyy'년' M'월'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko.js
new file mode 100644
index 0000000..a0a7376
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko.js
@@ -0,0 +1,96 @@
+/*
+ * Globalize Culture ko
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ko", "default", {
+	name: "ko",
+	englishName: "Korean",
+	nativeName: "한국어",
+	language: "ko",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "₩"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"서기","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "yyyy'년' M'월'"
+			}
+		},
+		Korean: {
+			name: "Korean",
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"단기","start":null,"offset":-2333}],
+			twoDigitYearMax: 4362,
+			patterns: {
+				d: "gg yyyy-MM-dd",
+				D: "gg yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "gg yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "gg yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "gg yyyy'년' M'월'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok-IN.js
new file mode 100644
index 0000000..ec8cab9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture kok-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kok-IN", "default", {
+	name: "kok-IN",
+	englishName: "Konkani (India)",
+	nativeName: "कोंकणी (भारत)",
+	language: "kok",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],
+				namesAbbr: ["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],
+				namesShort: ["आ","स","म","ब","ब","स","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""],
+				namesAbbr: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok.js
new file mode 100644
index 0000000..65a3678
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture kok
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kok", "default", {
+	name: "kok",
+	englishName: "Konkani",
+	nativeName: "कोंकणी",
+	language: "kok",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],
+				namesAbbr: ["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],
+				namesShort: ["आ","स","म","ब","ब","स","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""],
+				namesAbbr: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky-KG.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky-KG.js
new file mode 100644
index 0000000..3c35abd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky-KG.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture ky-KG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ky-KG", "default", {
+	name: "ky-KG",
+	englishName: "Kyrgyz (Kyrgyzstan)",
+	nativeName: "Кыргыз (Кыргызстан)",
+	language: "ky",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": "-",
+			symbol: "сом"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],
+				namesAbbr: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],
+				namesShort: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d'-'MMMM yyyy'-ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d'-'MMMM yyyy'-ж.' H:mm",
+				F: "d'-'MMMM yyyy'-ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy'-ж.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky.js
new file mode 100644
index 0000000..7bc386b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture ky
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ky", "default", {
+	name: "ky",
+	englishName: "Kyrgyz",
+	nativeName: "Кыргыз",
+	language: "ky",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": "-",
+			symbol: "сом"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],
+				namesAbbr: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],
+				namesShort: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d'-'MMMM yyyy'-ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d'-'MMMM yyyy'-ж.' H:mm",
+				F: "d'-'MMMM yyyy'-ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy'-ж.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb-LU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb-LU.js
new file mode 100644
index 0000000..ef9d39a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb-LU.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture lb-LU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lb-LU", "default", {
+	name: "lb-LU",
+	englishName: "Luxembourgish (Luxembourg)",
+	nativeName: "Lëtzebuergesch (Luxembourg)",
+	language: "lb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "n. num.",
+		negativeInfinity: "-onendlech",
+		positiveInfinity: "+onendlech",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],
+				namesAbbr: ["Son","Méi","Dën","Mët","Don","Fre","Sam"],
+				namesShort: ["So","Mé","Dë","Më","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb.js
new file mode 100644
index 0000000..56983ff
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture lb
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lb", "default", {
+	name: "lb",
+	englishName: "Luxembourgish",
+	nativeName: "Lëtzebuergesch",
+	language: "lb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "n. num.",
+		negativeInfinity: "-onendlech",
+		positiveInfinity: "+onendlech",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],
+				namesAbbr: ["Son","Méi","Dën","Mët","Don","Fre","Sam"],
+				namesShort: ["So","Mé","Dë","Më","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo-LA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo-LA.js
new file mode 100644
index 0000000..5556d3c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo-LA.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture lo-LA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lo-LA", "default", {
+	name: "lo-LA",
+	englishName: "Lao (Lao P.D.R.)",
+	nativeName: "ລາວ (ສ.ປ.ປ. ລາວ)",
+	language: "lo",
+	numberFormat: {
+		pattern: ["(n)"],
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["(n$)","n$"],
+			groupSizes: [3,0],
+			symbol: "₭"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],
+				namesAbbr: ["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],
+				namesShort: ["ອ","ຈ","ອ","ພ","ພ","ສ","ເ"]
+			},
+			months: {
+				names: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""],
+				namesAbbr: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""]
+			},
+			AM: ["ເຊົ້າ","ເຊົ້າ","ເຊົ້າ"],
+			PM: ["ແລງ","ແລງ","ແລງ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy H:mm tt",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo.js
new file mode 100644
index 0000000..bea14aa
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture lo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lo", "default", {
+	name: "lo",
+	englishName: "Lao",
+	nativeName: "ລາວ",
+	language: "lo",
+	numberFormat: {
+		pattern: ["(n)"],
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["(n$)","n$"],
+			groupSizes: [3,0],
+			symbol: "₭"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],
+				namesAbbr: ["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],
+				namesShort: ["ອ","ຈ","ອ","ພ","ພ","ສ","ເ"]
+			},
+			months: {
+				names: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""],
+				namesAbbr: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""]
+			},
+			AM: ["ເຊົ້າ","ເຊົ້າ","ເຊົ້າ"],
+			PM: ["ແລງ","ແລງ","ແລງ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy H:mm tt",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt-LT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt-LT.js
new file mode 100644
index 0000000..d0d31a3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt-LT.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture lt-LT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lt-LT", "default", {
+	name: "lt-LT",
+	englishName: "Lithuanian (Lithuania)",
+	nativeName: "lietuvių (Lietuva)",
+	language: "lt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-begalybė",
+		positiveInfinity: "begalybė",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Lt"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],
+				namesAbbr: ["Sk","Pr","An","Tr","Kt","Pn","Št"],
+				namesShort: ["S","P","A","T","K","Pn","Š"]
+			},
+			months: {
+				names: ["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			monthsGenitive: {
+				names: ["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd",
+				D: "yyyy 'm.' MMMM d 'd.'",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'm.' MMMM d 'd.' HH:mm",
+				F: "yyyy 'm.' MMMM d 'd.' HH:mm:ss",
+				M: "MMMM d 'd.'",
+				Y: "yyyy 'm.' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt.js
new file mode 100644
index 0000000..e06d87f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture lt
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lt", "default", {
+	name: "lt",
+	englishName: "Lithuanian",
+	nativeName: "lietuvių",
+	language: "lt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-begalybė",
+		positiveInfinity: "begalybė",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Lt"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],
+				namesAbbr: ["Sk","Pr","An","Tr","Kt","Pn","Št"],
+				namesShort: ["S","P","A","T","K","Pn","Š"]
+			},
+			months: {
+				names: ["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			monthsGenitive: {
+				names: ["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd",
+				D: "yyyy 'm.' MMMM d 'd.'",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'm.' MMMM d 'd.' HH:mm",
+				F: "yyyy 'm.' MMMM d 'd.' HH:mm:ss",
+				M: "MMMM d 'd.'",
+				Y: "yyyy 'm.' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv-LV.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv-LV.js
new file mode 100644
index 0000000..145329b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv-LV.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture lv-LV
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lv-LV", "default", {
+	name: "lv-LV",
+	englishName: "Latvian (Latvia)",
+	nativeName: "latviešu (Latvija)",
+	language: "lv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-bezgalība",
+		positiveInfinity: "bezgalība",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "Ls"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],
+				namesAbbr: ["sv","pr","ot","tr","ce","pk","se"],
+				namesShort: ["sv","pr","ot","tr","ce","pk","se"]
+			},
+			months: {
+				names: ["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			monthsGenitive: {
+				names: ["janvārī","februārī","martā","aprīlī","maijā","jūnijā","jūlijā","augustā","septembrī","oktobrī","novembrī","decembrī",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "dddd, yyyy'. gada 'd. MMMM",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy'. gada 'd. MMMM H:mm",
+				F: "dddd, yyyy'. gada 'd. MMMM H:mm:ss",
+				M: "d. MMMM",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv.js
new file mode 100644
index 0000000..5065722
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture lv
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lv", "default", {
+	name: "lv",
+	englishName: "Latvian",
+	nativeName: "latviešu",
+	language: "lv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-bezgalība",
+		positiveInfinity: "bezgalība",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "Ls"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],
+				namesAbbr: ["sv","pr","ot","tr","ce","pk","se"],
+				namesShort: ["sv","pr","ot","tr","ce","pk","se"]
+			},
+			months: {
+				names: ["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			monthsGenitive: {
+				names: ["janvārī","februārī","martā","aprīlī","maijā","jūnijā","jūlijā","augustā","septembrī","oktobrī","novembrī","decembrī",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "dddd, yyyy'. gada 'd. MMMM",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy'. gada 'd. MMMM H:mm",
+				F: "dddd, yyyy'. gada 'd. MMMM H:mm:ss",
+				M: "d. MMMM",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi-NZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi-NZ.js
new file mode 100644
index 0000000..03720c9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi-NZ.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture mi-NZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mi-NZ", "default", {
+	name: "mi-NZ",
+	englishName: "Maori (New Zealand)",
+	nativeName: "Reo Māori (Aotearoa)",
+	language: "mi",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],
+				namesAbbr: ["Ta","Hi","Tū","Apa","Pa","Me","Ho"],
+				namesShort: ["Ta","Hi","Tū","Aa","Pa","Me","Ho"]
+			},
+			months: {
+				names: ["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngongoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea",""],
+				namesAbbr: ["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM, yyyy",
+				f: "dddd, dd MMMM, yyyy h:mm tt",
+				F: "dddd, dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM, yy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi.js
new file mode 100644
index 0000000..5f861db
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture mi
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mi", "default", {
+	name: "mi",
+	englishName: "Maori",
+	nativeName: "Reo Māori",
+	language: "mi",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],
+				namesAbbr: ["Ta","Hi","Tū","Apa","Pa","Me","Ho"],
+				namesShort: ["Ta","Hi","Tū","Aa","Pa","Me","Ho"]
+			},
+			months: {
+				names: ["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngongoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea",""],
+				namesAbbr: ["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM, yyyy",
+				f: "dddd, dd MMMM, yyyy h:mm tt",
+				F: "dddd, dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM, yy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk-MK.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk-MK.js
new file mode 100644
index 0000000..f0d5e51
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk-MK.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture mk-MK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mk-MK", "default", {
+	name: "mk-MK",
+	englishName: "Macedonian (Former Yugoslav Republic of Macedonia)",
+	nativeName: "македонски јазик (Македонија)",
+	language: "mk",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "ден."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недела","понеделник","вторник","среда","четврток","петок","сабота"],
+				namesAbbr: ["нед","пон","втр","срд","чет","пет","саб"],
+				namesShort: ["не","по","вт","ср","че","пе","са"]
+			},
+			months: {
+				names: ["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd MMMM yyyy HH:mm",
+				F: "dddd, dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk.js
new file mode 100644
index 0000000..a6f8210
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture mk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mk", "default", {
+	name: "mk",
+	englishName: "Macedonian (FYROM)",
+	nativeName: "македонски јазик",
+	language: "mk",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "ден."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недела","понеделник","вторник","среда","четврток","петок","сабота"],
+				namesAbbr: ["нед","пон","втр","срд","чет","пет","саб"],
+				namesShort: ["не","по","вт","ср","че","пе","са"]
+			},
+			months: {
+				names: ["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd MMMM yyyy HH:mm",
+				F: "dddd, dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml-IN.js
new file mode 100644
index 0000000..3a915e5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture ml-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ml-IN", "default", {
+	name: "ml-IN",
+	englishName: "Malayalam (India)",
+	nativeName: "മലയാളം (ഭാരതം)",
+	language: "ml",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ക"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["ഞായറാഴ്ച","തിങ്കളാഴ്ച","ചൊവ്വാഴ്ച","ബുധനാഴ്ച","വ്യാഴാഴ്ച","വെള്ളിയാഴ്ച","ശനിയാഴ്ച"],
+				namesAbbr: ["ഞായർ.","തിങ്കൾ.","ചൊവ്വ.","ബുധൻ.","വ്യാഴം.","വെള്ളി.","ശനി."],
+				namesShort: ["ഞ","ത","ച","ബ","വ","വെ","ശ"]
+			},
+			months: {
+				names: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""],
+				namesAbbr: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""]
+			},
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml.js
new file mode 100644
index 0000000..183a223
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture ml
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ml", "default", {
+	name: "ml",
+	englishName: "Malayalam",
+	nativeName: "മലയാളം",
+	language: "ml",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ക"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["ഞായറാഴ്ച","തിങ്കളാഴ്ച","ചൊവ്വാഴ്ച","ബുധനാഴ്ച","വ്യാഴാഴ്ച","വെള്ളിയാഴ്ച","ശനിയാഴ്ച"],
+				namesAbbr: ["ഞായർ.","തിങ്കൾ.","ചൊവ്വ.","ബുധൻ.","വ്യാഴം.","വെള്ളി.","ശനി."],
+				namesShort: ["ഞ","ത","ച","ബ","വ","വെ","ശ"]
+			},
+			months: {
+				names: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""],
+				namesAbbr: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""]
+			},
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Cyrl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Cyrl.js
new file mode 100644
index 0000000..9493c43
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Cyrl.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture mn-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn-Cyrl", "default", {
+	name: "mn-Cyrl",
+	englishName: "Mongolian (Cyrillic)",
+	nativeName: "Монгол хэл",
+	language: "mn-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-MN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-MN.js
new file mode 100644
index 0000000..90577b4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-MN.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture mn-MN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn-MN", "default", {
+	name: "mn-MN",
+	englishName: "Mongolian (Cyrillic, Mongolia)",
+	nativeName: "Монгол хэл (Монгол улс)",
+	language: "mn-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong-CN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong-CN.js
new file mode 100644
index 0000000..94b57dd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong-CN.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture mn-Mong-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn-Mong-CN", "default", {
+	name: "mn-Mong-CN",
+	englishName: "Mongolian (Traditional Mongolian, PRC)",
+	nativeName: "ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ (ᠪᠦᠭᠦᠳᠡ ᠨᠠᠢᠷᠠᠮᠳᠠᠬᠤ ᠳᠤᠮᠳᠠᠳᠤ ᠠᠷᠠᠳ ᠣᠯᠣᠰ)",
+	language: "mn-Mong",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ᠲᠤᠭᠠᠠ ᠪᠤᠰᠤ",
+		negativeInfinity: "ᠰᠦᠬᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠡᠬᠡ",
+		positiveInfinity: "ᠡᠶ᠋ᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠠᠬᠡ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesAbbr: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesShort: ["ᠡ‍","ᠨᠢ‍","ᠬᠣ‍","ᠭᠤ‍","ᠳᠥ‍","ᠲᠠ‍","ᠵᠢ‍"]
+			},
+			months: {
+				names: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""],
+				namesAbbr: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ᠣᠨ ᠲᠣᠭᠠᠯᠠᠯ ᠤᠨ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm",
+				F: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm:ss",
+				M: "M'ᠰᠠᠷ᠎ᠠ' d'ᠡᠳᠦᠷ'",
+				Y: "yyyy'ᠣᠨ' M'ᠰᠠᠷ᠎ᠠ'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong.js
new file mode 100644
index 0000000..a263973
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture mn-Mong
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn-Mong", "default", {
+	name: "mn-Mong",
+	englishName: "Mongolian (Traditional Mongolian)",
+	nativeName: "ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ",
+	language: "mn-Mong",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ᠲᠤᠭᠠᠠ ᠪᠤᠰᠤ",
+		negativeInfinity: "ᠰᠦᠬᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠡᠬᠡ",
+		positiveInfinity: "ᠡᠶ᠋ᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠠᠬᠡ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesAbbr: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesShort: ["ᠡ‍","ᠨᠢ‍","ᠬᠣ‍","ᠭᠤ‍","ᠳᠥ‍","ᠲᠠ‍","ᠵᠢ‍"]
+			},
+			months: {
+				names: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""],
+				namesAbbr: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ᠣᠨ ᠲᠣᠭᠠᠯᠠᠯ ᠤᠨ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm",
+				F: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm:ss",
+				M: "M'ᠰᠠᠷ᠎ᠠ' d'ᠡᠳᠦᠷ'",
+				Y: "yyyy'ᠣᠨ' M'ᠰᠠᠷ᠎ᠠ'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn.js
new file mode 100644
index 0000000..acc45c4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture mn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn", "default", {
+	name: "mn",
+	englishName: "Mongolian",
+	nativeName: "Монгол хэл",
+	language: "mn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh-CA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh-CA.js
new file mode 100644
index 0000000..ebea792
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh-CA.js
@@ -0,0 +1,52 @@
+/*
+ * Globalize Culture moh-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "moh-CA", "default", {
+	name: "moh-CA",
+	englishName: "Mohawk (Mohawk)",
+	nativeName: "Kanien'kéha",
+	language: "moh",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Awentatokentì:ke","Awentataón'ke","Ratironhia'kehronòn:ke","Soséhne","Okaristiiáhne","Ronwaia'tanentaktonhne","Entákta"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["Tsothohrkó:Wa","Enniska","Enniskó:Wa","Onerahtókha","Onerahtohkó:Wa","Ohiari:Ha","Ohiarihkó:Wa","Seskéha","Seskehkó:Wa","Kenténha","Kentenhkó:Wa","Tsothóhrha",""]
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh.js
new file mode 100644
index 0000000..e8fa748
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh.js
@@ -0,0 +1,52 @@
+/*
+ * Globalize Culture moh
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "moh", "default", {
+	name: "moh",
+	englishName: "Mohawk",
+	nativeName: "Kanien'kéha",
+	language: "moh",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Awentatokentì:ke","Awentataón'ke","Ratironhia'kehronòn:ke","Soséhne","Okaristiiáhne","Ronwaia'tanentaktonhne","Entákta"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["Tsothohrkó:Wa","Enniska","Enniskó:Wa","Onerahtókha","Onerahtohkó:Wa","Ohiari:Ha","Ohiarihkó:Wa","Seskéha","Seskehkó:Wa","Kenténha","Kentenhkó:Wa","Tsothóhrha",""]
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr-IN.js
new file mode 100644
index 0000000..b671dca
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture mr-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mr-IN", "default", {
+	name: "mr-IN",
+	englishName: "Marathi (India)",
+	nativeName: "मराठी (भारत)",
+	language: "mr",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर",""],
+				namesAbbr: ["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें.",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr.js
new file mode 100644
index 0000000..2a59f15
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture mr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mr", "default", {
+	name: "mr",
+	englishName: "Marathi",
+	nativeName: "मराठी",
+	language: "mr",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर",""],
+				namesAbbr: ["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें.",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-BN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-BN.js
new file mode 100644
index 0000000..61bedd0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-BN.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture ms-BN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ms-BN", "default", {
+	name: "ms-BN",
+	englishName: "Malay (Brunei Darussalam)",
+	nativeName: "Bahasa Melayu (Brunei Darussalam)",
+	language: "ms",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-MY.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-MY.js
new file mode 100644
index 0000000..d6d916d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-MY.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture ms-MY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ms-MY", "default", {
+	name: "ms-MY",
+	englishName: "Malay (Malaysia)",
+	nativeName: "Bahasa Melayu (Malaysia)",
+	language: "ms",
+	numberFormat: {
+		currency: {
+			decimals: 0,
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms.js
new file mode 100644
index 0000000..033e5d2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture ms
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ms", "default", {
+	name: "ms",
+	englishName: "Malay",
+	nativeName: "Bahasa Melayu",
+	language: "ms",
+	numberFormat: {
+		currency: {
+			decimals: 0,
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt-MT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt-MT.js
new file mode 100644
index 0000000..bb7d40e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt-MT.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture mt-MT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mt-MT", "default", {
+	name: "mt-MT",
+	englishName: "Maltese (Malta)",
+	nativeName: "Malti (Malta)",
+	language: "mt",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],
+				namesAbbr: ["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],
+				namesShort: ["I","I","I","L","I","I","I"]
+			},
+			months: {
+				names: ["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru",""],
+				namesAbbr: ["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' ta\\' 'MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' ta\\' 'MMMM yyyy HH:mm",
+				F: "dddd, d' ta\\' 'MMMM yyyy HH:mm:ss",
+				M: "d' ta\\' 'MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt.js
new file mode 100644
index 0000000..b742360
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture mt
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mt", "default", {
+	name: "mt",
+	englishName: "Maltese",
+	nativeName: "Malti",
+	language: "mt",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],
+				namesAbbr: ["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],
+				namesShort: ["I","I","I","L","I","I","I"]
+			},
+			months: {
+				names: ["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru",""],
+				namesAbbr: ["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' ta\\' 'MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' ta\\' 'MMMM yyyy HH:mm",
+				F: "dddd, d' ta\\' 'MMMM yyyy HH:mm:ss",
+				M: "d' ta\\' 'MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb-NO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb-NO.js
new file mode 100644
index 0000000..4961cb1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb-NO.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture nb-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nb-NO", "default", {
+	name: "nb-NO",
+	englishName: "Norwegian, Bokmål (Norway)",
+	nativeName: "norsk, bokmål (Norge)",
+	language: "nb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb.js
new file mode 100644
index 0000000..31e3144
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture nb
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nb", "default", {
+	name: "nb",
+	englishName: "Norwegian (Bokmål)",
+	nativeName: "norsk (bokmål)",
+	language: "nb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne-NP.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne-NP.js
new file mode 100644
index 0000000..6b40800
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne-NP.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture ne-NP
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ne-NP", "default", {
+	name: "ne-NP",
+	englishName: "Nepali (Nepal)",
+	nativeName: "नेपाली (नेपाल)",
+	language: "ne",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["आइतवार","सोमवार","मङ्गलवार","बुधवार","बिहीवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],
+				namesShort: ["आ","सो","म","बु","बि","शु","श"]
+			},
+			months: {
+				names: ["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जून","जुलाई","अगस्त","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर",""],
+				namesAbbr: ["जन","फेब","मार्च","अप्रिल","मे","जून","जुलाई","अग","सेप्ट","अक्ट","नोभ","डिस",""]
+			},
+			AM: ["विहानी","विहानी","विहानी"],
+			PM: ["बेलुकी","बेलुकी","बेलुकी"],
+			eras: [{"name":"a.d.","start":null,"offset":0}],
+			patterns: {
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne.js
new file mode 100644
index 0000000..874982f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture ne
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ne", "default", {
+	name: "ne",
+	englishName: "Nepali",
+	nativeName: "नेपाली",
+	language: "ne",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["आइतवार","सोमवार","मङ्गलवार","बुधवार","बिहीवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],
+				namesShort: ["आ","सो","म","बु","बि","शु","श"]
+			},
+			months: {
+				names: ["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जून","जुलाई","अगस्त","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर",""],
+				namesAbbr: ["जन","फेब","मार्च","अप्रिल","मे","जून","जुलाई","अग","सेप्ट","अक्ट","नोभ","डिस",""]
+			},
+			AM: ["विहानी","विहानी","विहानी"],
+			PM: ["बेलुकी","बेलुकी","बेलुकी"],
+			eras: [{"name":"a.d.","start":null,"offset":0}],
+			patterns: {
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-BE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-BE.js
new file mode 100644
index 0000000..c9f93c7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-BE.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture nl-BE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nl-BE", "default", {
+	name: "nl-BE",
+	englishName: "Dutch (Belgium)",
+	nativeName: "Nederlands (België)",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Niet-een-getal)",
+		negativeInfinity: "-oneindig",
+		positiveInfinity: "oneindig",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-NL.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-NL.js
new file mode 100644
index 0000000..263d5af
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-NL.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture nl-NL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nl-NL", "default", {
+	name: "nl-NL",
+	englishName: "Dutch (Netherlands)",
+	nativeName: "Nederlands (Nederland)",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl.js
new file mode 100644
index 0000000..560fa97
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture nl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nl", "default", {
+	name: "nl",
+	englishName: "Dutch",
+	nativeName: "Nederlands",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn-NO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn-NO.js
new file mode 100644
index 0000000..921debf
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn-NO.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture nn-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nn-NO", "default", {
+	name: "nn-NO",
+	englishName: "Norwegian, Nynorsk (Norway)",
+	nativeName: "norsk, nynorsk (Noreg)",
+	language: "nn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],
+				namesAbbr: ["sø","må","ty","on","to","fr","la"],
+				namesShort: ["sø","må","ty","on","to","fr","la"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn.js
new file mode 100644
index 0000000..9942d9e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture nn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nn", "default", {
+	name: "nn",
+	englishName: "Norwegian (Nynorsk)",
+	nativeName: "norsk (nynorsk)",
+	language: "nn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],
+				namesAbbr: ["sø","må","ty","on","to","fr","la"],
+				namesShort: ["sø","må","ty","on","to","fr","la"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.no.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.no.js
new file mode 100644
index 0000000..e1131df
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.no.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture no
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "no", "default", {
+	name: "no",
+	englishName: "Norwegian",
+	nativeName: "norsk",
+	language: "no",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso-ZA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso-ZA.js
new file mode 100644
index 0000000..ad3afa0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso-ZA.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture nso-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nso-ZA", "default", {
+	name: "nso-ZA",
+	englishName: "Sesotho sa Leboa (South Africa)",
+	nativeName: "Sesotho sa Leboa (Afrika Borwa)",
+	language: "nso",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],
+				namesAbbr: ["Lam","Moš","Lbb","Lbr","Lbn","Lbh","Mok"],
+				namesShort: ["L","M","L","L","L","L","M"]
+			},
+			months: {
+				names: ["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole",""],
+				namesAbbr: ["Pher","Hlak","Mop","Mor","Mos","Ngwat","Phup","Phat","Lew","Dip","Dib","Man",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso.js
new file mode 100644
index 0000000..76621b8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture nso
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nso", "default", {
+	name: "nso",
+	englishName: "Sesotho sa Leboa",
+	nativeName: "Sesotho sa Leboa",
+	language: "nso",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],
+				namesAbbr: ["Lam","Moš","Lbb","Lbr","Lbn","Lbh","Mok"],
+				namesShort: ["L","M","L","L","L","L","M"]
+			},
+			months: {
+				names: ["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole",""],
+				namesAbbr: ["Pher","Hlak","Mop","Mor","Mos","Ngwat","Phup","Phat","Lew","Dip","Dib","Man",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc-FR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc-FR.js
new file mode 100644
index 0000000..6681813
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc-FR.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture oc-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "oc-FR", "default", {
+	name: "oc-FR",
+	englishName: "Occitan (France)",
+	nativeName: "Occitan (França)",
+	language: "oc",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numeric",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "+Infinit",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],
+				namesAbbr: ["dim.","lun.","mar.","mèc.","jòu.","ven.","sab."],
+				namesShort: ["di","lu","ma","mè","jò","ve","sa"]
+			},
+			months: {
+				names: ["genier","febrier","març","abril","mai","junh","julh","agost","setembre","octobre","novembre","desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			monthsGenitive: {
+				names: ["de genier","de febrier","de març","d'abril","de mai","de junh","de julh","d'agost","de setembre","d'octobre","de novembre","de desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"après Jèsus-Crist","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd,' lo 'd MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd,' lo 'd MMMM' de 'yyyy HH:mm",
+				F: "dddd,' lo 'd MMMM' de 'yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc.js
new file mode 100644
index 0000000..34705f0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture oc
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "oc", "default", {
+	name: "oc",
+	englishName: "Occitan",
+	nativeName: "Occitan",
+	language: "oc",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numeric",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "+Infinit",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],
+				namesAbbr: ["dim.","lun.","mar.","mèc.","jòu.","ven.","sab."],
+				namesShort: ["di","lu","ma","mè","jò","ve","sa"]
+			},
+			months: {
+				names: ["genier","febrier","març","abril","mai","junh","julh","agost","setembre","octobre","novembre","desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			monthsGenitive: {
+				names: ["de genier","de febrier","de març","d'abril","de mai","de junh","de julh","d'agost","de setembre","d'octobre","de novembre","de desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"après Jèsus-Crist","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd,' lo 'd MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd,' lo 'd MMMM' de 'yyyy HH:mm",
+				F: "dddd,' lo 'd MMMM' de 'yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or-IN.js
new file mode 100644
index 0000000..f773323
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or-IN.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture or-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "or-IN", "default", {
+	name: "or-IN",
+	englishName: "Oriya (India)",
+	nativeName: "ଓଡ଼ିଆ (ଭାରତ)",
+	language: "or",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ଟ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],
+				namesAbbr: ["ରବି.","ସୋମ.","ମଙ୍ଗଳ.","ବୁଧ.","ଗୁରୁ.","ଶୁକ୍ର.","ଶନି."],
+				namesShort: ["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"]
+			},
+			months: {
+				names: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""],
+				namesAbbr: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""]
+			},
+			eras: [{"name":"ଖ୍ରୀଷ୍ଟାବ୍ଦ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or.js
new file mode 100644
index 0000000..55581bd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture or
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "or", "default", {
+	name: "or",
+	englishName: "Oriya",
+	nativeName: "ଓଡ଼ିଆ",
+	language: "or",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ଟ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],
+				namesAbbr: ["ରବି.","ସୋମ.","ମଙ୍ଗଳ.","ବୁଧ.","ଗୁରୁ.","ଶୁକ୍ର.","ଶନି."],
+				namesShort: ["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"]
+			},
+			months: {
+				names: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""],
+				namesAbbr: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""]
+			},
+			eras: [{"name":"ଖ୍ରୀଷ୍ଟାବ୍ଦ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa-IN.js
new file mode 100644
index 0000000..fa6672a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture pa-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pa-IN", "default", {
+	name: "pa-IN",
+	englishName: "Punjabi (India)",
+	nativeName: "ਪੰਜਾਬੀ (ਭਾਰਤ)",
+	language: "pa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ਰੁ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],
+				namesAbbr: ["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁੱਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨਿੱਚਰ."],
+				namesShort: ["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"]
+			},
+			months: {
+				names: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""],
+				namesAbbr: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""]
+			},
+			AM: ["ਸਵੇਰ","ਸਵੇਰ","ਸਵੇਰ"],
+			PM: ["ਸ਼ਾਮ","ਸ਼ਾਮ","ਸ਼ਾਮ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy dddd",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "dd MMMM yyyy dddd tt hh:mm",
+				F: "dd MMMM yyyy dddd tt hh:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa.js
new file mode 100644
index 0000000..f0f1bd5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture pa
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pa", "default", {
+	name: "pa",
+	englishName: "Punjabi",
+	nativeName: "ਪੰਜਾਬੀ",
+	language: "pa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ਰੁ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],
+				namesAbbr: ["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁੱਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨਿੱਚਰ."],
+				namesShort: ["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"]
+			},
+			months: {
+				names: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""],
+				namesAbbr: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""]
+			},
+			AM: ["ਸਵੇਰ","ਸਵੇਰ","ਸਵੇਰ"],
+			PM: ["ਸ਼ਾਮ","ਸ਼ਾਮ","ਸ਼ਾਮ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy dddd",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "dd MMMM yyyy dddd tt hh:mm",
+				F: "dd MMMM yyyy dddd tt hh:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl-PL.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl-PL.js
new file mode 100644
index 0000000..59b4330
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl-PL.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture pl-PL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pl-PL", "default", {
+	name: "pl-PL",
+	englishName: "Polish (Poland)",
+	nativeName: "polski (Polska)",
+	language: "pl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nie jest liczbą",
+		negativeInfinity: "-nieskończoność",
+		positiveInfinity: "+nieskończoność",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "zł"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],
+				namesAbbr: ["N","Pn","Wt","Śr","Cz","Pt","So"],
+				namesShort: ["N","Pn","Wt","Śr","Cz","Pt","So"]
+			},
+			months: {
+				names: ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			monthsGenitive: {
+				names: ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl.js
new file mode 100644
index 0000000..5b09eca
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture pl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pl", "default", {
+	name: "pl",
+	englishName: "Polish",
+	nativeName: "polski",
+	language: "pl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nie jest liczbą",
+		negativeInfinity: "-nieskończoność",
+		positiveInfinity: "+nieskończoność",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "zł"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],
+				namesAbbr: ["N","Pn","Wt","Śr","Cz","Pt","So"],
+				namesShort: ["N","Pn","Wt","Śr","Cz","Pt","So"]
+			},
+			months: {
+				names: ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			monthsGenitive: {
+				names: ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs-AF.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs-AF.js
new file mode 100644
index 0000000..d487690
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs-AF.js
@@ -0,0 +1,174 @@
+/*
+ * Globalize Culture prs-AF
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "prs-AF", "default", {
+	name: "prs-AF",
+	englishName: "Dari (Afghanistan)",
+	nativeName: "درى (افغانستان)",
+	language: "prs",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 5,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 5,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs.js
new file mode 100644
index 0000000..5111acc
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs.js
@@ -0,0 +1,174 @@
+/*
+ * Globalize Culture prs
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "prs", "default", {
+	name: "prs",
+	englishName: "Dari",
+	nativeName: "درى",
+	language: "prs",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 5,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 5,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps-AF.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps-AF.js
new file mode 100644
index 0000000..15e57f0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps-AF.js
@@ -0,0 +1,176 @@
+/*
+ * Globalize Culture ps-AF
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ps-AF", "default", {
+	name: "ps-AF",
+	englishName: "Pashto (Afghanistan)",
+	nativeName: "پښتو (افغانستان)",
+	language: "ps",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": "،",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": "،",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			",": "٬",
+			".": "٫",
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښزمرى","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښ","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps.js
new file mode 100644
index 0000000..73e4c93
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps.js
@@ -0,0 +1,176 @@
+/*
+ * Globalize Culture ps
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ps", "default", {
+	name: "ps",
+	englishName: "Pashto",
+	nativeName: "پښتو",
+	language: "ps",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": "،",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": "،",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			",": "٬",
+			".": "٫",
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښزمرى","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښ","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-BR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-BR.js
new file mode 100644
index 0000000..ccbb632
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-BR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture pt-BR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pt-BR", "default", {
+	name: "pt-BR",
+	englishName: "Portuguese (Brazil)",
+	nativeName: "Português (Brasil)",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "R$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro",""],
+				namesAbbr: ["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-PT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-PT.js
new file mode 100644
index 0000000..d521e23
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-PT.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture pt-PT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pt-PT", "default", {
+	name: "pt-PT",
+	englishName: "Portuguese (Portugal)",
+	nativeName: "português (Portugal)",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro",""],
+				namesAbbr: ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "d/M",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt.js
new file mode 100644
index 0000000..5a83321
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture pt
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pt", "default", {
+	name: "pt",
+	englishName: "Portuguese",
+	nativeName: "Português",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "R$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro",""],
+				namesAbbr: ["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut-GT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut-GT.js
new file mode 100644
index 0000000..93bcffb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut-GT.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture qut-GT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "qut-GT", "default", {
+	name: "qut-GT",
+	englishName: "K'iche (Guatemala)",
+	nativeName: "K'iche (Guatemala)",
+	language: "qut",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["juq'ij","kaq'ij","oxq'ij","kajq'ij","joq'ij","waqq'ij","wuqq'ij"],
+				namesAbbr: ["juq","kaq","oxq","kajq","joq","waqq","wuqq"],
+				namesShort: ["ju","ka","ox","ka","jo","wa","wu"]
+			},
+			months: {
+				names: ["nab'e ik'","ukab' ik'","rox ik'","ukaj ik'","uro' ik'","uwaq ik'","uwuq ik'","uwajxaq ik'","ub'elej ik'","ulaj ik'","ujulaj ik'","ukab'laj ik'",""],
+				namesAbbr: ["nab'e","ukab","rox","ukaj","uro","uwaq","uwuq","uwajxaq","ub'elej","ulaj","ujulaj","ukab'laj",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut.js
new file mode 100644
index 0000000..5d5790b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture qut
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "qut", "default", {
+	name: "qut",
+	englishName: "K'iche",
+	nativeName: "K'iche",
+	language: "qut",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["juq'ij","kaq'ij","oxq'ij","kajq'ij","joq'ij","waqq'ij","wuqq'ij"],
+				namesAbbr: ["juq","kaq","oxq","kajq","joq","waqq","wuqq"],
+				namesShort: ["ju","ka","ox","ka","jo","wa","wu"]
+			},
+			months: {
+				names: ["nab'e ik'","ukab' ik'","rox ik'","ukaj ik'","uro' ik'","uwaq ik'","uwuq ik'","uwajxaq ik'","ub'elej ik'","ulaj ik'","ujulaj ik'","ukab'laj ik'",""],
+				namesAbbr: ["nab'e","ukab","rox","ukaj","uro","uwaq","uwuq","uwajxaq","ub'elej","ulaj","ujulaj","ukab'laj",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-BO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-BO.js
new file mode 100644
index 0000000..313a9ad
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-BO.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture quz-BO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "quz-BO", "default", {
+	name: "quz-BO",
+	englishName: "Quechua (Bolivia)",
+	nativeName: "runasimi (Qullasuyu)",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-EC.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-EC.js
new file mode 100644
index 0000000..0b75b40
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-EC.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture quz-EC
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "quz-EC", "default", {
+	name: "quz-EC",
+	englishName: "Quechua (Ecuador)",
+	nativeName: "runasimi (Ecuador)",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-PE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-PE.js
new file mode 100644
index 0000000..5187503
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-PE.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture quz-PE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "quz-PE", "default", {
+	name: "quz-PE",
+	englishName: "Quechua (Peru)",
+	nativeName: "runasimi (Piruw)",
+	language: "quz",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			symbol: "S/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz.js
new file mode 100644
index 0000000..fef7426
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture quz
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "quz", "default", {
+	name: "quz",
+	englishName: "Quechua",
+	nativeName: "runasimi",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm-CH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm-CH.js
new file mode 100644
index 0000000..9191f4b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm-CH.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture rm-CH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "rm-CH", "default", {
+	name: "rm-CH",
+	englishName: "Romansh (Switzerland)",
+	nativeName: "Rumantsch (Svizra)",
+	language: "rm",
+	numberFormat: {
+		",": "'",
+		NaN: "betg def.",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "+infinit",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],
+				namesAbbr: ["du","gli","ma","me","gie","ve","so"],
+				namesShort: ["du","gli","ma","me","gie","ve","so"]
+			},
+			months: {
+				names: ["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december",""],
+				namesAbbr: ["schan","favr","mars","avr","matg","zercl","fan","avust","sett","oct","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"s. Cr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d MMMM yyyy HH:mm",
+				F: "dddd, d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm.js
new file mode 100644
index 0000000..0cbe7d3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture rm
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "rm", "default", {
+	name: "rm",
+	englishName: "Romansh",
+	nativeName: "Rumantsch",
+	language: "rm",
+	numberFormat: {
+		",": "'",
+		NaN: "betg def.",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "+infinit",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],
+				namesAbbr: ["du","gli","ma","me","gie","ve","so"],
+				namesShort: ["du","gli","ma","me","gie","ve","so"]
+			},
+			months: {
+				names: ["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december",""],
+				namesAbbr: ["schan","favr","mars","avr","matg","zercl","fan","avust","sett","oct","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"s. Cr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d MMMM yyyy HH:mm",
+				F: "dddd, d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro-RO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro-RO.js
new file mode 100644
index 0000000..e36fe53
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro-RO.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture ro-RO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ro-RO", "default", {
+	name: "ro-RO",
+	englishName: "Romanian (Romania)",
+	nativeName: "română (România)",
+	language: "ro",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "lei"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],
+				namesAbbr: ["D","L","Ma","Mi","J","V","S"],
+				namesShort: ["D","L","Ma","Mi","J","V","S"]
+			},
+			months: {
+				names: ["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie",""],
+				namesAbbr: ["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro.js
new file mode 100644
index 0000000..9cbe26a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture ro
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ro", "default", {
+	name: "ro",
+	englishName: "Romanian",
+	nativeName: "română",
+	language: "ro",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "lei"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],
+				namesAbbr: ["D","L","Ma","Mi","J","V","S"],
+				namesShort: ["D","L","Ma","Mi","J","V","S"]
+			},
+			months: {
+				names: ["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie",""],
+				namesAbbr: ["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru-RU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru-RU.js
new file mode 100644
index 0000000..c44493e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru-RU.js
@@ -0,0 +1,82 @@
+/*
+ * Globalize Culture ru-RU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ru-RU", "default", {
+	name: "ru-RU",
+	englishName: "Russian (Russia)",
+	nativeName: "русский (Россия)",
+	language: "ru",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],
+				namesAbbr: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			monthsGenitive: {
+				names: ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'г.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'г.' H:mm",
+				F: "d MMMM yyyy 'г.' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru.js
new file mode 100644
index 0000000..e3f4750
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru.js
@@ -0,0 +1,82 @@
+/*
+ * Globalize Culture ru
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ru", "default", {
+	name: "ru",
+	englishName: "Russian",
+	nativeName: "русский",
+	language: "ru",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],
+				namesAbbr: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			monthsGenitive: {
+				names: ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'г.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'г.' H:mm",
+				F: "d MMMM yyyy 'г.' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw-RW.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw-RW.js
new file mode 100644
index 0000000..7aa4cbc
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw-RW.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture rw-RW
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "rw-RW", "default", {
+	name: "rw-RW",
+	englishName: "Kinyarwanda (Rwanda)",
+	nativeName: "Kinyarwanda (Rwanda)",
+	language: "rw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "RWF"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Ku cyumweru"],
+				namesAbbr: ["mbe.","kab.","gat.","kan.","gat.","gat.","cyu."],
+				namesShort: ["mb","ka","ga","ka","ga","ga","cy"]
+			},
+			months: {
+				names: ["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza",""],
+				namesAbbr: ["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukwa","Ugu","Uku",""]
+			},
+			AM: ["saa moya z.m.","saa moya z.m.","SAA MOYA Z.M."],
+			PM: ["saa moya z.n.","saa moya z.n.","SAA MOYA Z.N."],
+			eras: [{"name":"AD","start":null,"offset":0}]
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw.js
new file mode 100644
index 0000000..c86c2e9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture rw
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "rw", "default", {
+	name: "rw",
+	englishName: "Kinyarwanda",
+	nativeName: "Kinyarwanda",
+	language: "rw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "RWF"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Ku cyumweru"],
+				namesAbbr: ["mbe.","kab.","gat.","kan.","gat.","gat.","cyu."],
+				namesShort: ["mb","ka","ga","ka","ga","ga","cy"]
+			},
+			months: {
+				names: ["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza",""],
+				namesAbbr: ["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukwa","Ugu","Uku",""]
+			},
+			AM: ["saa moya z.m.","saa moya z.m.","SAA MOYA Z.M."],
+			PM: ["saa moya z.n.","saa moya z.n.","SAA MOYA Z.N."],
+			eras: [{"name":"AD","start":null,"offset":0}]
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa-IN.js
new file mode 100644
index 0000000..5408ab5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa-IN.js
@@ -0,0 +1,71 @@
+/*
+ * Globalize Culture sa-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sa-IN", "default", {
+	name: "sa-IN",
+	englishName: "Sanskrit (India)",
+	nativeName: "संस्कृत (भारतम्)",
+	language: "sa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesAbbr: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa.js
new file mode 100644
index 0000000..3fb8cea
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa.js
@@ -0,0 +1,71 @@
+/*
+ * Globalize Culture sa
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sa", "default", {
+	name: "sa",
+	englishName: "Sanskrit",
+	nativeName: "संस्कृत",
+	language: "sa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesAbbr: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah-RU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah-RU.js
new file mode 100644
index 0000000..17f487f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah-RU.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture sah-RU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sah-RU", "default", {
+	name: "sah-RU",
+	englishName: "Yakut (Russia)",
+	nativeName: "саха (Россия)",
+	language: "sah",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NAN",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "с."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],
+				namesAbbr: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"],
+				namesShort: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"]
+			},
+			months: {
+				names: ["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйа","Бэс ыйа","От ыйа","Атырдьах ыйа","Балаҕан ыйа","Алтынньы","Сэтинньи","Ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			monthsGenitive: {
+				names: ["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "MM.dd.yyyy",
+				D: "MMMM d yyyy 'с.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d yyyy 'с.' H:mm",
+				F: "MMMM d yyyy 'с.' H:mm:ss",
+				Y: "MMMM yyyy 'с.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah.js
new file mode 100644
index 0000000..ff1b18e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture sah
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sah", "default", {
+	name: "sah",
+	englishName: "Yakut",
+	nativeName: "саха",
+	language: "sah",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NAN",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "с."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],
+				namesAbbr: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"],
+				namesShort: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"]
+			},
+			months: {
+				names: ["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйа","Бэс ыйа","От ыйа","Атырдьах ыйа","Балаҕан ыйа","Алтынньы","Сэтинньи","Ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			monthsGenitive: {
+				names: ["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "MM.dd.yyyy",
+				D: "MMMM d yyyy 'с.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d yyyy 'с.' H:mm",
+				F: "MMMM d yyyy 'с.' H:mm:ss",
+				Y: "MMMM yyyy 'с.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-FI.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-FI.js
new file mode 100644
index 0000000..424df67
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-FI.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture se-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "se-FI", "default", {
+	name: "se-FI",
+	englishName: "Sami, Northern (Finland)",
+	nativeName: "davvisámegiella (Suopma)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. b. 'yyyy H:mm",
+				F: "MMMM d'. b. 'yyyy H:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-NO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-NO.js
new file mode 100644
index 0000000..ccdb630
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-NO.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture se-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "se-NO", "default", {
+	name: "se-NO",
+	englishName: "Sami, Northern (Norway)",
+	nativeName: "davvisámegiella (Norga)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-SE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-SE.js
new file mode 100644
index 0000000..b085955
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-SE.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture se-SE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "se-SE", "default", {
+	name: "se-SE",
+	englishName: "Sami, Northern (Sweden)",
+	nativeName: "davvisámegiella (Ruoŧŧa)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","mánnodat","disdat","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","mán","dis","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se.js
new file mode 100644
index 0000000..c80207b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture se
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "se", "default", {
+	name: "se",
+	englishName: "Sami (Northern)",
+	nativeName: "davvisámegiella",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si-LK.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si-LK.js
new file mode 100644
index 0000000..9a114ed
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si-LK.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture si-LK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "si-LK", "default", {
+	name: "si-LK",
+	englishName: "Sinhala (Sri Lanka)",
+	nativeName: "සිංහල (ශ්‍රී ලංකා)",
+	language: "si",
+	numberFormat: {
+		groupSizes: [3,2],
+		negativeInfinity: "-අනන්තය",
+		positiveInfinity: "අනන්තය",
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "රු."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],
+				namesAbbr: ["ඉරිදා","සඳුදා","කුජදා","බුදදා","ගුරුදා","කිවිදා","ශනිදා"],
+				namesShort: ["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"]
+			},
+			months: {
+				names: ["ජනවාරි","පෙබරවාරි","මාර්තු","අ‌ප්‍රේල්","මැයි","ජූනි","ජූලි","අ‌ගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්",""],
+				namesAbbr: ["ජන.","පෙබ.","මාර්තු.","අප්‍රේල්.","මැයි.","ජූනි.","ජූලි.","අගෝ.","සැප්.","ඔක්.","නොවැ.","දෙසැ.",""]
+			},
+			AM: ["පෙ.ව.","පෙ.ව.","පෙ.ව."],
+			PM: ["ප.ව.","ප.ව.","ප.ව."],
+			eras: [{"name":"ක්‍රි.ව.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy MMMM' මස 'dd' වැනිදා 'dddd",
+				f: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm tt",
+				F: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm:ss tt",
+				Y: "yyyy MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si.js
new file mode 100644
index 0000000..724dc61
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture si
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "si", "default", {
+	name: "si",
+	englishName: "Sinhala",
+	nativeName: "සිංහල",
+	language: "si",
+	numberFormat: {
+		groupSizes: [3,2],
+		negativeInfinity: "-අනන්තය",
+		positiveInfinity: "අනන්තය",
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "රු."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],
+				namesAbbr: ["ඉරිදා","සඳුදා","කුජදා","බුදදා","ගුරුදා","කිවිදා","ශනිදා"],
+				namesShort: ["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"]
+			},
+			months: {
+				names: ["ජනවාරි","පෙබරවාරි","මාර්තු","අ‌ප්‍රේල්","මැයි","ජූනි","ජූලි","අ‌ගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්",""],
+				namesAbbr: ["ජන.","පෙබ.","මාර්තු.","අප්‍රේල්.","මැයි.","ජූනි.","ජූලි.","අගෝ.","සැප්.","ඔක්.","නොවැ.","දෙසැ.",""]
+			},
+			AM: ["පෙ.ව.","පෙ.ව.","පෙ.ව."],
+			PM: ["ප.ව.","ප.ව.","ප.ව."],
+			eras: [{"name":"ක්‍රි.ව.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy MMMM' මස 'dd' වැනිදා 'dddd",
+				f: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm tt",
+				F: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm:ss tt",
+				Y: "yyyy MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk-SK.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk-SK.js
new file mode 100644
index 0000000..6bc1656
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk-SK.js
@@ -0,0 +1,85 @@
+/*
+ * Globalize Culture sk-SK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sk-SK", "default", {
+	name: "sk-SK",
+	englishName: "Slovak (Slovakia)",
+	nativeName: "slovenčina (Slovenská republika)",
+	language: "sk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Nie je číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],
+				namesAbbr: ["ne","po","ut","st","št","pi","so"],
+				namesShort: ["ne","po","ut","st","št","pi","so"]
+			},
+			months: {
+				names: ["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk.js
new file mode 100644
index 0000000..0fd4334
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk.js
@@ -0,0 +1,85 @@
+/*
+ * Globalize Culture sk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sk", "default", {
+	name: "sk",
+	englishName: "Slovak",
+	nativeName: "slovenčina",
+	language: "sk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Nie je číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],
+				namesAbbr: ["ne","po","ut","st","št","pi","so"],
+				namesShort: ["ne","po","ut","st","št","pi","so"]
+			},
+			months: {
+				names: ["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl-SI.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl-SI.js
new file mode 100644
index 0000000..9cfb1f9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl-SI.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture sl-SI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sl-SI", "default", {
+	name: "sl-SI",
+	englishName: "Slovenian (Slovenia)",
+	nativeName: "slovenski (Slovenija)",
+	language: "sl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-neskončnost",
+		positiveInfinity: "neskončnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],
+				namesAbbr: ["ned","pon","tor","sre","čet","pet","sob"],
+				namesShort: ["ne","po","to","sr","če","pe","so"]
+			},
+			months: {
+				names: ["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl.js
new file mode 100644
index 0000000..ebfa588
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture sl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sl", "default", {
+	name: "sl",
+	englishName: "Slovenian",
+	nativeName: "slovenski",
+	language: "sl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-neskončnost",
+		positiveInfinity: "neskončnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],
+				namesAbbr: ["ned","pon","tor","sre","čet","pet","sob"],
+				namesShort: ["ne","po","to","sr","če","pe","so"]
+			},
+			months: {
+				names: ["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-NO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-NO.js
new file mode 100644
index 0000000..80879ff
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-NO.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture sma-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sma-NO", "default", {
+	name: "sma-NO",
+	englishName: "Sami, Southern (Norway)",
+	nativeName: "åarjelsaemiengiele (Nöörje)",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-SE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-SE.js
new file mode 100644
index 0000000..36747ff
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-SE.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sma-SE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sma-SE", "default", {
+	name: "sma-SE",
+	englishName: "Sami, Southern (Sweden)",
+	nativeName: "åarjelsaemiengiele (Sveerje)",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma.js
new file mode 100644
index 0000000..284bf37
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sma
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sma", "default", {
+	name: "sma",
+	englishName: "Sami (Southern)",
+	nativeName: "åarjelsaemiengiele",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-NO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-NO.js
new file mode 100644
index 0000000..d6556e5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-NO.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture smj-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smj-NO", "default", {
+	name: "smj-NO",
+	englishName: "Sami, Lule (Norway)",
+	nativeName: "julevusámegiella (Vuodna)",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sådnåbiejvve","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["såd","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-SE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-SE.js
new file mode 100644
index 0000000..4b3f8a2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-SE.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture smj-SE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smj-SE", "default", {
+	name: "smj-SE",
+	englishName: "Sami, Lule (Sweden)",
+	nativeName: "julevusámegiella (Svierik)",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["ájl","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["á","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj.js
new file mode 100644
index 0000000..fe1e50f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture smj
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smj", "default", {
+	name: "smj",
+	englishName: "Sami (Lule)",
+	nativeName: "julevusámegiella",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["ájl","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["á","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn-FI.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn-FI.js
new file mode 100644
index 0000000..8226968
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn-FI.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture smn-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smn-FI", "default", {
+	name: "smn-FI",
+	englishName: "Sami, Inari (Finland)",
+	nativeName: "sämikielâ (Suomâ)",
+	language: "smn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],
+				namesAbbr: ["pa","vu","ma","ko","tu","vá","lá"],
+				namesShort: ["p","v","m","k","t","v","l"]
+			},
+			months: {
+				names: ["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu",""],
+				namesAbbr: ["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn.js
new file mode 100644
index 0000000..ce7bcf8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture smn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smn", "default", {
+	name: "smn",
+	englishName: "Sami (Inari)",
+	nativeName: "sämikielâ",
+	language: "smn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],
+				namesAbbr: ["pa","vu","ma","ko","tu","vá","lá"],
+				namesShort: ["p","v","m","k","t","v","l"]
+			},
+			months: {
+				names: ["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu",""],
+				namesAbbr: ["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms-FI.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms-FI.js
new file mode 100644
index 0000000..441c2f3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms-FI.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sms-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sms-FI", "default", {
+	name: "sms-FI",
+	englishName: "Sami, Skolt (Finland)",
+	nativeName: "sääm´ǩiõll (Lää´ddjânnam)",
+	language: "sms",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],
+				namesAbbr: ["pâ","vu","mâ","se","ne","pi","su"],
+				namesShort: ["p","v","m","s","n","p","s"]
+			},
+			months: {
+				names: ["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			monthsGenitive: {
+				names: ["ođđee´jjmannu","tä´lvvmannu","pâ´zzlâšttammannu","njuhččmannu","vue´ssmannu","ǩie´ssmannu","suei´nnmannu","på´rǧǧmannu","čõhččmannu","kålggmannu","skamm´mannu","rosttovmannu",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms.js
new file mode 100644
index 0000000..990e43f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sms
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sms", "default", {
+	name: "sms",
+	englishName: "Sami (Skolt)",
+	nativeName: "sääm´ǩiõll",
+	language: "sms",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],
+				namesAbbr: ["pâ","vu","mâ","se","ne","pi","su"],
+				namesShort: ["p","v","m","s","n","p","s"]
+			},
+			months: {
+				names: ["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			monthsGenitive: {
+				names: ["ođđee´jjmannu","tä´lvvmannu","pâ´zzlâšttammannu","njuhččmannu","vue´ssmannu","ǩie´ssmannu","suei´nnmannu","på´rǧǧmannu","čõhččmannu","kålggmannu","skamm´mannu","rosttovmannu",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq-AL.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq-AL.js
new file mode 100644
index 0000000..f90be76
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq-AL.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture sq-AL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sq-AL", "default", {
+	name: "sq-AL",
+	englishName: "Albanian (Albania)",
+	nativeName: "shqipe (Shqipëria)",
+	language: "sq",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": ".",
+			".": ",",
+			symbol: "Lek"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],
+				namesAbbr: ["Die","Hën","Mar","Mër","Enj","Pre","Sht"],
+				namesShort: ["Di","Hë","Ma","Më","En","Pr","Sh"]
+			},
+			months: {
+				names: ["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor",""],
+				namesAbbr: ["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj",""]
+			},
+			AM: ["PD","pd","PD"],
+			PM: ["MD","md","MD"],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy-MM-dd",
+				t: "h:mm.tt",
+				T: "h:mm:ss.tt",
+				f: "yyyy-MM-dd h:mm.tt",
+				F: "yyyy-MM-dd h:mm:ss.tt",
+				Y: "yyyy-MM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq.js
new file mode 100644
index 0000000..0e9c6b8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture sq
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sq", "default", {
+	name: "sq",
+	englishName: "Albanian",
+	nativeName: "shqipe",
+	language: "sq",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": ".",
+			".": ",",
+			symbol: "Lek"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],
+				namesAbbr: ["Die","Hën","Mar","Mër","Enj","Pre","Sht"],
+				namesShort: ["Di","Hë","Ma","Më","En","Pr","Sh"]
+			},
+			months: {
+				names: ["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor",""],
+				namesAbbr: ["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj",""]
+			},
+			AM: ["PD","pd","PD"],
+			PM: ["MD","md","MD"],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy-MM-dd",
+				t: "h:mm.tt",
+				T: "h:mm:ss.tt",
+				f: "yyyy-MM-dd h:mm.tt",
+				F: "yyyy-MM-dd h:mm:ss.tt",
+				Y: "yyyy-MM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-BA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-BA.js
new file mode 100644
index 0000000..ea6f27a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-BA.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture sr-Cyrl-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl-BA", "default", {
+	name: "sr-Cyrl-BA",
+	englishName: "Serbian (Cyrillic, Bosnia and Herzegovina)",
+	nativeName: "српски (Босна и Херцеговина)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-CS.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-CS.js
new file mode 100644
index 0000000..4a1ad32
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-CS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Cyrl-CS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl-CS", "default", {
+	name: "sr-Cyrl-CS",
+	englishName: "Serbian (Cyrillic, Serbia and Montenegro (Former))",
+	nativeName: "српски (Србија и Црна Гора (Претходно))",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-ME.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-ME.js
new file mode 100644
index 0000000..d791952
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-ME.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Cyrl-ME
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl-ME", "default", {
+	name: "sr-Cyrl-ME",
+	englishName: "Serbian (Cyrillic, Montenegro)",
+	nativeName: "српски (Црна Гора)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-RS.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-RS.js
new file mode 100644
index 0000000..9e5367d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-RS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Cyrl-RS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl-RS", "default", {
+	name: "sr-Cyrl-RS",
+	englishName: "Serbian (Cyrillic, Serbia)",
+	nativeName: "српски (Србија)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl.js
new file mode 100644
index 0000000..cde93e1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl", "default", {
+	name: "sr-Cyrl",
+	englishName: "Serbian (Cyrillic)",
+	nativeName: "српски",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-BA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-BA.js
new file mode 100644
index 0000000..ba99cbb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-BA.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture sr-Latn-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn-BA", "default", {
+	name: "sr-Latn-BA",
+	englishName: "Serbian (Latin, Bosnia and Herzegovina)",
+	nativeName: "srpski (Bosna i Hercegovina)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-CS.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-CS.js
new file mode 100644
index 0000000..02436cb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-CS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Latn-CS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn-CS", "default", {
+	name: "sr-Latn-CS",
+	englishName: "Serbian (Latin, Serbia and Montenegro (Former))",
+	nativeName: "srpski (Srbija i Crna Gora (Prethodno))",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-ME.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-ME.js
new file mode 100644
index 0000000..39ac523
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-ME.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Latn-ME
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn-ME", "default", {
+	name: "sr-Latn-ME",
+	englishName: "Serbian (Latin, Montenegro)",
+	nativeName: "srpski (Crna Gora)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-RS.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-RS.js
new file mode 100644
index 0000000..369bcc7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-RS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Latn-RS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn-RS", "default", {
+	name: "sr-Latn-RS",
+	englishName: "Serbian (Latin, Serbia)",
+	nativeName: "srpski (Srbija)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn.js
new file mode 100644
index 0000000..ae10f74
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn", "default", {
+	name: "sr-Latn",
+	englishName: "Serbian (Latin)",
+	nativeName: "srpski",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr.js
new file mode 100644
index 0000000..b74cd89
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr", "default", {
+	name: "sr",
+	englishName: "Serbian",
+	nativeName: "srpski",
+	language: "sr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-FI.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-FI.js
new file mode 100644
index 0000000..74aeca9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-FI.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture sv-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sv-FI", "default", {
+	name: "sv-FI",
+	englishName: "Swedish (Finland)",
+	nativeName: "svenska (Finland)",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-SE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-SE.js
new file mode 100644
index 0000000..85e5a20
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-SE.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture sv-SE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sv-SE", "default", {
+	name: "sv-SE",
+	englishName: "Swedish (Sweden)",
+	nativeName: "svenska (Sverige)",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv.js
new file mode 100644
index 0000000..313eaf7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture sv
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sv", "default", {
+	name: "sv",
+	englishName: "Swedish",
+	nativeName: "svenska",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw-KE.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw-KE.js
new file mode 100644
index 0000000..8df3960
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw-KE.js
@@ -0,0 +1,53 @@
+/*
+ * Globalize Culture sw-KE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sw-KE", "default", {
+	name: "sw-KE",
+	englishName: "Kiswahili (Kenya)",
+	nativeName: "Kiswahili (Kenya)",
+	language: "sw",
+	numberFormat: {
+		currency: {
+			symbol: "S"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],
+				namesAbbr: ["Jumap.","Jumat.","Juman.","Jumat.","Alh.","Iju.","Jumam."],
+				namesShort: ["P","T","N","T","A","I","M"]
+			},
+			months: {
+				names: ["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Decemba",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec",""]
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw.js
new file mode 100644
index 0000000..c5cfe84
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw.js
@@ -0,0 +1,53 @@
+/*
+ * Globalize Culture sw
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sw", "default", {
+	name: "sw",
+	englishName: "Kiswahili",
+	nativeName: "Kiswahili",
+	language: "sw",
+	numberFormat: {
+		currency: {
+			symbol: "S"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],
+				namesAbbr: ["Jumap.","Jumat.","Juman.","Jumat.","Alh.","Iju.","Jumam."],
+				namesShort: ["P","T","N","T","A","I","M"]
+			},
+			months: {
+				names: ["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Decemba",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec",""]
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr-SY.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr-SY.js
new file mode 100644
index 0000000..1ef86ec
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr-SY.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture syr-SY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "syr-SY", "default", {
+	name: "syr-SY",
+	englishName: "Syriac (Syria)",
+	nativeName: "ܣܘܪܝܝܐ (سوريا)",
+	language: "syr",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],
+				namesAbbr: ["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],
+				namesShort: ["ܐ","ܒ","ܓ","ܕ","ܗ","ܥ","ܫ"]
+			},
+			months: {
+				names: ["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ",""],
+				namesAbbr: ["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ",""]
+			},
+			AM: ["ܩ.ܛ","ܩ.ܛ","ܩ.ܛ"],
+			PM: ["ܒ.ܛ","ܒ.ܛ","ܒ.ܛ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr.js
new file mode 100644
index 0000000..74ea704
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture syr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "syr", "default", {
+	name: "syr",
+	englishName: "Syriac",
+	nativeName: "ܣܘܪܝܝܐ",
+	language: "syr",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],
+				namesAbbr: ["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],
+				namesShort: ["ܐ","ܒ","ܓ","ܕ","ܗ","ܥ","ܫ"]
+			},
+			months: {
+				names: ["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ",""],
+				namesAbbr: ["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ",""]
+			},
+			AM: ["ܩ.ܛ","ܩ.ܛ","ܩ.ܛ"],
+			PM: ["ܒ.ܛ","ܒ.ܛ","ܒ.ܛ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta-IN.js
new file mode 100644
index 0000000..63b16fe
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta-IN.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture ta-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ta-IN", "default", {
+	name: "ta-IN",
+	englishName: "Tamil (India)",
+	nativeName: "தமிழ் (இந்தியா)",
+	language: "ta",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ரூ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ஞாயிற்றுக்கிழமை","திங்கள்கிழமை","செவ்வாய்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],
+				namesAbbr: ["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],
+				namesShort: ["ஞா","தி","செ","பு","வி","வெ","ச"]
+			},
+			months: {
+				names: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""],
+				namesAbbr: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""]
+			},
+			AM: ["காலை","காலை","காலை"],
+			PM: ["மாலை","மாலை","மாலை"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta.js
new file mode 100644
index 0000000..e67c57f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture ta
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ta", "default", {
+	name: "ta",
+	englishName: "Tamil",
+	nativeName: "தமிழ்",
+	language: "ta",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ரூ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ஞாயிற்றுக்கிழமை","திங்கள்கிழமை","செவ்வாய்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],
+				namesAbbr: ["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],
+				namesShort: ["ஞா","தி","செ","பு","வி","வெ","ச"]
+			},
+			months: {
+				names: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""],
+				namesAbbr: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""]
+			},
+			AM: ["காலை","காலை","காலை"],
+			PM: ["மாலை","மாலை","மாலை"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te-IN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te-IN.js
new file mode 100644
index 0000000..b1b92ee
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture te-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "te-IN", "default", {
+	name: "te-IN",
+	englishName: "Telugu (India)",
+	nativeName: "తెలుగు (భారత దేశం)",
+	language: "te",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "రూ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],
+				namesAbbr: ["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],
+				namesShort: ["ఆ","సో","మం","బు","గు","శు","శ"]
+			},
+			months: {
+				names: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""],
+				namesAbbr: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""]
+			},
+			AM: ["పూర్వాహ్న","పూర్వాహ్న","పూర్వాహ్న"],
+			PM: ["అపరాహ్న","అపరాహ్న","అపరాహ్న"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te.js
new file mode 100644
index 0000000..be5becb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture te
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "te", "default", {
+	name: "te",
+	englishName: "Telugu",
+	nativeName: "తెలుగు",
+	language: "te",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "రూ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],
+				namesAbbr: ["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],
+				namesShort: ["ఆ","సో","మం","బు","గు","శు","శ"]
+			},
+			months: {
+				names: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""],
+				namesAbbr: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""]
+			},
+			AM: ["పూర్వాహ్న","పూర్వాహ్న","పూర్వాహ్న"],
+			PM: ["అపరాహ్న","అపరాహ్న","అపరాహ్న"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl-TJ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl-TJ.js
new file mode 100644
index 0000000..3f0f3eb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl-TJ.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture tg-Cyrl-TJ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tg-Cyrl-TJ", "default", {
+	name: "tg-Cyrl-TJ",
+	englishName: "Tajik (Cyrillic, Tajikistan)",
+	nativeName: "Тоҷикӣ (Тоҷикистон)",
+	language: "tg-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl.js
new file mode 100644
index 0000000..30fa290
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture tg-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tg-Cyrl", "default", {
+	name: "tg-Cyrl",
+	englishName: "Tajik (Cyrillic)",
+	nativeName: "Тоҷикӣ",
+	language: "tg-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg.js
new file mode 100644
index 0000000..df4f26b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture tg
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tg", "default", {
+	name: "tg",
+	englishName: "Tajik",
+	nativeName: "Тоҷикӣ",
+	language: "tg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th-TH.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th-TH.js
new file mode 100644
index 0000000..3ab70ab
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th-TH.js
@@ -0,0 +1,90 @@
+/*
+ * Globalize Culture th-TH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "th-TH", "default", {
+	name: "th-TH",
+	englishName: "Thai (Thailand)",
+	nativeName: "ไทย (ไทย)",
+	language: "th",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "฿"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "ThaiBuddhist",
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			eras: [{"name":"พ.ศ.","start":null,"offset":-543}],
+			twoDigitYearMax: 2572,
+			patterns: {
+				d: "d/M/yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "'วัน'dddd'ที่' d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "'วัน'dddd'ที่' d MMMM yyyy H:mm",
+				F: "'วัน'dddd'ที่' d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th.js
new file mode 100644
index 0000000..1294351
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th.js
@@ -0,0 +1,90 @@
+/*
+ * Globalize Culture th
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "th", "default", {
+	name: "th",
+	englishName: "Thai",
+	nativeName: "ไทย",
+	language: "th",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "฿"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "ThaiBuddhist",
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			eras: [{"name":"พ.ศ.","start":null,"offset":-543}],
+			twoDigitYearMax: 2572,
+			patterns: {
+				d: "d/M/yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "'วัน'dddd'ที่' d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "'วัน'dddd'ที่' d MMMM yyyy H:mm",
+				F: "'วัน'dddd'ที่' d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk-TM.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk-TM.js
new file mode 100644
index 0000000..8abafa0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk-TM.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture tk-TM
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tk-TM", "default", {
+	name: "tk-TM",
+	englishName: "Turkmen (Turkmenistan)",
+	nativeName: "türkmençe (Türkmenistan)",
+	language: "tk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-üznüksizlik",
+		positiveInfinity: "üznüksizlik",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "m."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],
+				namesAbbr: ["Db","Sb","Çb","Pb","An","Şb","Ýb"],
+				namesShort: ["D","S","Ç","P","A","Ş","Ý"]
+			},
+			months: {
+				names: ["Ýanwar","Fewral","Mart","Aprel","Maý","lýun","lýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr",""],
+				namesAbbr: ["Ýan","Few","Mart","Apr","Maý","lýun","lýul","Awg","Sen","Okt","Not","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "yyyy 'ý.' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'ý.' MMMM d H:mm",
+				F: "yyyy 'ý.' MMMM d H:mm:ss",
+				Y: "yyyy 'ý.' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk.js
new file mode 100644
index 0000000..2727041
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture tk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tk", "default", {
+	name: "tk",
+	englishName: "Turkmen",
+	nativeName: "türkmençe",
+	language: "tk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-üznüksizlik",
+		positiveInfinity: "üznüksizlik",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "m."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],
+				namesAbbr: ["Db","Sb","Çb","Pb","An","Şb","Ýb"],
+				namesShort: ["D","S","Ç","P","A","Ş","Ý"]
+			},
+			months: {
+				names: ["Ýanwar","Fewral","Mart","Aprel","Maý","lýun","lýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr",""],
+				namesAbbr: ["Ýan","Few","Mart","Apr","Maý","lýun","lýul","Awg","Sen","Okt","Not","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "yyyy 'ý.' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'ý.' MMMM d H:mm",
+				F: "yyyy 'ý.' MMMM d H:mm:ss",
+				Y: "yyyy 'ý.' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn-ZA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn-ZA.js
new file mode 100644
index 0000000..32c861d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn-ZA.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture tn-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tn-ZA", "default", {
+	name: "tn-ZA",
+	englishName: "Setswana (South Africa)",
+	nativeName: "Setswana (Aforika Borwa)",
+	language: "tn",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],
+				namesAbbr: ["Ltp.","Mos.","Lbd.","Lbr.","Lbn.","Lbt.","Lmt."],
+				namesShort: ["Lp","Ms","Lb","Lr","Ln","Lt","Lm"]
+			},
+			months: {
+				names: ["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole",""],
+				namesAbbr: ["Fer.","Tlhak.","Mop.","Mor.","Motsh.","Seet.","Phukw.","Phatw.","Lwets.","Diph.","Ngwan.","Sed.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn.js
new file mode 100644
index 0000000..e331578
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture tn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tn", "default", {
+	name: "tn",
+	englishName: "Setswana",
+	nativeName: "Setswana",
+	language: "tn",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],
+				namesAbbr: ["Ltp.","Mos.","Lbd.","Lbr.","Lbn.","Lbt.","Lmt."],
+				namesShort: ["Lp","Ms","Lb","Lr","Ln","Lt","Lm"]
+			},
+			months: {
+				names: ["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole",""],
+				namesAbbr: ["Fer.","Tlhak.","Mop.","Mor.","Motsh.","Seet.","Phukw.","Phatw.","Lwets.","Diph.","Ngwan.","Sed.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr-TR.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr-TR.js
new file mode 100644
index 0000000..0fb93f8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr-TR.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tr-TR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tr-TR", "default", {
+	name: "tr-TR",
+	englishName: "Turkish (Turkey)",
+	nativeName: "Türkçe (Türkiye)",
+	language: "tr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "TL"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],
+				namesAbbr: ["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],
+				namesShort: ["Pz","Pt","Sa","Ça","Pe","Cu","Ct"]
+			},
+			months: {
+				names: ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık",""],
+				namesAbbr: ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr.js
new file mode 100644
index 0000000..a2ef8a5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tr", "default", {
+	name: "tr",
+	englishName: "Turkish",
+	nativeName: "Türkçe",
+	language: "tr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "TL"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],
+				namesAbbr: ["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],
+				namesShort: ["Pz","Pt","Sa","Ça","Pe","Cu","Ct"]
+			},
+			months: {
+				names: ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık",""],
+				namesAbbr: ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt-RU.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt-RU.js
new file mode 100644
index 0000000..b918faa
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt-RU.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture tt-RU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tt-RU", "default", {
+	name: "tt-RU",
+	englishName: "Tatar (Russia)",
+	nativeName: "Татар (Россия)",
+	language: "tt",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],
+				namesAbbr: ["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],
+				namesShort: ["Я","Д","С","Ч","П","Җ","Ш"]
+			},
+			months: {
+				names: ["Гыйнвар","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Гыйн.","Фев.","Мар.","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Нояб.","Дек.",""]
+			},
+			monthsGenitive: {
+				names: ["Гыйнварның","Февральнең","Мартның","Апрельнең","Майның","Июньнең","Июльнең","Августның","Сентябрьның","Октябрьның","Ноябрьның","Декабрьның",""],
+				namesAbbr: ["Гыйн.-ның","Фев.-нең","Мар.-ның","Апр.-нең","Майның","Июньнең","Июльнең","Авг.-ның","Сен.-ның","Окт.-ның","Нояб.-ның","Дек.-ның",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt.js
new file mode 100644
index 0000000..efefad6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture tt
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tt", "default", {
+	name: "tt",
+	englishName: "Tatar",
+	nativeName: "Татар",
+	language: "tt",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],
+				namesAbbr: ["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],
+				namesShort: ["Я","Д","С","Ч","П","Җ","Ш"]
+			},
+			months: {
+				names: ["Гыйнвар","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Гыйн.","Фев.","Мар.","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Нояб.","Дек.",""]
+			},
+			monthsGenitive: {
+				names: ["Гыйнварның","Февральнең","Мартның","Апрельнең","Майның","Июньнең","Июльнең","Августның","Сентябрьның","Октябрьның","Ноябрьның","Декабрьның",""],
+				namesAbbr: ["Гыйн.-ның","Фев.-нең","Мар.-ның","Апр.-нең","Майның","Июньнең","Июльнең","Авг.-ның","Сен.-ның","Окт.-ның","Нояб.-ның","Дек.-ның",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn-DZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn-DZ.js
new file mode 100644
index 0000000..a05ff0a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn-DZ.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tzm-Latn-DZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tzm-Latn-DZ", "default", {
+	name: "tzm-Latn-DZ",
+	englishName: "Tamazight (Latin, Algeria)",
+	nativeName: "Tamazight (Djazaïr)",
+	language: "tzm-Latn",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn.js
new file mode 100644
index 0000000..6e30aa6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tzm-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tzm-Latn", "default", {
+	name: "tzm-Latn",
+	englishName: "Tamazight (Latin)",
+	nativeName: "Tamazight",
+	language: "tzm-Latn",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm.js
new file mode 100644
index 0000000..176f0c9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tzm
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tzm", "default", {
+	name: "tzm",
+	englishName: "Tamazight",
+	nativeName: "Tamazight",
+	language: "tzm",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug-CN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug-CN.js
new file mode 100644
index 0000000..dcfd852
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug-CN.js
@@ -0,0 +1,75 @@
+/*
+ * Globalize Culture ug-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ug-CN", "default", {
+	name: "ug-CN",
+	englishName: "Uyghur (PRC)",
+	nativeName: "ئۇيغۇرچە (جۇڭخۇا خەلق جۇمھۇرىيىتى)",
+	language: "ug",
+	isRTL: true,
+	numberFormat: {
+		NaN: "سان ئەمەس",
+		negativeInfinity: "مەنپىي چەكسىزلىك",
+		positiveInfinity: "مۇسبەت چەكسىزلىك",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],
+				namesAbbr: ["يە","دۈ","سە","چا","پە","جۈ","شە"],
+				namesShort: ["ي","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""],
+				namesAbbr: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""]
+			},
+			AM: ["چۈشتىن بۇرۇن","چۈشتىن بۇرۇن","چۈشتىن بۇرۇن"],
+			PM: ["چۈشتىن كېيىن","چۈشتىن كېيىن","چۈشتىن كېيىن"],
+			eras: [{"name":"مىلادى","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-M-d",
+				D: "yyyy-'يىلى' MMMM d-'كۈنى،'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm",
+				F: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm:ss",
+				M: "MMMM d'-كۈنى'",
+				Y: "yyyy-'يىلى' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug.js
new file mode 100644
index 0000000..5ea5a5a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug.js
@@ -0,0 +1,75 @@
+/*
+ * Globalize Culture ug
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ug", "default", {
+	name: "ug",
+	englishName: "Uyghur",
+	nativeName: "ئۇيغۇرچە",
+	language: "ug",
+	isRTL: true,
+	numberFormat: {
+		NaN: "سان ئەمەس",
+		negativeInfinity: "مەنپىي چەكسىزلىك",
+		positiveInfinity: "مۇسبەت چەكسىزلىك",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],
+				namesAbbr: ["يە","دۈ","سە","چا","پە","جۈ","شە"],
+				namesShort: ["ي","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""],
+				namesAbbr: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""]
+			},
+			AM: ["چۈشتىن بۇرۇن","چۈشتىن بۇرۇن","چۈشتىن بۇرۇن"],
+			PM: ["چۈشتىن كېيىن","چۈشتىن كېيىن","چۈشتىن كېيىن"],
+			eras: [{"name":"مىلادى","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-M-d",
+				D: "yyyy-'يىلى' MMMM d-'كۈنى،'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm",
+				F: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm:ss",
+				M: "MMMM d'-كۈنى'",
+				Y: "yyyy-'يىلى' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk-UA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk-UA.js
new file mode 100644
index 0000000..ffd012a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk-UA.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture uk-UA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uk-UA", "default", {
+	name: "uk-UA",
+	englishName: "Ukrainian (Ukraine)",
+	nativeName: "українська (Україна)",
+	language: "uk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-безмежність",
+		positiveInfinity: "безмежність",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₴"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],
+				namesAbbr: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень",""],
+				namesAbbr: ["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру",""]
+			},
+			monthsGenitive: {
+				names: ["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня",""],
+				namesAbbr: ["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy' р.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy' р.' H:mm",
+				F: "d MMMM yyyy' р.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy' р.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk.js
new file mode 100644
index 0000000..3aba558
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture uk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uk", "default", {
+	name: "uk",
+	englishName: "Ukrainian",
+	nativeName: "українська",
+	language: "uk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-безмежність",
+		positiveInfinity: "безмежність",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₴"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],
+				namesAbbr: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень",""],
+				namesAbbr: ["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру",""]
+			},
+			monthsGenitive: {
+				names: ["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня",""],
+				namesAbbr: ["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy' р.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy' р.' H:mm",
+				F: "d MMMM yyyy' р.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy' р.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur-PK.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur-PK.js
new file mode 100644
index 0000000..befd62f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur-PK.js
@@ -0,0 +1,157 @@
+/*
+ * Globalize Culture ur-PK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ur-PK", "default", {
+	name: "ur-PK",
+	englishName: "Urdu (Islamic Republic of Pakistan)",
+	nativeName: "اُردو (پاکستان)",
+	language: "ur",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "Rs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesAbbr: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesShort: ["ا","پ","م","ب","ج","ج","ه"]
+			},
+			months: {
+				names: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""],
+				namesAbbr: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				f: "dd MMMM, yyyy h:mm tt",
+				F: "dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur.js
new file mode 100644
index 0000000..ce12613
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur.js
@@ -0,0 +1,157 @@
+/*
+ * Globalize Culture ur
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ur", "default", {
+	name: "ur",
+	englishName: "Urdu",
+	nativeName: "اُردو",
+	language: "ur",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "Rs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesAbbr: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesShort: ["ا","پ","م","ب","ج","ج","ه"]
+			},
+			months: {
+				names: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""],
+				namesAbbr: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				f: "dd MMMM, yyyy h:mm tt",
+				F: "dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl-UZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl-UZ.js
new file mode 100644
index 0000000..69bd196
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl-UZ.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture uz-Cyrl-UZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz-Cyrl-UZ", "default", {
+	name: "uz-Cyrl-UZ",
+	englishName: "Uzbek (Cyrillic, Uzbekistan)",
+	nativeName: "Ўзбек (Ўзбекистон)",
+	language: "uz-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "сўм"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],
+				namesAbbr: ["якш","дш","сш","чш","пш","ж","ш"],
+				namesShort: ["я","д","с","ч","п","ж","ш"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","мая","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'йил' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'йил' d-MMMM HH:mm",
+				F: "yyyy 'йил' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl.js
new file mode 100644
index 0000000..90d5f45
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture uz-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz-Cyrl", "default", {
+	name: "uz-Cyrl",
+	englishName: "Uzbek (Cyrillic)",
+	nativeName: "Ўзбек",
+	language: "uz-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "сўм"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],
+				namesAbbr: ["якш","дш","сш","чш","пш","ж","ш"],
+				namesShort: ["я","д","с","ч","п","ж","ш"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","мая","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'йил' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'йил' d-MMMM HH:mm",
+				F: "yyyy 'йил' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn-UZ.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn-UZ.js
new file mode 100644
index 0000000..b4b1ea4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn-UZ.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture uz-Latn-UZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz-Latn-UZ", "default", {
+	name: "uz-Latn-UZ",
+	englishName: "Uzbek (Latin, Uzbekistan)",
+	nativeName: "U'zbek (U'zbekiston Respublikasi)",
+	language: "uz-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn.js
new file mode 100644
index 0000000..95a717e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture uz-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz-Latn", "default", {
+	name: "uz-Latn",
+	englishName: "Uzbek (Latin)",
+	nativeName: "U'zbek",
+	language: "uz-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz.js
new file mode 100644
index 0000000..50bf9ce
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture uz
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz", "default", {
+	name: "uz",
+	englishName: "Uzbek",
+	nativeName: "U'zbek",
+	language: "uz",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi-VN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi-VN.js
new file mode 100644
index 0000000..bc28d7a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi-VN.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture vi-VN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "vi-VN", "default", {
+	name: "vi-VN",
+	englishName: "Vietnamese (Vietnam)",
+	nativeName: "Tiếng Việt (Việt Nam)",
+	language: "vi",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "₫"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],
+				namesAbbr: ["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],
+				namesShort: ["C","H","B","T","N","S","B"]
+			},
+			months: {
+				names: ["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai",""],
+				namesAbbr: ["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12",""]
+			},
+			AM: ["SA","sa","SA"],
+			PM: ["CH","ch","CH"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				f: "dd MMMM yyyy h:mm tt",
+				F: "dd MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi.js
new file mode 100644
index 0000000..d0cec0b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture vi
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "vi", "default", {
+	name: "vi",
+	englishName: "Vietnamese",
+	nativeName: "Tiếng Việt",
+	language: "vi",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "₫"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],
+				namesAbbr: ["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],
+				namesShort: ["C","H","B","T","N","S","B"]
+			},
+			months: {
+				names: ["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai",""],
+				namesAbbr: ["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12",""]
+			},
+			AM: ["SA","sa","SA"],
+			PM: ["CH","ch","CH"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				f: "dd MMMM yyyy h:mm tt",
+				F: "dd MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo-SN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo-SN.js
new file mode 100644
index 0000000..e2def20
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo-SN.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture wo-SN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "wo-SN", "default", {
+	name: "wo-SN",
+	englishName: "Wolof (Senegal)",
+	nativeName: "Wolof (Sénégal)",
+	language: "wo",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "XOF"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo.js
new file mode 100644
index 0000000..f2d4edb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture wo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "wo", "default", {
+	name: "wo",
+	englishName: "Wolof",
+	nativeName: "Wolof",
+	language: "wo",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "XOF"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh-ZA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh-ZA.js
new file mode 100644
index 0000000..4101be6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh-ZA.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture xh-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "xh-ZA", "default", {
+	name: "xh-ZA",
+	englishName: "isiXhosa (South Africa)",
+	nativeName: "isiXhosa (uMzantsi Afrika)",
+	language: "xh",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesShort: ["Ca","Mv","Lb","Lt","Ln","Lh","Mg"]
+			},
+			months: {
+				names: ["Mqungu","Mdumba","Kwindla","Tshazimpuzi","Canzibe","Silimela","Khala","Thupha","Msintsi","Dwarha","Nkanga","Mnga",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh.js
new file mode 100644
index 0000000..8325e61
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture xh
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "xh", "default", {
+	name: "xh",
+	englishName: "isiXhosa",
+	nativeName: "isiXhosa",
+	language: "xh",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesShort: ["Ca","Mv","Lb","Lt","Ln","Lh","Mg"]
+			},
+			months: {
+				names: ["Mqungu","Mdumba","Kwindla","Tshazimpuzi","Canzibe","Silimela","Khala","Thupha","Msintsi","Dwarha","Nkanga","Mnga",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo-NG.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo-NG.js
new file mode 100644
index 0000000..39af5b8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo-NG.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture yo-NG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "yo-NG", "default", {
+	name: "yo-NG",
+	englishName: "Yoruba (Nigeria)",
+	nativeName: "Yoruba (Nigeria)",
+	language: "yo",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Osu kinni","Osu keji","Osu keta","Osu kerin","Osu karun","Osu kefa","Osu keje","Osu kejo","Osu kesan","Osu kewa","Osu kokanla","Osu keresi",""],
+				namesAbbr: ["kin.","kej.","ket.","ker.","kar.","kef.","kej.","kej.","kes.","kew.","kok.","ker.",""]
+			},
+			AM: ["Owuro","owuro","OWURO"],
+			PM: ["Ale","ale","ALE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo.js
new file mode 100644
index 0000000..b5e24cd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture yo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "yo", "default", {
+	name: "yo",
+	englishName: "Yoruba",
+	nativeName: "Yoruba",
+	language: "yo",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Osu kinni","Osu keji","Osu keta","Osu kerin","Osu karun","Osu kefa","Osu keje","Osu kejo","Osu kesan","Osu kewa","Osu kokanla","Osu keresi",""],
+				namesAbbr: ["kin.","kej.","ket.","ker.","kar.","kef.","kej.","kej.","kes.","kew.","kok.","ker.",""]
+			},
+			AM: ["Owuro","owuro","OWURO"],
+			PM: ["Ale","ale","ALE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHS.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHS.js
new file mode 100644
index 0000000..c843bc8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHS.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture zh-CHS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-CHS", "default", {
+	name: "zh-CHS",
+	englishName: "Chinese (Simplified) Legacy",
+	nativeName: "中文(简体) 旧版",
+	language: "zh-CHS",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHT.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHT.js
new file mode 100644
index 0000000..7ca37c9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHT.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture zh-CHT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-CHT", "default", {
+	name: "zh-CHT",
+	englishName: "Chinese (Traditional) Legacy",
+	nativeName: "中文(繁體) 舊版",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CN.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CN.js
new file mode 100644
index 0000000..41e6294
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CN.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture zh-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-CN", "default", {
+	name: "zh-CN",
+	englishName: "Chinese (Simplified, PRC)",
+	nativeName: "中文(中华人民共和国)",
+	language: "zh-CHS",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-HK.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-HK.js
new file mode 100644
index 0000000..dd769ca
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-HK.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture zh-HK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-HK", "default", {
+	name: "zh-HK",
+	englishName: "Chinese (Traditional, Hong Kong S.A.R.)",
+	nativeName: "中文(香港特別行政區)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hans.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hans.js
new file mode 100644
index 0000000..8569374
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hans.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture zh-Hans
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-Hans", "default", {
+	name: "zh-Hans",
+	englishName: "Chinese (Simplified)",
+	nativeName: "中文(简体)",
+	language: "zh-Hans",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hant.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hant.js
new file mode 100644
index 0000000..44ba865
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hant.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture zh-Hant
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-Hant", "default", {
+	name: "zh-Hant",
+	englishName: "Chinese (Traditional)",
+	nativeName: "中文(繁體)",
+	language: "zh-Hant",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-MO.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-MO.js
new file mode 100644
index 0000000..e09274f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-MO.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture zh-MO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-MO", "default", {
+	name: "zh-MO",
+	englishName: "Chinese (Traditional, Macao S.A.R.)",
+	nativeName: "中文(澳門特別行政區)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "MOP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-SG.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-SG.js
new file mode 100644
index 0000000..8e99e6d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-SG.js
@@ -0,0 +1,63 @@
+/*
+ * Globalize Culture zh-SG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-SG", "default", {
+	name: "zh-SG",
+	englishName: "Chinese (Simplified, Singapore)",
+	nativeName: "中文(新加坡)",
+	language: "zh-CHS",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt h:mm",
+				F: "yyyy'年'M'月'd'日' tt h:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-TW.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-TW.js
new file mode 100644
index 0000000..22eea14
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-TW.js
@@ -0,0 +1,99 @@
+/*
+ * Globalize Culture zh-TW
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-TW", "default", {
+	name: "zh-TW",
+	englishName: "Chinese (Traditional, Taiwan)",
+	nativeName: "中文(台灣)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "不是一個數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "NT$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"西元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt hh:mm",
+				F: "yyyy'年'M'月'd'日' tt hh:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Taiwan: {
+			name: "Taiwan",
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"","start":null,"offset":1911}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt hh:mm",
+				F: "yyyy'年'M'月'd'日' tt hh:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh.js
new file mode 100644
index 0000000..2bab388
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture zh
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh", "default", {
+	name: "zh",
+	englishName: "Chinese",
+	nativeName: "中文",
+	language: "zh",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu-ZA.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu-ZA.js
new file mode 100644
index 0000000..348cda6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu-ZA.js
@@ -0,0 +1,66 @@
+/*
+ * Globalize Culture zu-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zu-ZA", "default", {
+	name: "zu-ZA",
+	englishName: "isiZulu (South Africa)",
+	nativeName: "isiZulu (iNingizimu Afrika)",
+	language: "zu",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesAbbr: ["Son.","Mso.","Bi.","Tha.","Ne.","Hla.","Mgq."]
+			},
+			months: {
+				names: ["uMasingana","uNhlolanja","uNdasa","uMbaso","uNhlaba","uNhlangulana","uNtulikazi","uNcwaba","uMandulo","uMfumfu","uLwezi","uZibandlela",""],
+				namesAbbr: ["Mas.","Nhlo.","Nda.","Mba.","Nhla.","Nhlang.","Ntu.","Ncwa.","Man.","Mfu.","Lwe.","Zib.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu.js
new file mode 100644
index 0000000..78873a5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu.js
@@ -0,0 +1,66 @@
+/*
+ * Globalize Culture zu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zu", "default", {
+	name: "zu",
+	englishName: "isiZulu",
+	nativeName: "isiZulu",
+	language: "zu",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesAbbr: ["Son.","Mso.","Bi.","Tha.","Ne.","Hla.","Mgq."]
+			},
+			months: {
+				names: ["uMasingana","uNhlolanja","uNdasa","uMbaso","uNhlaba","uNhlangulana","uNtulikazi","uNcwaba","uMandulo","uMfumfu","uLwezi","uZibandlela",""],
+				namesAbbr: ["Mas.","Nhlo.","Nda.","Mba.","Nhla.","Nhlang.","Ntu.","Ncwa.","Man.","Mfu.","Lwe.","Zib.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.cultures.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.cultures.js
new file mode 100644
index 0000000..cf30659
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/cultures/globalize.cultures.js
@@ -0,0 +1,24063 @@
+/*
+ * Globalize Cultures
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar", "default", {
+	name: "ar",
+	englishName: "Arabic",
+	nativeName: "العربية",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bg", "default", {
+	name: "bg",
+	englishName: "Bulgarian",
+	nativeName: "български",
+	language: "bg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "- безкрайност",
+		positiveInfinity: "+ безкрайност",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "лв."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],
+				namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"],
+				namesShort: ["н","п","в","с","ч","п","с"]
+			},
+			months: {
+				names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"след новата ера","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy 'г.'",
+				D: "dd MMMM yyyy 'г.'",
+				t: "HH:mm 'ч.'",
+				T: "HH:mm:ss 'ч.'",
+				f: "dd MMMM yyyy 'г.' HH:mm 'ч.'",
+				F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'",
+				M: "dd MMMM",
+				Y: "MMMM yyyy 'г.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ca", "default", {
+	name: "ca",
+	englishName: "Catalan",
+	nativeName: "català",
+	language: "ca",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "Infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],
+				namesAbbr: ["dg.","dl.","dt.","dc.","dj.","dv.","ds."],
+				namesShort: ["dg","dl","dt","dc","dj","dv","ds"]
+			},
+			months: {
+				names: ["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre",""],
+				namesAbbr: ["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' / 'MMMM' / 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' / 'MMMM' / 'yyyy HH:mm",
+				F: "dddd, d' / 'MMMM' / 'yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' / 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-Hans", "default", {
+	name: "zh-Hans",
+	englishName: "Chinese (Simplified)",
+	nativeName: "中文(简体)",
+	language: "zh-Hans",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "cs", "default", {
+	name: "cs",
+	englishName: "Czech",
+	nativeName: "čeština",
+	language: "cs",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Není číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Kč"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],
+				namesAbbr: ["ne","po","út","st","čt","pá","so"],
+				namesShort: ["ne","po","út","st","čt","pá","so"]
+			},
+			months: {
+				names: ["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["dop.","dop.","DOP."],
+			PM: ["odp.","odp.","ODP."],
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "da", "default", {
+	name: "da",
+	englishName: "Danish",
+	nativeName: "dansk",
+	language: "da",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de", "default", {
+	name: "de",
+	englishName: "German",
+	nativeName: "Deutsch",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "el", "default", {
+	name: "el",
+	englishName: "Greek",
+	nativeName: "Ελληνικά",
+	language: "el",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "μη αριθμός",
+		negativeInfinity: "-Άπειρο",
+		positiveInfinity: "Άπειρο",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],
+				namesAbbr: ["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],
+				namesShort: ["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"]
+			},
+			months: {
+				names: ["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			monthsGenitive: {
+				names: ["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			AM: ["πμ","πμ","ΠΜ"],
+			PM: ["μμ","μμ","ΜΜ"],
+			eras: [{"name":"μ.Χ.","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es", "default", {
+	name: "es",
+	englishName: "Spanish",
+	nativeName: "español",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fi", "default", {
+	name: "fi",
+	englishName: "Finnish",
+	nativeName: "suomi",
+	language: "fi",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],
+				namesAbbr: ["su","ma","ti","ke","to","pe","la"],
+				namesShort: ["su","ma","ti","ke","to","pe","la"]
+			},
+			months: {
+				names: ["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu",""],
+				namesAbbr: ["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM'ta 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM'ta 'yyyy H:mm",
+				F: "d. MMMM'ta 'yyyy H:mm:ss",
+				M: "d. MMMM'ta'",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr", "default", {
+	name: "fr",
+	englishName: "French",
+	nativeName: "français",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "he", "default", {
+	name: "he",
+	englishName: "Hebrew",
+	nativeName: "עברית",
+	language: "he",
+	isRTL: true,
+	numberFormat: {
+		NaN: "לא מספר",
+		negativeInfinity: "אינסוף שלילי",
+		positiveInfinity: "אינסוף חיובי",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "₪"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר",""],
+				namesAbbr: ["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ",""]
+			},
+			eras: [{"name":"לספירה","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Hebrew: {
+			name: "Hebrew",
+			"/": " ",
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["א","ב","ג","ד","ה","ו","ש"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"],
+				namesAbbr: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"]
+			},
+			eras: [{"name":"C.E.","start":null,"offset":0}],
+			twoDigitYearMax: 5790,
+			patterns: {
+				d: "dd MMMM yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hu", "default", {
+	name: "hu",
+	englishName: "Hungarian",
+	nativeName: "magyar",
+	language: "hu",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nem szám",
+		negativeInfinity: "negatív végtelen",
+		positiveInfinity: "végtelen",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Ft"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],
+				namesAbbr: ["V","H","K","Sze","Cs","P","Szo"],
+				namesShort: ["V","H","K","Sze","Cs","P","Szo"]
+			},
+			months: {
+				names: ["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december",""],
+				namesAbbr: ["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec.",""]
+			},
+			AM: ["de.","de.","DE."],
+			PM: ["du.","du.","DU."],
+			eras: [{"name":"i.sz.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "yyyy. MMMM d.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy. MMMM d. H:mm",
+				F: "yyyy. MMMM d. H:mm:ss",
+				M: "MMMM d.",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "is", "default", {
+	name: "is",
+	englishName: "Icelandic",
+	nativeName: "íslenska",
+	language: "is",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],
+				namesAbbr: ["sun.","mán.","þri.","mið.","fim.","fös.","lau."],
+				namesShort: ["su","má","þr","mi","fi","fö","la"]
+			},
+			months: {
+				names: ["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember",""],
+				namesAbbr: ["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "it", "default", {
+	name: "it",
+	englishName: "Italian",
+	nativeName: "italiano",
+	language: "it",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ja", "default", {
+	name: "ja",
+	englishName: "Japanese",
+	nativeName: "日本語",
+	language: "ja",
+	numberFormat: {
+		NaN: "NaN (非数値)",
+		negativeInfinity: "-∞",
+		positiveInfinity: "+∞",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"西暦","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Japanese: {
+			name: "Japanese",
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "gg y/M/d",
+				D: "gg y'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "gg y'年'M'月'd'日' H:mm",
+				F: "gg y'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "gg y'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ko", "default", {
+	name: "ko",
+	englishName: "Korean",
+	nativeName: "한국어",
+	language: "ko",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "₩"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"서기","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "yyyy'년' M'월'"
+			}
+		},
+		Korean: {
+			name: "Korean",
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"단기","start":null,"offset":-2333}],
+			twoDigitYearMax: 4362,
+			patterns: {
+				d: "gg yyyy-MM-dd",
+				D: "gg yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "gg yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "gg yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "gg yyyy'년' M'월'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nl", "default", {
+	name: "nl",
+	englishName: "Dutch",
+	nativeName: "Nederlands",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "no", "default", {
+	name: "no",
+	englishName: "Norwegian",
+	nativeName: "norsk",
+	language: "no",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pl", "default", {
+	name: "pl",
+	englishName: "Polish",
+	nativeName: "polski",
+	language: "pl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nie jest liczbą",
+		negativeInfinity: "-nieskończoność",
+		positiveInfinity: "+nieskończoność",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "zł"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],
+				namesAbbr: ["N","Pn","Wt","Śr","Cz","Pt","So"],
+				namesShort: ["N","Pn","Wt","Śr","Cz","Pt","So"]
+			},
+			months: {
+				names: ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			monthsGenitive: {
+				names: ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pt", "default", {
+	name: "pt",
+	englishName: "Portuguese",
+	nativeName: "Português",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "R$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro",""],
+				namesAbbr: ["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "rm", "default", {
+	name: "rm",
+	englishName: "Romansh",
+	nativeName: "Rumantsch",
+	language: "rm",
+	numberFormat: {
+		",": "'",
+		NaN: "betg def.",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "+infinit",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],
+				namesAbbr: ["du","gli","ma","me","gie","ve","so"],
+				namesShort: ["du","gli","ma","me","gie","ve","so"]
+			},
+			months: {
+				names: ["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december",""],
+				namesAbbr: ["schan","favr","mars","avr","matg","zercl","fan","avust","sett","oct","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"s. Cr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d MMMM yyyy HH:mm",
+				F: "dddd, d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ro", "default", {
+	name: "ro",
+	englishName: "Romanian",
+	nativeName: "română",
+	language: "ro",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "lei"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],
+				namesAbbr: ["D","L","Ma","Mi","J","V","S"],
+				namesShort: ["D","L","Ma","Mi","J","V","S"]
+			},
+			months: {
+				names: ["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie",""],
+				namesAbbr: ["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ru", "default", {
+	name: "ru",
+	englishName: "Russian",
+	nativeName: "русский",
+	language: "ru",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],
+				namesAbbr: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			monthsGenitive: {
+				names: ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'г.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'г.' H:mm",
+				F: "d MMMM yyyy 'г.' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hr", "default", {
+	name: "hr",
+	englishName: "Croatian",
+	nativeName: "hrvatski",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kn"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sk", "default", {
+	name: "sk",
+	englishName: "Slovak",
+	nativeName: "slovenčina",
+	language: "sk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Nie je číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],
+				namesAbbr: ["ne","po","ut","st","št","pi","so"],
+				namesShort: ["ne","po","ut","st","št","pi","so"]
+			},
+			months: {
+				names: ["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sq", "default", {
+	name: "sq",
+	englishName: "Albanian",
+	nativeName: "shqipe",
+	language: "sq",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": ".",
+			".": ",",
+			symbol: "Lek"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],
+				namesAbbr: ["Die","Hën","Mar","Mër","Enj","Pre","Sht"],
+				namesShort: ["Di","Hë","Ma","Më","En","Pr","Sh"]
+			},
+			months: {
+				names: ["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor",""],
+				namesAbbr: ["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj",""]
+			},
+			AM: ["PD","pd","PD"],
+			PM: ["MD","md","MD"],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy-MM-dd",
+				t: "h:mm.tt",
+				T: "h:mm:ss.tt",
+				f: "yyyy-MM-dd h:mm.tt",
+				F: "yyyy-MM-dd h:mm:ss.tt",
+				Y: "yyyy-MM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sv", "default", {
+	name: "sv",
+	englishName: "Swedish",
+	nativeName: "svenska",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "th", "default", {
+	name: "th",
+	englishName: "Thai",
+	nativeName: "ไทย",
+	language: "th",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "฿"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "ThaiBuddhist",
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			eras: [{"name":"พ.ศ.","start":null,"offset":-543}],
+			twoDigitYearMax: 2572,
+			patterns: {
+				d: "d/M/yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "'วัน'dddd'ที่' d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "'วัน'dddd'ที่' d MMMM yyyy H:mm",
+				F: "'วัน'dddd'ที่' d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tr", "default", {
+	name: "tr",
+	englishName: "Turkish",
+	nativeName: "Türkçe",
+	language: "tr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "TL"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],
+				namesAbbr: ["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],
+				namesShort: ["Pz","Pt","Sa","Ça","Pe","Cu","Ct"]
+			},
+			months: {
+				names: ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık",""],
+				namesAbbr: ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ur", "default", {
+	name: "ur",
+	englishName: "Urdu",
+	nativeName: "اُردو",
+	language: "ur",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "Rs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesAbbr: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesShort: ["ا","پ","م","ب","ج","ج","ه"]
+			},
+			months: {
+				names: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""],
+				namesAbbr: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				f: "dd MMMM, yyyy h:mm tt",
+				F: "dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "id", "default", {
+	name: "id",
+	englishName: "Indonesian",
+	nativeName: "Bahasa Indonesia",
+	language: "id",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "Rp"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],
+				namesAbbr: ["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],
+				namesShort: ["M","S","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uk", "default", {
+	name: "uk",
+	englishName: "Ukrainian",
+	nativeName: "українська",
+	language: "uk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-безмежність",
+		positiveInfinity: "безмежність",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₴"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],
+				namesAbbr: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень",""],
+				namesAbbr: ["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру",""]
+			},
+			monthsGenitive: {
+				names: ["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня",""],
+				namesAbbr: ["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy' р.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy' р.' H:mm",
+				F: "d MMMM yyyy' р.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy' р.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "be", "default", {
+	name: "be",
+	englishName: "Belarusian",
+	nativeName: "Беларускі",
+	language: "be",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],
+				namesAbbr: ["нд","пн","аў","ср","чц","пт","сб"],
+				namesShort: ["нд","пн","аў","ср","чц","пт","сб"]
+			},
+			months: {
+				names: ["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			monthsGenitive: {
+				names: ["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sl", "default", {
+	name: "sl",
+	englishName: "Slovenian",
+	nativeName: "slovenski",
+	language: "sl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-neskončnost",
+		positiveInfinity: "neskončnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],
+				namesAbbr: ["ned","pon","tor","sre","čet","pet","sob"],
+				namesShort: ["ne","po","to","sr","če","pe","so"]
+			},
+			months: {
+				names: ["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "et", "default", {
+	name: "et",
+	englishName: "Estonian",
+	nativeName: "eesti",
+	language: "et",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "avaldamatu",
+		negativeInfinity: "miinuslõpmatus",
+		positiveInfinity: "plusslõpmatus",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],
+				namesAbbr: ["P","E","T","K","N","R","L"],
+				namesShort: ["P","E","T","K","N","R","L"]
+			},
+			months: {
+				names: ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember",""],
+				namesAbbr: ["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets",""]
+			},
+			AM: ["EL","el","EL"],
+			PM: ["PL","pl","PL"],
+			patterns: {
+				d: "d.MM.yyyy",
+				D: "d. MMMM yyyy'. a.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy'. a.' H:mm",
+				F: "d. MMMM yyyy'. a.' H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy'. a.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lv", "default", {
+	name: "lv",
+	englishName: "Latvian",
+	nativeName: "latviešu",
+	language: "lv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-bezgalība",
+		positiveInfinity: "bezgalība",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "Ls"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],
+				namesAbbr: ["sv","pr","ot","tr","ce","pk","se"],
+				namesShort: ["sv","pr","ot","tr","ce","pk","se"]
+			},
+			months: {
+				names: ["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			monthsGenitive: {
+				names: ["janvārī","februārī","martā","aprīlī","maijā","jūnijā","jūlijā","augustā","septembrī","oktobrī","novembrī","decembrī",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "dddd, yyyy'. gada 'd. MMMM",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy'. gada 'd. MMMM H:mm",
+				F: "dddd, yyyy'. gada 'd. MMMM H:mm:ss",
+				M: "d. MMMM",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lt", "default", {
+	name: "lt",
+	englishName: "Lithuanian",
+	nativeName: "lietuvių",
+	language: "lt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-begalybė",
+		positiveInfinity: "begalybė",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Lt"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],
+				namesAbbr: ["Sk","Pr","An","Tr","Kt","Pn","Št"],
+				namesShort: ["S","P","A","T","K","Pn","Š"]
+			},
+			months: {
+				names: ["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			monthsGenitive: {
+				names: ["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd",
+				D: "yyyy 'm.' MMMM d 'd.'",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'm.' MMMM d 'd.' HH:mm",
+				F: "yyyy 'm.' MMMM d 'd.' HH:mm:ss",
+				M: "MMMM d 'd.'",
+				Y: "yyyy 'm.' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tg", "default", {
+	name: "tg",
+	englishName: "Tajik",
+	nativeName: "Тоҷикӣ",
+	language: "tg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fa", "default", {
+	name: "fa",
+	englishName: "Persian",
+	nativeName: "فارسى",
+	language: "fa",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		currency: {
+			pattern: ["$n-","$ n"],
+			".": "/",
+			symbol: "ريال"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""],
+				namesAbbr: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy/MM/dd",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "yyyy/MM/dd hh:mm tt",
+				F: "yyyy/MM/dd hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "vi", "default", {
+	name: "vi",
+	englishName: "Vietnamese",
+	nativeName: "Tiếng Việt",
+	language: "vi",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "₫"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],
+				namesAbbr: ["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],
+				namesShort: ["C","H","B","T","N","S","B"]
+			},
+			months: {
+				names: ["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai",""],
+				namesAbbr: ["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12",""]
+			},
+			AM: ["SA","sa","SA"],
+			PM: ["CH","ch","CH"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				f: "dd MMMM yyyy h:mm tt",
+				F: "dd MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hy", "default", {
+	name: "hy",
+	englishName: "Armenian",
+	nativeName: "Հայերեն",
+	language: "hy",
+	numberFormat: {
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "դր."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],
+				namesAbbr: ["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],
+				namesShort: ["Կ","Ե","Ե","Չ","Հ","Ո","Շ"]
+			},
+			months: {
+				names: ["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր",""],
+				namesAbbr: ["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM, yyyy H:mm",
+				F: "d MMMM, yyyy H:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az", "default", {
+	name: "az",
+	englishName: "Azeri",
+	nativeName: "Azərbaycan­ılı",
+	language: "az",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "eu", "default", {
+	name: "eu",
+	englishName: "Basque",
+	nativeName: "euskara",
+	language: "eu",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "EdZ",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "Infinitu",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],
+				namesAbbr: ["ig.","al.","as.","az.","og.","or.","lr."],
+				namesShort: ["ig","al","as","az","og","or","lr"]
+			},
+			months: {
+				names: ["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua",""],
+				namesAbbr: ["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dddd, yyyy.'eko' MMMM'k 'd",
+				t: "HH:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy.'eko' MMMM'k 'd HH:mm",
+				F: "dddd, yyyy.'eko' MMMM'k 'd H:mm:ss",
+				Y: "yyyy.'eko' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hsb", "default", {
+	name: "hsb",
+	englishName: "Upper Sorbian",
+	nativeName: "hornjoserbšćina",
+	language: "hsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekónčne",
+		positiveInfinity: "+njekónčne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],
+				namesAbbr: ["nje","pón","wut","srj","štw","pja","sob"],
+				namesShort: ["n","p","w","s","š","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'hodź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'hodź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mk", "default", {
+	name: "mk",
+	englishName: "Macedonian (FYROM)",
+	nativeName: "македонски јазик",
+	language: "mk",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "ден."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недела","понеделник","вторник","среда","четврток","петок","сабота"],
+				namesAbbr: ["нед","пон","втр","срд","чет","пет","саб"],
+				namesShort: ["не","по","вт","ср","че","пе","са"]
+			},
+			months: {
+				names: ["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd MMMM yyyy HH:mm",
+				F: "dddd, dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tn", "default", {
+	name: "tn",
+	englishName: "Setswana",
+	nativeName: "Setswana",
+	language: "tn",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],
+				namesAbbr: ["Ltp.","Mos.","Lbd.","Lbr.","Lbn.","Lbt.","Lmt."],
+				namesShort: ["Lp","Ms","Lb","Lr","Ln","Lt","Lm"]
+			},
+			months: {
+				names: ["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole",""],
+				namesAbbr: ["Fer.","Tlhak.","Mop.","Mor.","Motsh.","Seet.","Phukw.","Phatw.","Lwets.","Diph.","Ngwan.","Sed.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "xh", "default", {
+	name: "xh",
+	englishName: "isiXhosa",
+	nativeName: "isiXhosa",
+	language: "xh",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesShort: ["Ca","Mv","Lb","Lt","Ln","Lh","Mg"]
+			},
+			months: {
+				names: ["Mqungu","Mdumba","Kwindla","Tshazimpuzi","Canzibe","Silimela","Khala","Thupha","Msintsi","Dwarha","Nkanga","Mnga",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zu", "default", {
+	name: "zu",
+	englishName: "isiZulu",
+	nativeName: "isiZulu",
+	language: "zu",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesAbbr: ["Son.","Mso.","Bi.","Tha.","Ne.","Hla.","Mgq."]
+			},
+			months: {
+				names: ["uMasingana","uNhlolanja","uNdasa","uMbaso","uNhlaba","uNhlangulana","uNtulikazi","uNcwaba","uMandulo","uMfumfu","uLwezi","uZibandlela",""],
+				namesAbbr: ["Mas.","Nhlo.","Nda.","Mba.","Nhla.","Nhlang.","Ntu.","Ncwa.","Man.","Mfu.","Lwe.","Zib.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "af", "default", {
+	name: "af",
+	englishName: "Afrikaans",
+	nativeName: "Afrikaans",
+	language: "af",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
+				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
+				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
+			},
+			months: {
+				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ka", "default", {
+	name: "ka",
+	englishName: "Georgian",
+	nativeName: "ქართული",
+	language: "ka",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Lari"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesAbbr: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesShort: ["კ","ო","ს","ო","ხ","პ","შ"]
+			},
+			months: {
+				names: ["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი",""],
+				namesAbbr: ["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'წლის' dd MM, dddd",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'წლის' dd MM, dddd H:mm",
+				F: "yyyy 'წლის' dd MM, dddd H:mm:ss",
+				M: "dd MM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fo", "default", {
+	name: "fo",
+	englishName: "Faroese",
+	nativeName: "føroyskt",
+	language: "fo",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],
+				namesAbbr: ["sun","mán","týs","mik","hós","frí","leyg"],
+				namesShort: ["su","má","tý","mi","hó","fr","ley"]
+			},
+			months: {
+				names: ["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hi", "default", {
+	name: "hi",
+	englishName: "Hindi",
+	nativeName: "हिंदी",
+	language: "hi",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mt", "default", {
+	name: "mt",
+	englishName: "Maltese",
+	nativeName: "Malti",
+	language: "mt",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],
+				namesAbbr: ["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],
+				namesShort: ["I","I","I","L","I","I","I"]
+			},
+			months: {
+				names: ["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru",""],
+				namesAbbr: ["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' ta\\' 'MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' ta\\' 'MMMM yyyy HH:mm",
+				F: "dddd, d' ta\\' 'MMMM yyyy HH:mm:ss",
+				M: "d' ta\\' 'MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "se", "default", {
+	name: "se",
+	englishName: "Sami (Northern)",
+	nativeName: "davvisámegiella",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ga", "default", {
+	name: "ga",
+	englishName: "Irish",
+	nativeName: "Gaeilge",
+	language: "ga",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],
+				namesAbbr: ["Domh","Luan","Máir","Céad","Déar","Aoi","Sath"],
+				namesShort: ["Do","Lu","Má","Cé","De","Ao","Sa"]
+			},
+			months: {
+				names: ["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig",""],
+				namesAbbr: ["Ean","Feabh","Már","Aib","Bealt","Meith","Iúil","Lún","M.Fómh","D.Fómh","Samh","Noll",""]
+			},
+			AM: ["r.n.","r.n.","R.N."],
+			PM: ["i.n.","i.n.","I.N."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ms", "default", {
+	name: "ms",
+	englishName: "Malay",
+	nativeName: "Bahasa Melayu",
+	language: "ms",
+	numberFormat: {
+		currency: {
+			decimals: 0,
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kk", "default", {
+	name: "kk",
+	englishName: "Kazakh",
+	nativeName: "Қазақ",
+	language: "kk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			",": " ",
+			".": "-",
+			symbol: "Т"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],
+				namesAbbr: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],
+				namesShort: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"]
+			},
+			months: {
+				names: ["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан",""],
+				namesAbbr: ["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'ж.' H:mm",
+				F: "d MMMM yyyy 'ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ky", "default", {
+	name: "ky",
+	englishName: "Kyrgyz",
+	nativeName: "Кыргыз",
+	language: "ky",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": "-",
+			symbol: "сом"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],
+				namesAbbr: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],
+				namesShort: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d'-'MMMM yyyy'-ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d'-'MMMM yyyy'-ж.' H:mm",
+				F: "d'-'MMMM yyyy'-ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy'-ж.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sw", "default", {
+	name: "sw",
+	englishName: "Kiswahili",
+	nativeName: "Kiswahili",
+	language: "sw",
+	numberFormat: {
+		currency: {
+			symbol: "S"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],
+				namesAbbr: ["Jumap.","Jumat.","Juman.","Jumat.","Alh.","Iju.","Jumam."],
+				namesShort: ["P","T","N","T","A","I","M"]
+			},
+			months: {
+				names: ["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Decemba",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec",""]
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tk", "default", {
+	name: "tk",
+	englishName: "Turkmen",
+	nativeName: "türkmençe",
+	language: "tk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-üznüksizlik",
+		positiveInfinity: "üznüksizlik",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "m."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],
+				namesAbbr: ["Db","Sb","Çb","Pb","An","Şb","Ýb"],
+				namesShort: ["D","S","Ç","P","A","Ş","Ý"]
+			},
+			months: {
+				names: ["Ýanwar","Fewral","Mart","Aprel","Maý","lýun","lýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr",""],
+				namesAbbr: ["Ýan","Few","Mart","Apr","Maý","lýun","lýul","Awg","Sen","Okt","Not","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "yyyy 'ý.' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'ý.' MMMM d H:mm",
+				F: "yyyy 'ý.' MMMM d H:mm:ss",
+				Y: "yyyy 'ý.' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz", "default", {
+	name: "uz",
+	englishName: "Uzbek",
+	nativeName: "U'zbek",
+	language: "uz",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tt", "default", {
+	name: "tt",
+	englishName: "Tatar",
+	nativeName: "Татар",
+	language: "tt",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],
+				namesAbbr: ["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],
+				namesShort: ["Я","Д","С","Ч","П","Җ","Ш"]
+			},
+			months: {
+				names: ["Гыйнвар","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Гыйн.","Фев.","Мар.","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Нояб.","Дек.",""]
+			},
+			monthsGenitive: {
+				names: ["Гыйнварның","Февральнең","Мартның","Апрельнең","Майның","Июньнең","Июльнең","Августның","Сентябрьның","Октябрьның","Ноябрьның","Декабрьның",""],
+				namesAbbr: ["Гыйн.-ның","Фев.-нең","Мар.-ның","Апр.-нең","Майның","Июньнең","Июльнең","Авг.-ның","Сен.-ның","Окт.-ның","Нояб.-ның","Дек.-ның",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bn", "default", {
+	name: "bn",
+	englishName: "Bengali",
+	nativeName: "বাংলা",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "টা"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pa", "default", {
+	name: "pa",
+	englishName: "Punjabi",
+	nativeName: "ਪੰਜਾਬੀ",
+	language: "pa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ਰੁ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],
+				namesAbbr: ["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁੱਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨਿੱਚਰ."],
+				namesShort: ["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"]
+			},
+			months: {
+				names: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""],
+				namesAbbr: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""]
+			},
+			AM: ["ਸਵੇਰ","ਸਵੇਰ","ਸਵੇਰ"],
+			PM: ["ਸ਼ਾਮ","ਸ਼ਾਮ","ਸ਼ਾਮ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy dddd",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "dd MMMM yyyy dddd tt hh:mm",
+				F: "dd MMMM yyyy dddd tt hh:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gu", "default", {
+	name: "gu",
+	englishName: "Gujarati",
+	nativeName: "ગુજરાતી",
+	language: "gu",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "રૂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],
+				namesAbbr: ["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],
+				namesShort: ["ર","સ","મ","બ","ગ","શ","શ"]
+			},
+			months: {
+				names: ["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર",""],
+				namesAbbr: ["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે",""]
+			},
+			AM: ["પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન"],
+			PM: ["ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "or", "default", {
+	name: "or",
+	englishName: "Oriya",
+	nativeName: "ଓଡ଼ିଆ",
+	language: "or",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ଟ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],
+				namesAbbr: ["ରବି.","ସୋମ.","ମଙ୍ଗଳ.","ବୁଧ.","ଗୁରୁ.","ଶୁକ୍ର.","ଶନି."],
+				namesShort: ["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"]
+			},
+			months: {
+				names: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""],
+				namesAbbr: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""]
+			},
+			eras: [{"name":"ଖ୍ରୀଷ୍ଟାବ୍ଦ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ta", "default", {
+	name: "ta",
+	englishName: "Tamil",
+	nativeName: "தமிழ்",
+	language: "ta",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ரூ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ஞாயிற்றுக்கிழமை","திங்கள்கிழமை","செவ்வாய்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],
+				namesAbbr: ["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],
+				namesShort: ["ஞா","தி","செ","பு","வி","வெ","ச"]
+			},
+			months: {
+				names: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""],
+				namesAbbr: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""]
+			},
+			AM: ["காலை","காலை","காலை"],
+			PM: ["மாலை","மாலை","மாலை"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "te", "default", {
+	name: "te",
+	englishName: "Telugu",
+	nativeName: "తెలుగు",
+	language: "te",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "రూ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],
+				namesAbbr: ["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],
+				namesShort: ["ఆ","సో","మం","బు","గు","శు","శ"]
+			},
+			months: {
+				names: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""],
+				namesAbbr: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""]
+			},
+			AM: ["పూర్వాహ్న","పూర్వాహ్న","పూర్వాహ్న"],
+			PM: ["అపరాహ్న","అపరాహ్న","అపరాహ్న"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kn", "default", {
+	name: "kn",
+	englishName: "Kannada",
+	nativeName: "ಕನ್ನಡ",
+	language: "kn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ರೂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],
+				namesAbbr: ["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],
+				namesShort: ["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"]
+			},
+			months: {
+				names: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""],
+				namesAbbr: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""]
+			},
+			AM: ["ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ"],
+			PM: ["ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ml", "default", {
+	name: "ml",
+	englishName: "Malayalam",
+	nativeName: "മലയാളം",
+	language: "ml",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ക"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["ഞായറാഴ്ച","തിങ്കളാഴ്ച","ചൊവ്വാഴ്ച","ബുധനാഴ്ച","വ്യാഴാഴ്ച","വെള്ളിയാഴ്ച","ശനിയാഴ്ച"],
+				namesAbbr: ["ഞായർ.","തിങ്കൾ.","ചൊവ്വ.","ബുധൻ.","വ്യാഴം.","വെള്ളി.","ശനി."],
+				namesShort: ["ഞ","ത","ച","ബ","വ","വെ","ശ"]
+			},
+			months: {
+				names: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""],
+				namesAbbr: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""]
+			},
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "as", "default", {
+	name: "as",
+	englishName: "Assamese",
+	nativeName: "অসমীয়া",
+	language: "as",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","n$"],
+			groupSizes: [3,2],
+			symbol: "ট"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্রবাৰ","শনিবাৰ","ৰবিবাৰ"],
+				namesAbbr: ["সোম.","মঙ্গল.","বুধ.","বৃহ.","শুক্র.","শনি.","ৰবি."],
+				namesShort: ["সো","ম","বু","বৃ","শু","শ","র"]
+			},
+			months: {
+				names: ["জানুৱাৰী","ফেব্রুৱাৰী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টেম্বর","অক্টোবর","নবেম্বর","ডিচেম্বর",""],
+				namesAbbr: ["জানু","ফেব্রু","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টে","অক্টো","নবে","ডিচে",""]
+			},
+			AM: ["ৰাতিপু","ৰাতিপু","ৰাতিপু"],
+			PM: ["আবেলি","আবেলি","আবেলি"],
+			eras: [{"name":"খ্রীষ্টাব্দ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "yyyy,MMMM dd, dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy,MMMM dd, dddd tt h:mm",
+				F: "yyyy,MMMM dd, dddd tt h:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM,yy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mr", "default", {
+	name: "mr",
+	englishName: "Marathi",
+	nativeName: "मराठी",
+	language: "mr",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर",""],
+				namesAbbr: ["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें.",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sa", "default", {
+	name: "sa",
+	englishName: "Sanskrit",
+	nativeName: "संस्कृत",
+	language: "sa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesAbbr: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn", "default", {
+	name: "mn",
+	englishName: "Mongolian",
+	nativeName: "Монгол хэл",
+	language: "mn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bo", "default", {
+	name: "bo",
+	englishName: "Tibetan",
+	nativeName: "བོད་ཡིག",
+	language: "bo",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ཨང་ཀི་མིན་པ།",
+		negativeInfinity: "མོ་གྲངས་ཚད་མེད་ཆུང་བ།",
+		positiveInfinity: "ཕོ་གྲངས་ཚད་མེད་ཆེ་བ།",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["གཟའ་ཉི་མ།","གཟའ་ཟླ་བ།","གཟའ་མིག་དམར།","གཟའ་ལྷག་པ།","གཟའ་ཕུར་བུ།","གཟའ་པ་སངས།","གཟའ་སྤེན་པ།"],
+				namesAbbr: ["ཉི་མ།","ཟླ་བ།","མིག་དམར།","ལྷག་པ།","ཕུར་བུ།","པ་སངས།","སྤེན་པ།"],
+				namesShort: ["༧","༡","༢","༣","༤","༥","༦"]
+			},
+			months: {
+				names: ["སྤྱི་ཟླ་དང་པོ།","སྤྱི་ཟླ་གཉིས་པ།","སྤྱི་ཟླ་གསུམ་པ།","སྤྱི་ཟླ་བཞི་པ།","སྤྱི་ཟླ་ལྔ་པ།","སྤྱི་ཟླ་དྲུག་པ།","སྤྱི་ཟླ་བདུན་པ།","སྤྱི་ཟླ་བརྒྱད་པ།","སྤྱི་ཟླ་དགུ་པ།","སྤྱི་ཟླ་བཅུ་པོ།","སྤྱི་ཟླ་བཅུ་གཅིག་པ།","སྤྱི་ཟླ་བཅུ་གཉིས་པ།",""],
+				namesAbbr: ["ཟླ་ ༡","ཟླ་ ༢","ཟླ་ ༣","ཟླ་ ༤","ཟླ་ ༥","ཟླ་ ༦","ཟླ་ ༧","ཟླ་ ༨","ཟླ་ ༩","ཟླ་ ༡༠","ཟླ་ ༡༡","ཟླ་ ༡༢",""]
+			},
+			AM: ["སྔ་དྲོ","སྔ་དྲོ","སྔ་དྲོ"],
+			PM: ["ཕྱི་དྲོ","ཕྱི་དྲོ","ཕྱི་དྲོ"],
+			eras: [{"name":"སྤྱི་ལོ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ལོའི་ཟླ' M'ཚེས' d",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm",
+				F: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm:ss",
+				M: "'ཟླ་' M'ཚེས'd",
+				Y: "yyyy.M"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "cy", "default", {
+	name: "cy",
+	englishName: "Welsh",
+	nativeName: "Cymraeg",
+	language: "cy",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],
+				namesAbbr: ["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],
+				namesShort: ["Su","Ll","Ma","Me","Ia","Gw","Sa"]
+			},
+			months: {
+				names: ["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr",""],
+				namesAbbr: ["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "km", "default", {
+	name: "km",
+	englishName: "Khmer",
+	nativeName: "ខ្មែរ",
+	language: "km",
+	numberFormat: {
+		pattern: ["- n"],
+		groupSizes: [3,0],
+		NaN: "NAN",
+		negativeInfinity: "-- អនន្ត",
+		positiveInfinity: "អនន្ត",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			symbol: "៛"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ថ្ងៃអាទិត្យ","ថ្ងៃច័ន្ទ","ថ្ងៃអង្គារ","ថ្ងៃពុធ","ថ្ងៃព្រហស្បតិ៍","ថ្ងៃសុក្រ","ថ្ងៃសៅរ៍"],
+				namesAbbr: ["អាទិ.","ច.","អ.","ពុ","ព្រហ.","សុ.","ស."],
+				namesShort: ["អា","ច","អ","ពុ","ព្","សុ","ស"]
+			},
+			months: {
+				names: ["មករា","កុម្ភៈ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ",""],
+				namesAbbr: ["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"មុនគ.ស.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy H:mm tt",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "'ថ្ងៃទី' dd 'ខែ' MM",
+				Y: "'ខែ' MM 'ឆ្នាំ' yyyy"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm tt",
+				F: "dddd, MMMM dd, yyyy HH:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lo", "default", {
+	name: "lo",
+	englishName: "Lao",
+	nativeName: "ລາວ",
+	language: "lo",
+	numberFormat: {
+		pattern: ["(n)"],
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["(n$)","n$"],
+			groupSizes: [3,0],
+			symbol: "₭"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],
+				namesAbbr: ["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],
+				namesShort: ["ອ","ຈ","ອ","ພ","ພ","ສ","ເ"]
+			},
+			months: {
+				names: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""],
+				namesAbbr: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""]
+			},
+			AM: ["ເຊົ້າ","ເຊົ້າ","ເຊົ້າ"],
+			PM: ["ແລງ","ແລງ","ແລງ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy H:mm tt",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gl", "default", {
+	name: "gl",
+	englishName: "Galician",
+	nativeName: "galego",
+	language: "gl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","luns","martes","mércores","xoves","venres","sábado"],
+				namesAbbr: ["dom","luns","mar","mér","xov","ven","sáb"],
+				namesShort: ["do","lu","ma","mé","xo","ve","sá"]
+			},
+			months: {
+				names: ["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro",""],
+				namesAbbr: ["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kok", "default", {
+	name: "kok",
+	englishName: "Konkani",
+	nativeName: "कोंकणी",
+	language: "kok",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],
+				namesAbbr: ["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],
+				namesShort: ["आ","स","म","ब","ब","स","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""],
+				namesAbbr: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "syr", "default", {
+	name: "syr",
+	englishName: "Syriac",
+	nativeName: "ܣܘܪܝܝܐ",
+	language: "syr",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],
+				namesAbbr: ["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],
+				namesShort: ["ܐ","ܒ","ܓ","ܕ","ܗ","ܥ","ܫ"]
+			},
+			months: {
+				names: ["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ",""],
+				namesAbbr: ["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ",""]
+			},
+			AM: ["ܩ.ܛ","ܩ.ܛ","ܩ.ܛ"],
+			PM: ["ܒ.ܛ","ܒ.ܛ","ܒ.ܛ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "si", "default", {
+	name: "si",
+	englishName: "Sinhala",
+	nativeName: "සිංහල",
+	language: "si",
+	numberFormat: {
+		groupSizes: [3,2],
+		negativeInfinity: "-අනන්තය",
+		positiveInfinity: "අනන්තය",
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "රු."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],
+				namesAbbr: ["ඉරිදා","සඳුදා","කුජදා","බුදදා","ගුරුදා","කිවිදා","ශනිදා"],
+				namesShort: ["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"]
+			},
+			months: {
+				names: ["ජනවාරි","පෙබරවාරි","මාර්තු","අ‌ප්‍රේල්","මැයි","ජූනි","ජූලි","අ‌ගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්",""],
+				namesAbbr: ["ජන.","පෙබ.","මාර්තු.","අප්‍රේල්.","මැයි.","ජූනි.","ජූලි.","අගෝ.","සැප්.","ඔක්.","නොවැ.","දෙසැ.",""]
+			},
+			AM: ["පෙ.ව.","පෙ.ව.","පෙ.ව."],
+			PM: ["ප.ව.","ප.ව.","ප.ව."],
+			eras: [{"name":"ක්‍රි.ව.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy MMMM' මස 'dd' වැනිදා 'dddd",
+				f: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm tt",
+				F: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm:ss tt",
+				Y: "yyyy MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu", "default", {
+	name: "iu",
+	englishName: "Inuktitut",
+	nativeName: "Inuktitut",
+	language: "iu",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "am", "default", {
+	name: "am",
+	englishName: "Amharic",
+	nativeName: "አማርኛ",
+	language: "am",
+	numberFormat: {
+		decimals: 1,
+		groupSizes: [3,0],
+		NaN: "NAN",
+		percent: {
+			pattern: ["-n%","n%"],
+			decimals: 1,
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			groupSizes: [3,0],
+			symbol: "ETB"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
+			},
+			months: {
+				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
+				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
+			},
+			AM: ["ጡዋት","ጡዋት","ጡዋት"],
+			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
+			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd '፣' MMMM d 'ቀን' yyyy",
+				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
+				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
+				M: "MMMM d ቀን",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tzm", "default", {
+	name: "tzm",
+	englishName: "Tamazight",
+	nativeName: "Tamazight",
+	language: "tzm",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ne", "default", {
+	name: "ne",
+	englishName: "Nepali",
+	nativeName: "नेपाली",
+	language: "ne",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["आइतवार","सोमवार","मङ्गलवार","बुधवार","बिहीवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],
+				namesShort: ["आ","सो","म","बु","बि","शु","श"]
+			},
+			months: {
+				names: ["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जून","जुलाई","अगस्त","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर",""],
+				namesAbbr: ["जन","फेब","मार्च","अप्रिल","मे","जून","जुलाई","अग","सेप्ट","अक्ट","नोभ","डिस",""]
+			},
+			AM: ["विहानी","विहानी","विहानी"],
+			PM: ["बेलुकी","बेलुकी","बेलुकी"],
+			eras: [{"name":"a.d.","start":null,"offset":0}],
+			patterns: {
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fy", "default", {
+	name: "fy",
+	englishName: "Frisian",
+	nativeName: "Frysk",
+	language: "fy",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],
+				namesAbbr: ["Sn","Mo","Ti","Wo","To","Fr","Sn"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["jannewaris","febrewaris","maart","april","maaie","juny","july","augustus","septimber","oktober","novimber","desimber",""],
+				namesAbbr: ["jann","febr","mrt","apr","maaie","jun","jul","aug","sept","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ps", "default", {
+	name: "ps",
+	englishName: "Pashto",
+	nativeName: "پښتو",
+	language: "ps",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": "،",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": "،",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			",": "٬",
+			".": "٫",
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښزمرى","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښ","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fil", "default", {
+	name: "fil",
+	englishName: "Filipino",
+	nativeName: "Filipino",
+	language: "fil",
+	numberFormat: {
+		currency: {
+			symbol: "PhP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Linggo","Lunes","Martes","Mierkoles","Huebes","Biernes","Sabado"],
+				namesAbbr: ["Lin","Lun","Mar","Mier","Hueb","Bier","Saba"],
+				namesShort: ["L","L","M","M","H","B","S"]
+			},
+			months: {
+				names: ["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septyembre","Oktubre","Nobyembre","Disyembre",""],
+				namesAbbr: ["En","Peb","Mar","Abr","Mayo","Hun","Hul","Agos","Sept","Okt","Nob","Dis",""]
+			},
+			eras: [{"name":"Anno Domini","start":null,"offset":0}]
+		}
+	}
+});
+
+Globalize.addCultureInfo( "dv", "default", {
+	name: "dv",
+	englishName: "Divehi",
+	nativeName: "ދިވެހިބަސް",
+	language: "dv",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["n $-","n $"],
+			symbol: "ރ."
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""],
+				namesAbbr: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd/MM/yyyy HH:mm",
+				F: "dd/MM/yyyy HH:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""],
+				namesAbbr: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"މީލާދީ","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yy",
+				D: "ddd, yyyy MMMM dd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "ddd, yyyy MMMM dd HH:mm",
+				F: "ddd, yyyy MMMM dd HH:mm:ss",
+				Y: "yyyy, MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ha", "default", {
+	name: "ha",
+	englishName: "Hausa",
+	nativeName: "Hausa",
+	language: "ha",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "yo", "default", {
+	name: "yo",
+	englishName: "Yoruba",
+	nativeName: "Yoruba",
+	language: "yo",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Osu kinni","Osu keji","Osu keta","Osu kerin","Osu karun","Osu kefa","Osu keje","Osu kejo","Osu kesan","Osu kewa","Osu kokanla","Osu keresi",""],
+				namesAbbr: ["kin.","kej.","ket.","ker.","kar.","kef.","kej.","kej.","kes.","kew.","kok.","ker.",""]
+			},
+			AM: ["Owuro","owuro","OWURO"],
+			PM: ["Ale","ale","ALE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "quz", "default", {
+	name: "quz",
+	englishName: "Quechua",
+	nativeName: "runasimi",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nso", "default", {
+	name: "nso",
+	englishName: "Sesotho sa Leboa",
+	nativeName: "Sesotho sa Leboa",
+	language: "nso",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],
+				namesAbbr: ["Lam","Moš","Lbb","Lbr","Lbn","Lbh","Mok"],
+				namesShort: ["L","M","L","L","L","L","M"]
+			},
+			months: {
+				names: ["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole",""],
+				namesAbbr: ["Pher","Hlak","Mop","Mor","Mos","Ngwat","Phup","Phat","Lew","Dip","Dib","Man",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ba", "default", {
+	name: "ba",
+	englishName: "Bashkir",
+	nativeName: "Башҡорт",
+	language: "ba",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ",",
+			symbol: "һ."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Йәкшәмбе","Дүшәмбе","Шишәмбе","Шаршамбы","Кесаҙна","Йома","Шәмбе"],
+				namesAbbr: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"],
+				namesShort: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"]
+			},
+			months: {
+				names: ["ғинуар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь",""],
+				namesAbbr: ["ғин","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy 'й'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'й' H:mm",
+				F: "d MMMM yyyy 'й' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lb", "default", {
+	name: "lb",
+	englishName: "Luxembourgish",
+	nativeName: "Lëtzebuergesch",
+	language: "lb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "n. num.",
+		negativeInfinity: "-onendlech",
+		positiveInfinity: "+onendlech",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],
+				namesAbbr: ["Son","Méi","Dën","Mët","Don","Fre","Sam"],
+				namesShort: ["So","Mé","Dë","Më","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kl", "default", {
+	name: "kl",
+	englishName: "Greenlandic",
+	nativeName: "kalaallisut",
+	language: "kl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			groupSizes: [3,0],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],
+				namesAbbr: ["sap","ata","mar","ping","sis","tal","arf"],
+				namesShort: ["sa","at","ma","pi","si","ta","ar"]
+			},
+			months: {
+				names: ["januari","februari","martsi","apriili","maaji","juni","juli","aggusti","septembari","oktobari","novembari","decembari",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ig", "default", {
+	name: "ig",
+	englishName: "Igbo",
+	nativeName: "Igbo",
+	language: "ig",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Onwa mbu","Onwa ibua","Onwa ato","Onwa ano","Onwa ise","Onwa isi","Onwa asa","Onwa asato","Onwa itolu","Onwa iri","Onwa iri n'ofu","Onwa iri n'ibua",""],
+				namesAbbr: ["mbu.","ibu.","ato.","ano.","ise","isi","asa","asa.","ito.","iri.","n'of.","n'ib.",""]
+			},
+			AM: ["Ututu","ututu","UTUTU"],
+			PM: ["Efifie","efifie","EFIFIE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ii", "default", {
+	name: "ii",
+	englishName: "Yi",
+	nativeName: "ꆈꌠꁱꂷ",
+	language: "ii",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ꌗꂷꀋꉬ",
+		negativeInfinity: "ꀄꊭꌐꀋꉆ",
+		positiveInfinity: "ꈤꇁꑖꀋꉬ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ꑭꆏꑍ","ꆏꊂ꒔","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],
+				namesAbbr: ["ꑭꆏ","ꆏ꒔","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],
+				namesShort: ["ꆏ","꒔","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"]
+			},
+			months: {
+				names: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""],
+				namesAbbr: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""]
+			},
+			AM: ["ꂵꆪꈌꈐ","ꂵꆪꈌꈐ","ꂵꆪꈌꈐ"],
+			PM: ["ꂵꆪꈌꉈ","ꂵꆪꈌꉈ","ꂵꆪꈌꉈ"],
+			eras: [{"name":"ꇬꑼ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ꈎ' M'ꆪ' d'ꑍ'",
+				t: "tt h:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ꈎ' M'ꆪ' d'ꑍ' tt h:mm",
+				F: "yyyy'ꈎ' M'ꆪ' d'ꑍ' H:mm:ss",
+				M: "M'ꆪ' d'ꑍ'",
+				Y: "yyyy'ꈎ' M'ꆪ'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "arn", "default", {
+	name: "arn",
+	englishName: "Mapudungun",
+	nativeName: "Mapudungun",
+	language: "arn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "moh", "default", {
+	name: "moh",
+	englishName: "Mohawk",
+	nativeName: "Kanien'kéha",
+	language: "moh",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Awentatokentì:ke","Awentataón'ke","Ratironhia'kehronòn:ke","Soséhne","Okaristiiáhne","Ronwaia'tanentaktonhne","Entákta"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["Tsothohrkó:Wa","Enniska","Enniskó:Wa","Onerahtókha","Onerahtohkó:Wa","Ohiari:Ha","Ohiarihkó:Wa","Seskéha","Seskehkó:Wa","Kenténha","Kentenhkó:Wa","Tsothóhrha",""]
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "br", "default", {
+	name: "br",
+	englishName: "Breton",
+	nativeName: "brezhoneg",
+	language: "br",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NkN",
+		negativeInfinity: "-Anfin",
+		positiveInfinity: "+Anfin",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],
+				namesAbbr: ["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],
+				namesShort: ["Su","Lu","Mz","Mc","Ya","Gw","Sa"]
+			},
+			months: {
+				names: ["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu",""],
+				namesAbbr: ["Gen.","C'hwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"g. J.-K.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ug", "default", {
+	name: "ug",
+	englishName: "Uyghur",
+	nativeName: "ئۇيغۇرچە",
+	language: "ug",
+	isRTL: true,
+	numberFormat: {
+		NaN: "سان ئەمەس",
+		negativeInfinity: "مەنپىي چەكسىزلىك",
+		positiveInfinity: "مۇسبەت چەكسىزلىك",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],
+				namesAbbr: ["يە","دۈ","سە","چا","پە","جۈ","شە"],
+				namesShort: ["ي","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""],
+				namesAbbr: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""]
+			},
+			AM: ["چۈشتىن بۇرۇن","چۈشتىن بۇرۇن","چۈشتىن بۇرۇن"],
+			PM: ["چۈشتىن كېيىن","چۈشتىن كېيىن","چۈشتىن كېيىن"],
+			eras: [{"name":"مىلادى","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-M-d",
+				D: "yyyy-'يىلى' MMMM d-'كۈنى،'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm",
+				F: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm:ss",
+				M: "MMMM d'-كۈنى'",
+				Y: "yyyy-'يىلى' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mi", "default", {
+	name: "mi",
+	englishName: "Maori",
+	nativeName: "Reo Māori",
+	language: "mi",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],
+				namesAbbr: ["Ta","Hi","Tū","Apa","Pa","Me","Ho"],
+				namesShort: ["Ta","Hi","Tū","Aa","Pa","Me","Ho"]
+			},
+			months: {
+				names: ["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngongoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea",""],
+				namesAbbr: ["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM, yyyy",
+				f: "dddd, dd MMMM, yyyy h:mm tt",
+				F: "dddd, dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM, yy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "oc", "default", {
+	name: "oc",
+	englishName: "Occitan",
+	nativeName: "Occitan",
+	language: "oc",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numeric",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "+Infinit",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],
+				namesAbbr: ["dim.","lun.","mar.","mèc.","jòu.","ven.","sab."],
+				namesShort: ["di","lu","ma","mè","jò","ve","sa"]
+			},
+			months: {
+				names: ["genier","febrier","març","abril","mai","junh","julh","agost","setembre","octobre","novembre","desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			monthsGenitive: {
+				names: ["de genier","de febrier","de març","d'abril","de mai","de junh","de julh","d'agost","de setembre","d'octobre","de novembre","de desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"après Jèsus-Crist","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd,' lo 'd MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd,' lo 'd MMMM' de 'yyyy HH:mm",
+				F: "dddd,' lo 'd MMMM' de 'yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "co", "default", {
+	name: "co",
+	englishName: "Corsican",
+	nativeName: "Corsu",
+	language: "co",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Mica numericu",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "+Infinitu",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumenica","luni","marti","mercuri","ghjovi","venderi","sabbatu"],
+				namesAbbr: ["dum.","lun.","mar.","mer.","ghj.","ven.","sab."],
+				namesShort: ["du","lu","ma","me","gh","ve","sa"]
+			},
+			months: {
+				names: ["ghjennaghju","ferraghju","marzu","aprile","maghju","ghjunghju","lugliu","aostu","settembre","ottobre","nuvembre","dicembre",""],
+				namesAbbr: ["ghje","ferr","marz","apri","magh","ghju","lugl","aost","sett","otto","nuve","dice",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"dopu J-C","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gsw", "default", {
+	name: "gsw",
+	englishName: "Alsatian",
+	nativeName: "Elsässisch",
+	language: "gsw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Ohne Nummer",
+		negativeInfinity: "-Unendlich",
+		positiveInfinity: "+Unendlich",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sundàà","Mondàà","Dienschdàà","Mittwuch","Dunnerschdàà","Fridàà","Sàmschdàà"],
+				namesAbbr: ["Su.","Mo.","Di.","Mi.","Du.","Fr.","Sà."],
+				namesShort: ["Su","Mo","Di","Mi","Du","Fr","Sà"]
+			},
+			months: {
+				names: ["Jänner","Feverje","März","Àpril","Mai","Jüni","Jüli","Augscht","September","Oktower","Nowember","Dezember",""],
+				namesAbbr: ["Jän.","Fev.","März","Apr.","Mai","Jüni","Jüli","Aug.","Sept.","Okt.","Now.","Dez.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"Vor J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sah", "default", {
+	name: "sah",
+	englishName: "Yakut",
+	nativeName: "саха",
+	language: "sah",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NAN",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "с."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],
+				namesAbbr: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"],
+				namesShort: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"]
+			},
+			months: {
+				names: ["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйа","Бэс ыйа","От ыйа","Атырдьах ыйа","Балаҕан ыйа","Алтынньы","Сэтинньи","Ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			monthsGenitive: {
+				names: ["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "MM.dd.yyyy",
+				D: "MMMM d yyyy 'с.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d yyyy 'с.' H:mm",
+				F: "MMMM d yyyy 'с.' H:mm:ss",
+				Y: "MMMM yyyy 'с.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "qut", "default", {
+	name: "qut",
+	englishName: "K'iche",
+	nativeName: "K'iche",
+	language: "qut",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["juq'ij","kaq'ij","oxq'ij","kajq'ij","joq'ij","waqq'ij","wuqq'ij"],
+				namesAbbr: ["juq","kaq","oxq","kajq","joq","waqq","wuqq"],
+				namesShort: ["ju","ka","ox","ka","jo","wa","wu"]
+			},
+			months: {
+				names: ["nab'e ik'","ukab' ik'","rox ik'","ukaj ik'","uro' ik'","uwaq ik'","uwuq ik'","uwajxaq ik'","ub'elej ik'","ulaj ik'","ujulaj ik'","ukab'laj ik'",""],
+				namesAbbr: ["nab'e","ukab","rox","ukaj","uro","uwaq","uwuq","uwajxaq","ub'elej","ulaj","ujulaj","ukab'laj",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "rw", "default", {
+	name: "rw",
+	englishName: "Kinyarwanda",
+	nativeName: "Kinyarwanda",
+	language: "rw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "RWF"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Ku cyumweru"],
+				namesAbbr: ["mbe.","kab.","gat.","kan.","gat.","gat.","cyu."],
+				namesShort: ["mb","ka","ga","ka","ga","ga","cy"]
+			},
+			months: {
+				names: ["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza",""],
+				namesAbbr: ["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukwa","Ugu","Uku",""]
+			},
+			AM: ["saa moya z.m.","saa moya z.m.","SAA MOYA Z.M."],
+			PM: ["saa moya z.n.","saa moya z.n.","SAA MOYA Z.N."],
+			eras: [{"name":"AD","start":null,"offset":0}]
+		}
+	}
+});
+
+Globalize.addCultureInfo( "wo", "default", {
+	name: "wo",
+	englishName: "Wolof",
+	nativeName: "Wolof",
+	language: "wo",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "XOF"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "prs", "default", {
+	name: "prs",
+	englishName: "Dari",
+	nativeName: "درى",
+	language: "prs",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 5,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 5,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gd", "default", {
+	name: "gd",
+	englishName: "Scottish Gaelic",
+	nativeName: "Gàidhlig",
+	language: "gd",
+	numberFormat: {
+		negativeInfinity: "-Neo-chrìochnachd",
+		positiveInfinity: "Neo-chrìochnachd",
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],
+				namesAbbr: ["Dòm","Lua","Mài","Cia","Ard","Hao","Sat"],
+				namesShort: ["D","L","M","C","A","H","S"]
+			},
+			months: {
+				names: ["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd",""],
+				namesAbbr: ["Fao","Gea","Màr","Gib","Cèi","Ògm","Iuc","Lùn","Sul","Dàm","Sam","Dùb",""]
+			},
+			AM: ["m","m","M"],
+			PM: ["f","f","F"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-SA", "default", {
+	name: "ar-SA",
+	englishName: "Arabic (Saudi Arabia)",
+	nativeName: "العربية (المملكة العربية السعودية)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bg-BG", "default", {
+	name: "bg-BG",
+	englishName: "Bulgarian (Bulgaria)",
+	nativeName: "български (България)",
+	language: "bg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "- безкрайност",
+		positiveInfinity: "+ безкрайност",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "лв."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],
+				namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"],
+				namesShort: ["н","п","в","с","ч","п","с"]
+			},
+			months: {
+				names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"след новата ера","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy 'г.'",
+				D: "dd MMMM yyyy 'г.'",
+				t: "HH:mm 'ч.'",
+				T: "HH:mm:ss 'ч.'",
+				f: "dd MMMM yyyy 'г.' HH:mm 'ч.'",
+				F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'",
+				M: "dd MMMM",
+				Y: "MMMM yyyy 'г.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ca-ES", "default", {
+	name: "ca-ES",
+	englishName: "Catalan (Catalan)",
+	nativeName: "català (català)",
+	language: "ca",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "Infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],
+				namesAbbr: ["dg.","dl.","dt.","dc.","dj.","dv.","ds."],
+				namesShort: ["dg","dl","dt","dc","dj","dv","ds"]
+			},
+			months: {
+				names: ["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre",""],
+				namesAbbr: ["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' / 'MMMM' / 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' / 'MMMM' / 'yyyy HH:mm",
+				F: "dddd, d' / 'MMMM' / 'yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' / 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-TW", "default", {
+	name: "zh-TW",
+	englishName: "Chinese (Traditional, Taiwan)",
+	nativeName: "中文(台灣)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "不是一個數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "NT$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"西元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt hh:mm",
+				F: "yyyy'年'M'月'd'日' tt hh:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Taiwan: {
+			name: "Taiwan",
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"","start":null,"offset":1911}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt hh:mm",
+				F: "yyyy'年'M'月'd'日' tt hh:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "cs-CZ", "default", {
+	name: "cs-CZ",
+	englishName: "Czech (Czech Republic)",
+	nativeName: "čeština (Česká republika)",
+	language: "cs",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Není číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Kč"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],
+				namesAbbr: ["ne","po","út","st","čt","pá","so"],
+				namesShort: ["ne","po","út","st","čt","pá","so"]
+			},
+			months: {
+				names: ["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["dop.","dop.","DOP."],
+			PM: ["odp.","odp.","ODP."],
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "da-DK", "default", {
+	name: "da-DK",
+	englishName: "Danish (Denmark)",
+	nativeName: "dansk (Danmark)",
+	language: "da",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-DE", "default", {
+	name: "de-DE",
+	englishName: "German (Germany)",
+	nativeName: "Deutsch (Deutschland)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "el-GR", "default", {
+	name: "el-GR",
+	englishName: "Greek (Greece)",
+	nativeName: "Ελληνικά (Ελλάδα)",
+	language: "el",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "μη αριθμός",
+		negativeInfinity: "-Άπειρο",
+		positiveInfinity: "Άπειρο",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],
+				namesAbbr: ["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],
+				namesShort: ["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"]
+			},
+			months: {
+				names: ["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			monthsGenitive: {
+				names: ["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			AM: ["πμ","πμ","ΠΜ"],
+			PM: ["μμ","μμ","ΜΜ"],
+			eras: [{"name":"μ.Χ.","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-US", "default", {
+	name: "en-US",
+	englishName: "English (United States)"
+});
+
+Globalize.addCultureInfo( "fi-FI", "default", {
+	name: "fi-FI",
+	englishName: "Finnish (Finland)",
+	nativeName: "suomi (Suomi)",
+	language: "fi",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],
+				namesAbbr: ["su","ma","ti","ke","to","pe","la"],
+				namesShort: ["su","ma","ti","ke","to","pe","la"]
+			},
+			months: {
+				names: ["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu",""],
+				namesAbbr: ["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM'ta 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM'ta 'yyyy H:mm",
+				F: "d. MMMM'ta 'yyyy H:mm:ss",
+				M: "d. MMMM'ta'",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-FR", "default", {
+	name: "fr-FR",
+	englishName: "French (France)",
+	nativeName: "français (France)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "he-IL", "default", {
+	name: "he-IL",
+	englishName: "Hebrew (Israel)",
+	nativeName: "עברית (ישראל)",
+	language: "he",
+	isRTL: true,
+	numberFormat: {
+		NaN: "לא מספר",
+		negativeInfinity: "אינסוף שלילי",
+		positiveInfinity: "אינסוף חיובי",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "₪"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר",""],
+				namesAbbr: ["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ",""]
+			},
+			eras: [{"name":"לספירה","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Hebrew: {
+			name: "Hebrew",
+			"/": " ",
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["א","ב","ג","ד","ה","ו","ש"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"],
+				namesAbbr: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"]
+			},
+			eras: [{"name":"C.E.","start":null,"offset":0}],
+			twoDigitYearMax: 5790,
+			patterns: {
+				d: "dd MMMM yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hu-HU", "default", {
+	name: "hu-HU",
+	englishName: "Hungarian (Hungary)",
+	nativeName: "magyar (Magyarország)",
+	language: "hu",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nem szám",
+		negativeInfinity: "negatív végtelen",
+		positiveInfinity: "végtelen",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Ft"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],
+				namesAbbr: ["V","H","K","Sze","Cs","P","Szo"],
+				namesShort: ["V","H","K","Sze","Cs","P","Szo"]
+			},
+			months: {
+				names: ["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december",""],
+				namesAbbr: ["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec.",""]
+			},
+			AM: ["de.","de.","DE."],
+			PM: ["du.","du.","DU."],
+			eras: [{"name":"i.sz.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "yyyy. MMMM d.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy. MMMM d. H:mm",
+				F: "yyyy. MMMM d. H:mm:ss",
+				M: "MMMM d.",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "is-IS", "default", {
+	name: "is-IS",
+	englishName: "Icelandic (Iceland)",
+	nativeName: "íslenska (Ísland)",
+	language: "is",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],
+				namesAbbr: ["sun.","mán.","þri.","mið.","fim.","fös.","lau."],
+				namesShort: ["su","má","þr","mi","fi","fö","la"]
+			},
+			months: {
+				names: ["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember",""],
+				namesAbbr: ["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "it-IT", "default", {
+	name: "it-IT",
+	englishName: "Italian (Italy)",
+	nativeName: "italiano (Italia)",
+	language: "it",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ja-JP", "default", {
+	name: "ja-JP",
+	englishName: "Japanese (Japan)",
+	nativeName: "日本語 (日本)",
+	language: "ja",
+	numberFormat: {
+		NaN: "NaN (非数値)",
+		negativeInfinity: "-∞",
+		positiveInfinity: "+∞",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"西暦","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Japanese: {
+			name: "Japanese",
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "gg y/M/d",
+				D: "gg y'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "gg y'年'M'月'd'日' H:mm",
+				F: "gg y'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "gg y'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ko-KR", "default", {
+	name: "ko-KR",
+	englishName: "Korean (Korea)",
+	nativeName: "한국어 (대한민국)",
+	language: "ko",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "₩"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"서기","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "yyyy'년' M'월'"
+			}
+		},
+		Korean: {
+			name: "Korean",
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"단기","start":null,"offset":-2333}],
+			twoDigitYearMax: 4362,
+			patterns: {
+				d: "gg yyyy-MM-dd",
+				D: "gg yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "gg yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "gg yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "gg yyyy'년' M'월'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nl-NL", "default", {
+	name: "nl-NL",
+	englishName: "Dutch (Netherlands)",
+	nativeName: "Nederlands (Nederland)",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nb-NO", "default", {
+	name: "nb-NO",
+	englishName: "Norwegian, Bokmål (Norway)",
+	nativeName: "norsk, bokmål (Norge)",
+	language: "nb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pl-PL", "default", {
+	name: "pl-PL",
+	englishName: "Polish (Poland)",
+	nativeName: "polski (Polska)",
+	language: "pl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nie jest liczbą",
+		negativeInfinity: "-nieskończoność",
+		positiveInfinity: "+nieskończoność",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "zł"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],
+				namesAbbr: ["N","Pn","Wt","Śr","Cz","Pt","So"],
+				namesShort: ["N","Pn","Wt","Śr","Cz","Pt","So"]
+			},
+			months: {
+				names: ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			monthsGenitive: {
+				names: ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pt-BR", "default", {
+	name: "pt-BR",
+	englishName: "Portuguese (Brazil)",
+	nativeName: "Português (Brasil)",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "R$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro",""],
+				namesAbbr: ["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "rm-CH", "default", {
+	name: "rm-CH",
+	englishName: "Romansh (Switzerland)",
+	nativeName: "Rumantsch (Svizra)",
+	language: "rm",
+	numberFormat: {
+		",": "'",
+		NaN: "betg def.",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "+infinit",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],
+				namesAbbr: ["du","gli","ma","me","gie","ve","so"],
+				namesShort: ["du","gli","ma","me","gie","ve","so"]
+			},
+			months: {
+				names: ["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december",""],
+				namesAbbr: ["schan","favr","mars","avr","matg","zercl","fan","avust","sett","oct","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"s. Cr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d MMMM yyyy HH:mm",
+				F: "dddd, d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ro-RO", "default", {
+	name: "ro-RO",
+	englishName: "Romanian (Romania)",
+	nativeName: "română (România)",
+	language: "ro",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "lei"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],
+				namesAbbr: ["D","L","Ma","Mi","J","V","S"],
+				namesShort: ["D","L","Ma","Mi","J","V","S"]
+			},
+			months: {
+				names: ["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie",""],
+				namesAbbr: ["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ru-RU", "default", {
+	name: "ru-RU",
+	englishName: "Russian (Russia)",
+	nativeName: "русский (Россия)",
+	language: "ru",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],
+				namesAbbr: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			monthsGenitive: {
+				names: ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'г.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'г.' H:mm",
+				F: "d MMMM yyyy 'г.' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hr-HR", "default", {
+	name: "hr-HR",
+	englishName: "Croatian (Croatia)",
+	nativeName: "hrvatski (Hrvatska)",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kn"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sk-SK", "default", {
+	name: "sk-SK",
+	englishName: "Slovak (Slovakia)",
+	nativeName: "slovenčina (Slovenská republika)",
+	language: "sk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Nie je číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],
+				namesAbbr: ["ne","po","ut","st","št","pi","so"],
+				namesShort: ["ne","po","ut","st","št","pi","so"]
+			},
+			months: {
+				names: ["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sq-AL", "default", {
+	name: "sq-AL",
+	englishName: "Albanian (Albania)",
+	nativeName: "shqipe (Shqipëria)",
+	language: "sq",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": ".",
+			".": ",",
+			symbol: "Lek"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],
+				namesAbbr: ["Die","Hën","Mar","Mër","Enj","Pre","Sht"],
+				namesShort: ["Di","Hë","Ma","Më","En","Pr","Sh"]
+			},
+			months: {
+				names: ["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor",""],
+				namesAbbr: ["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj",""]
+			},
+			AM: ["PD","pd","PD"],
+			PM: ["MD","md","MD"],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy-MM-dd",
+				t: "h:mm.tt",
+				T: "h:mm:ss.tt",
+				f: "yyyy-MM-dd h:mm.tt",
+				F: "yyyy-MM-dd h:mm:ss.tt",
+				Y: "yyyy-MM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sv-SE", "default", {
+	name: "sv-SE",
+	englishName: "Swedish (Sweden)",
+	nativeName: "svenska (Sverige)",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "th-TH", "default", {
+	name: "th-TH",
+	englishName: "Thai (Thailand)",
+	nativeName: "ไทย (ไทย)",
+	language: "th",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "฿"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "ThaiBuddhist",
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			eras: [{"name":"พ.ศ.","start":null,"offset":-543}],
+			twoDigitYearMax: 2572,
+			patterns: {
+				d: "d/M/yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "'วัน'dddd'ที่' d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "'วัน'dddd'ที่' d MMMM yyyy H:mm",
+				F: "'วัน'dddd'ที่' d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tr-TR", "default", {
+	name: "tr-TR",
+	englishName: "Turkish (Turkey)",
+	nativeName: "Türkçe (Türkiye)",
+	language: "tr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "TL"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],
+				namesAbbr: ["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],
+				namesShort: ["Pz","Pt","Sa","Ça","Pe","Cu","Ct"]
+			},
+			months: {
+				names: ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık",""],
+				namesAbbr: ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ur-PK", "default", {
+	name: "ur-PK",
+	englishName: "Urdu (Islamic Republic of Pakistan)",
+	nativeName: "اُردو (پاکستان)",
+	language: "ur",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "Rs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesAbbr: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesShort: ["ا","پ","م","ب","ج","ج","ه"]
+			},
+			months: {
+				names: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""],
+				namesAbbr: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				f: "dd MMMM, yyyy h:mm tt",
+				F: "dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "id-ID", "default", {
+	name: "id-ID",
+	englishName: "Indonesian (Indonesia)",
+	nativeName: "Bahasa Indonesia (Indonesia)",
+	language: "id",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "Rp"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],
+				namesAbbr: ["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],
+				namesShort: ["M","S","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uk-UA", "default", {
+	name: "uk-UA",
+	englishName: "Ukrainian (Ukraine)",
+	nativeName: "українська (Україна)",
+	language: "uk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-безмежність",
+		positiveInfinity: "безмежність",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₴"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],
+				namesAbbr: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень",""],
+				namesAbbr: ["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру",""]
+			},
+			monthsGenitive: {
+				names: ["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня",""],
+				namesAbbr: ["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy' р.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy' р.' H:mm",
+				F: "d MMMM yyyy' р.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy' р.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "be-BY", "default", {
+	name: "be-BY",
+	englishName: "Belarusian (Belarus)",
+	nativeName: "Беларускі (Беларусь)",
+	language: "be",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],
+				namesAbbr: ["нд","пн","аў","ср","чц","пт","сб"],
+				namesShort: ["нд","пн","аў","ср","чц","пт","сб"]
+			},
+			months: {
+				names: ["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			monthsGenitive: {
+				names: ["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sl-SI", "default", {
+	name: "sl-SI",
+	englishName: "Slovenian (Slovenia)",
+	nativeName: "slovenski (Slovenija)",
+	language: "sl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-neskončnost",
+		positiveInfinity: "neskončnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],
+				namesAbbr: ["ned","pon","tor","sre","čet","pet","sob"],
+				namesShort: ["ne","po","to","sr","če","pe","so"]
+			},
+			months: {
+				names: ["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "et-EE", "default", {
+	name: "et-EE",
+	englishName: "Estonian (Estonia)",
+	nativeName: "eesti (Eesti)",
+	language: "et",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "avaldamatu",
+		negativeInfinity: "miinuslõpmatus",
+		positiveInfinity: "plusslõpmatus",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],
+				namesAbbr: ["P","E","T","K","N","R","L"],
+				namesShort: ["P","E","T","K","N","R","L"]
+			},
+			months: {
+				names: ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember",""],
+				namesAbbr: ["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets",""]
+			},
+			AM: ["EL","el","EL"],
+			PM: ["PL","pl","PL"],
+			patterns: {
+				d: "d.MM.yyyy",
+				D: "d. MMMM yyyy'. a.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy'. a.' H:mm",
+				F: "d. MMMM yyyy'. a.' H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy'. a.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lv-LV", "default", {
+	name: "lv-LV",
+	englishName: "Latvian (Latvia)",
+	nativeName: "latviešu (Latvija)",
+	language: "lv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-bezgalība",
+		positiveInfinity: "bezgalība",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "Ls"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],
+				namesAbbr: ["sv","pr","ot","tr","ce","pk","se"],
+				namesShort: ["sv","pr","ot","tr","ce","pk","se"]
+			},
+			months: {
+				names: ["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			monthsGenitive: {
+				names: ["janvārī","februārī","martā","aprīlī","maijā","jūnijā","jūlijā","augustā","septembrī","oktobrī","novembrī","decembrī",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "dddd, yyyy'. gada 'd. MMMM",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy'. gada 'd. MMMM H:mm",
+				F: "dddd, yyyy'. gada 'd. MMMM H:mm:ss",
+				M: "d. MMMM",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lt-LT", "default", {
+	name: "lt-LT",
+	englishName: "Lithuanian (Lithuania)",
+	nativeName: "lietuvių (Lietuva)",
+	language: "lt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-begalybė",
+		positiveInfinity: "begalybė",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Lt"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],
+				namesAbbr: ["Sk","Pr","An","Tr","Kt","Pn","Št"],
+				namesShort: ["S","P","A","T","K","Pn","Š"]
+			},
+			months: {
+				names: ["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			monthsGenitive: {
+				names: ["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd",
+				D: "yyyy 'm.' MMMM d 'd.'",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'm.' MMMM d 'd.' HH:mm",
+				F: "yyyy 'm.' MMMM d 'd.' HH:mm:ss",
+				M: "MMMM d 'd.'",
+				Y: "yyyy 'm.' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tg-Cyrl-TJ", "default", {
+	name: "tg-Cyrl-TJ",
+	englishName: "Tajik (Cyrillic, Tajikistan)",
+	nativeName: "Тоҷикӣ (Тоҷикистон)",
+	language: "tg-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fa-IR", "default", {
+	name: "fa-IR",
+	englishName: "Persian",
+	nativeName: "فارسى (ایران)",
+	language: "fa",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		currency: {
+			pattern: ["$n-","$ n"],
+			".": "/",
+			symbol: "ريال"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""],
+				namesAbbr: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy/MM/dd",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "yyyy/MM/dd hh:mm tt",
+				F: "yyyy/MM/dd hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "vi-VN", "default", {
+	name: "vi-VN",
+	englishName: "Vietnamese (Vietnam)",
+	nativeName: "Tiếng Việt (Việt Nam)",
+	language: "vi",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "₫"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],
+				namesAbbr: ["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],
+				namesShort: ["C","H","B","T","N","S","B"]
+			},
+			months: {
+				names: ["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai",""],
+				namesAbbr: ["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12",""]
+			},
+			AM: ["SA","sa","SA"],
+			PM: ["CH","ch","CH"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				f: "dd MMMM yyyy h:mm tt",
+				F: "dd MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hy-AM", "default", {
+	name: "hy-AM",
+	englishName: "Armenian (Armenia)",
+	nativeName: "Հայերեն (Հայաստան)",
+	language: "hy",
+	numberFormat: {
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "դր."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],
+				namesAbbr: ["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],
+				namesShort: ["Կ","Ե","Ե","Չ","Հ","Ո","Շ"]
+			},
+			months: {
+				names: ["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր",""],
+				namesAbbr: ["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM, yyyy H:mm",
+				F: "d MMMM, yyyy H:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az-Latn-AZ", "default", {
+	name: "az-Latn-AZ",
+	englishName: "Azeri (Latin, Azerbaijan)",
+	nativeName: "Azərbaycan­ılı (Azərbaycan)",
+	language: "az-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "eu-ES", "default", {
+	name: "eu-ES",
+	englishName: "Basque (Basque)",
+	nativeName: "euskara (euskara)",
+	language: "eu",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "EdZ",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "Infinitu",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],
+				namesAbbr: ["ig.","al.","as.","az.","og.","or.","lr."],
+				namesShort: ["ig","al","as","az","og","or","lr"]
+			},
+			months: {
+				names: ["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua",""],
+				namesAbbr: ["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dddd, yyyy.'eko' MMMM'k 'd",
+				t: "HH:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy.'eko' MMMM'k 'd HH:mm",
+				F: "dddd, yyyy.'eko' MMMM'k 'd H:mm:ss",
+				Y: "yyyy.'eko' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hsb-DE", "default", {
+	name: "hsb-DE",
+	englishName: "Upper Sorbian (Germany)",
+	nativeName: "hornjoserbšćina (Němska)",
+	language: "hsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekónčne",
+		positiveInfinity: "+njekónčne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],
+				namesAbbr: ["nje","pón","wut","srj","štw","pja","sob"],
+				namesShort: ["n","p","w","s","š","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'hodź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'hodź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mk-MK", "default", {
+	name: "mk-MK",
+	englishName: "Macedonian (Former Yugoslav Republic of Macedonia)",
+	nativeName: "македонски јазик (Македонија)",
+	language: "mk",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "ден."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недела","понеделник","вторник","среда","четврток","петок","сабота"],
+				namesAbbr: ["нед","пон","втр","срд","чет","пет","саб"],
+				namesShort: ["не","по","вт","ср","че","пе","са"]
+			},
+			months: {
+				names: ["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd MMMM yyyy HH:mm",
+				F: "dddd, dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tn-ZA", "default", {
+	name: "tn-ZA",
+	englishName: "Setswana (South Africa)",
+	nativeName: "Setswana (Aforika Borwa)",
+	language: "tn",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],
+				namesAbbr: ["Ltp.","Mos.","Lbd.","Lbr.","Lbn.","Lbt.","Lmt."],
+				namesShort: ["Lp","Ms","Lb","Lr","Ln","Lt","Lm"]
+			},
+			months: {
+				names: ["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole",""],
+				namesAbbr: ["Fer.","Tlhak.","Mop.","Mor.","Motsh.","Seet.","Phukw.","Phatw.","Lwets.","Diph.","Ngwan.","Sed.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "xh-ZA", "default", {
+	name: "xh-ZA",
+	englishName: "isiXhosa (South Africa)",
+	nativeName: "isiXhosa (uMzantsi Afrika)",
+	language: "xh",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesShort: ["Ca","Mv","Lb","Lt","Ln","Lh","Mg"]
+			},
+			months: {
+				names: ["Mqungu","Mdumba","Kwindla","Tshazimpuzi","Canzibe","Silimela","Khala","Thupha","Msintsi","Dwarha","Nkanga","Mnga",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zu-ZA", "default", {
+	name: "zu-ZA",
+	englishName: "isiZulu (South Africa)",
+	nativeName: "isiZulu (iNingizimu Afrika)",
+	language: "zu",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesAbbr: ["Son.","Mso.","Bi.","Tha.","Ne.","Hla.","Mgq."]
+			},
+			months: {
+				names: ["uMasingana","uNhlolanja","uNdasa","uMbaso","uNhlaba","uNhlangulana","uNtulikazi","uNcwaba","uMandulo","uMfumfu","uLwezi","uZibandlela",""],
+				namesAbbr: ["Mas.","Nhlo.","Nda.","Mba.","Nhla.","Nhlang.","Ntu.","Ncwa.","Man.","Mfu.","Lwe.","Zib.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "af-ZA", "default", {
+	name: "af-ZA",
+	englishName: "Afrikaans (South Africa)",
+	nativeName: "Afrikaans (Suid Afrika)",
+	language: "af",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
+				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
+				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
+			},
+			months: {
+				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ka-GE", "default", {
+	name: "ka-GE",
+	englishName: "Georgian (Georgia)",
+	nativeName: "ქართული (საქართველო)",
+	language: "ka",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Lari"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesAbbr: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesShort: ["კ","ო","ს","ო","ხ","პ","შ"]
+			},
+			months: {
+				names: ["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი",""],
+				namesAbbr: ["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'წლის' dd MM, dddd",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'წლის' dd MM, dddd H:mm",
+				F: "yyyy 'წლის' dd MM, dddd H:mm:ss",
+				M: "dd MM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fo-FO", "default", {
+	name: "fo-FO",
+	englishName: "Faroese (Faroe Islands)",
+	nativeName: "føroyskt (Føroyar)",
+	language: "fo",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],
+				namesAbbr: ["sun","mán","týs","mik","hós","frí","leyg"],
+				namesShort: ["su","má","tý","mi","hó","fr","ley"]
+			},
+			months: {
+				names: ["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hi-IN", "default", {
+	name: "hi-IN",
+	englishName: "Hindi (India)",
+	nativeName: "हिंदी (भारत)",
+	language: "hi",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mt-MT", "default", {
+	name: "mt-MT",
+	englishName: "Maltese (Malta)",
+	nativeName: "Malti (Malta)",
+	language: "mt",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],
+				namesAbbr: ["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],
+				namesShort: ["I","I","I","L","I","I","I"]
+			},
+			months: {
+				names: ["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru",""],
+				namesAbbr: ["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' ta\\' 'MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' ta\\' 'MMMM yyyy HH:mm",
+				F: "dddd, d' ta\\' 'MMMM yyyy HH:mm:ss",
+				M: "d' ta\\' 'MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "se-NO", "default", {
+	name: "se-NO",
+	englishName: "Sami, Northern (Norway)",
+	nativeName: "davvisámegiella (Norga)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ms-MY", "default", {
+	name: "ms-MY",
+	englishName: "Malay (Malaysia)",
+	nativeName: "Bahasa Melayu (Malaysia)",
+	language: "ms",
+	numberFormat: {
+		currency: {
+			decimals: 0,
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kk-KZ", "default", {
+	name: "kk-KZ",
+	englishName: "Kazakh (Kazakhstan)",
+	nativeName: "Қазақ (Қазақстан)",
+	language: "kk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			",": " ",
+			".": "-",
+			symbol: "Т"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],
+				namesAbbr: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],
+				namesShort: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"]
+			},
+			months: {
+				names: ["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан",""],
+				namesAbbr: ["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'ж.' H:mm",
+				F: "d MMMM yyyy 'ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ky-KG", "default", {
+	name: "ky-KG",
+	englishName: "Kyrgyz (Kyrgyzstan)",
+	nativeName: "Кыргыз (Кыргызстан)",
+	language: "ky",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": "-",
+			symbol: "сом"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],
+				namesAbbr: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],
+				namesShort: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d'-'MMMM yyyy'-ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d'-'MMMM yyyy'-ж.' H:mm",
+				F: "d'-'MMMM yyyy'-ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy'-ж.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sw-KE", "default", {
+	name: "sw-KE",
+	englishName: "Kiswahili (Kenya)",
+	nativeName: "Kiswahili (Kenya)",
+	language: "sw",
+	numberFormat: {
+		currency: {
+			symbol: "S"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],
+				namesAbbr: ["Jumap.","Jumat.","Juman.","Jumat.","Alh.","Iju.","Jumam."],
+				namesShort: ["P","T","N","T","A","I","M"]
+			},
+			months: {
+				names: ["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Decemba",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec",""]
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tk-TM", "default", {
+	name: "tk-TM",
+	englishName: "Turkmen (Turkmenistan)",
+	nativeName: "türkmençe (Türkmenistan)",
+	language: "tk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-üznüksizlik",
+		positiveInfinity: "üznüksizlik",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "m."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],
+				namesAbbr: ["Db","Sb","Çb","Pb","An","Şb","Ýb"],
+				namesShort: ["D","S","Ç","P","A","Ş","Ý"]
+			},
+			months: {
+				names: ["Ýanwar","Fewral","Mart","Aprel","Maý","lýun","lýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr",""],
+				namesAbbr: ["Ýan","Few","Mart","Apr","Maý","lýun","lýul","Awg","Sen","Okt","Not","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "yyyy 'ý.' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'ý.' MMMM d H:mm",
+				F: "yyyy 'ý.' MMMM d H:mm:ss",
+				Y: "yyyy 'ý.' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz-Latn-UZ", "default", {
+	name: "uz-Latn-UZ",
+	englishName: "Uzbek (Latin, Uzbekistan)",
+	nativeName: "U'zbek (U'zbekiston Respublikasi)",
+	language: "uz-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tt-RU", "default", {
+	name: "tt-RU",
+	englishName: "Tatar (Russia)",
+	nativeName: "Татар (Россия)",
+	language: "tt",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],
+				namesAbbr: ["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],
+				namesShort: ["Я","Д","С","Ч","П","Җ","Ш"]
+			},
+			months: {
+				names: ["Гыйнвар","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Гыйн.","Фев.","Мар.","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Нояб.","Дек.",""]
+			},
+			monthsGenitive: {
+				names: ["Гыйнварның","Февральнең","Мартның","Апрельнең","Майның","Июньнең","Июльнең","Августның","Сентябрьның","Октябрьның","Ноябрьның","Декабрьның",""],
+				namesAbbr: ["Гыйн.-ның","Фев.-нең","Мар.-ның","Апр.-нең","Майның","Июньнең","Июльнең","Авг.-ның","Сен.-ның","Окт.-ның","Нояб.-ның","Дек.-ның",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bn-IN", "default", {
+	name: "bn-IN",
+	englishName: "Bengali (India)",
+	nativeName: "বাংলা (ভারত)",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "টা"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pa-IN", "default", {
+	name: "pa-IN",
+	englishName: "Punjabi (India)",
+	nativeName: "ਪੰਜਾਬੀ (ਭਾਰਤ)",
+	language: "pa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ਰੁ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],
+				namesAbbr: ["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁੱਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨਿੱਚਰ."],
+				namesShort: ["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"]
+			},
+			months: {
+				names: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""],
+				namesAbbr: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""]
+			},
+			AM: ["ਸਵੇਰ","ਸਵੇਰ","ਸਵੇਰ"],
+			PM: ["ਸ਼ਾਮ","ਸ਼ਾਮ","ਸ਼ਾਮ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy dddd",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "dd MMMM yyyy dddd tt hh:mm",
+				F: "dd MMMM yyyy dddd tt hh:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gu-IN", "default", {
+	name: "gu-IN",
+	englishName: "Gujarati (India)",
+	nativeName: "ગુજરાતી (ભારત)",
+	language: "gu",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "રૂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],
+				namesAbbr: ["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],
+				namesShort: ["ર","સ","મ","બ","ગ","શ","શ"]
+			},
+			months: {
+				names: ["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર",""],
+				namesAbbr: ["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે",""]
+			},
+			AM: ["પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન"],
+			PM: ["ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "or-IN", "default", {
+	name: "or-IN",
+	englishName: "Oriya (India)",
+	nativeName: "ଓଡ଼ିଆ (ଭାରତ)",
+	language: "or",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ଟ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],
+				namesAbbr: ["ରବି.","ସୋମ.","ମଙ୍ଗଳ.","ବୁଧ.","ଗୁରୁ.","ଶୁକ୍ର.","ଶନି."],
+				namesShort: ["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"]
+			},
+			months: {
+				names: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""],
+				namesAbbr: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""]
+			},
+			eras: [{"name":"ଖ୍ରୀଷ୍ଟାବ୍ଦ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ta-IN", "default", {
+	name: "ta-IN",
+	englishName: "Tamil (India)",
+	nativeName: "தமிழ் (இந்தியா)",
+	language: "ta",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ரூ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ஞாயிற்றுக்கிழமை","திங்கள்கிழமை","செவ்வாய்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],
+				namesAbbr: ["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],
+				namesShort: ["ஞா","தி","செ","பு","வி","வெ","ச"]
+			},
+			months: {
+				names: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""],
+				namesAbbr: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""]
+			},
+			AM: ["காலை","காலை","காலை"],
+			PM: ["மாலை","மாலை","மாலை"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "te-IN", "default", {
+	name: "te-IN",
+	englishName: "Telugu (India)",
+	nativeName: "తెలుగు (భారత దేశం)",
+	language: "te",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "రూ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],
+				namesAbbr: ["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],
+				namesShort: ["ఆ","సో","మం","బు","గు","శు","శ"]
+			},
+			months: {
+				names: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""],
+				namesAbbr: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""]
+			},
+			AM: ["పూర్వాహ్న","పూర్వాహ్న","పూర్వాహ్న"],
+			PM: ["అపరాహ్న","అపరాహ్న","అపరాహ్న"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kn-IN", "default", {
+	name: "kn-IN",
+	englishName: "Kannada (India)",
+	nativeName: "ಕನ್ನಡ (ಭಾರತ)",
+	language: "kn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ರೂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],
+				namesAbbr: ["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],
+				namesShort: ["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"]
+			},
+			months: {
+				names: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""],
+				namesAbbr: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""]
+			},
+			AM: ["ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ"],
+			PM: ["ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ml-IN", "default", {
+	name: "ml-IN",
+	englishName: "Malayalam (India)",
+	nativeName: "മലയാളം (ഭാരതം)",
+	language: "ml",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ക"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["ഞായറാഴ്ച","തിങ്കളാഴ്ച","ചൊവ്വാഴ്ച","ബുധനാഴ്ച","വ്യാഴാഴ്ച","വെള്ളിയാഴ്ച","ശനിയാഴ്ച"],
+				namesAbbr: ["ഞായർ.","തിങ്കൾ.","ചൊവ്വ.","ബുധൻ.","വ്യാഴം.","വെള്ളി.","ശനി."],
+				namesShort: ["ഞ","ത","ച","ബ","വ","വെ","ശ"]
+			},
+			months: {
+				names: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""],
+				namesAbbr: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""]
+			},
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "as-IN", "default", {
+	name: "as-IN",
+	englishName: "Assamese (India)",
+	nativeName: "অসমীয়া (ভাৰত)",
+	language: "as",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","n$"],
+			groupSizes: [3,2],
+			symbol: "ট"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্রবাৰ","শনিবাৰ","ৰবিবাৰ"],
+				namesAbbr: ["সোম.","মঙ্গল.","বুধ.","বৃহ.","শুক্র.","শনি.","ৰবি."],
+				namesShort: ["সো","ম","বু","বৃ","শু","শ","র"]
+			},
+			months: {
+				names: ["জানুৱাৰী","ফেব্রুৱাৰী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টেম্বর","অক্টোবর","নবেম্বর","ডিচেম্বর",""],
+				namesAbbr: ["জানু","ফেব্রু","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টে","অক্টো","নবে","ডিচে",""]
+			},
+			AM: ["ৰাতিপু","ৰাতিপু","ৰাতিপু"],
+			PM: ["আবেলি","আবেলি","আবেলি"],
+			eras: [{"name":"খ্রীষ্টাব্দ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "yyyy,MMMM dd, dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy,MMMM dd, dddd tt h:mm",
+				F: "yyyy,MMMM dd, dddd tt h:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM,yy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mr-IN", "default", {
+	name: "mr-IN",
+	englishName: "Marathi (India)",
+	nativeName: "मराठी (भारत)",
+	language: "mr",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर",""],
+				namesAbbr: ["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें.",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sa-IN", "default", {
+	name: "sa-IN",
+	englishName: "Sanskrit (India)",
+	nativeName: "संस्कृत (भारतम्)",
+	language: "sa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesAbbr: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn-MN", "default", {
+	name: "mn-MN",
+	englishName: "Mongolian (Cyrillic, Mongolia)",
+	nativeName: "Монгол хэл (Монгол улс)",
+	language: "mn-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bo-CN", "default", {
+	name: "bo-CN",
+	englishName: "Tibetan (PRC)",
+	nativeName: "བོད་ཡིག (ཀྲུང་ཧྭ་མི་དམངས་སྤྱི་མཐུན་རྒྱལ་ཁབ།)",
+	language: "bo",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ཨང་ཀི་མིན་པ།",
+		negativeInfinity: "མོ་གྲངས་ཚད་མེད་ཆུང་བ།",
+		positiveInfinity: "ཕོ་གྲངས་ཚད་མེད་ཆེ་བ།",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["གཟའ་ཉི་མ།","གཟའ་ཟླ་བ།","གཟའ་མིག་དམར།","གཟའ་ལྷག་པ།","གཟའ་ཕུར་བུ།","གཟའ་པ་སངས།","གཟའ་སྤེན་པ།"],
+				namesAbbr: ["ཉི་མ།","ཟླ་བ།","མིག་དམར།","ལྷག་པ།","ཕུར་བུ།","པ་སངས།","སྤེན་པ།"],
+				namesShort: ["༧","༡","༢","༣","༤","༥","༦"]
+			},
+			months: {
+				names: ["སྤྱི་ཟླ་དང་པོ།","སྤྱི་ཟླ་གཉིས་པ།","སྤྱི་ཟླ་གསུམ་པ།","སྤྱི་ཟླ་བཞི་པ།","སྤྱི་ཟླ་ལྔ་པ།","སྤྱི་ཟླ་དྲུག་པ།","སྤྱི་ཟླ་བདུན་པ།","སྤྱི་ཟླ་བརྒྱད་པ།","སྤྱི་ཟླ་དགུ་པ།","སྤྱི་ཟླ་བཅུ་པོ།","སྤྱི་ཟླ་བཅུ་གཅིག་པ།","སྤྱི་ཟླ་བཅུ་གཉིས་པ།",""],
+				namesAbbr: ["ཟླ་ ༡","ཟླ་ ༢","ཟླ་ ༣","ཟླ་ ༤","ཟླ་ ༥","ཟླ་ ༦","ཟླ་ ༧","ཟླ་ ༨","ཟླ་ ༩","ཟླ་ ༡༠","ཟླ་ ༡༡","ཟླ་ ༡༢",""]
+			},
+			AM: ["སྔ་དྲོ","སྔ་དྲོ","སྔ་དྲོ"],
+			PM: ["ཕྱི་དྲོ","ཕྱི་དྲོ","ཕྱི་དྲོ"],
+			eras: [{"name":"སྤྱི་ལོ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ལོའི་ཟླ' M'ཚེས' d",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm",
+				F: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm:ss",
+				M: "'ཟླ་' M'ཚེས'd",
+				Y: "yyyy.M"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "cy-GB", "default", {
+	name: "cy-GB",
+	englishName: "Welsh (United Kingdom)",
+	nativeName: "Cymraeg (y Deyrnas Unedig)",
+	language: "cy",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],
+				namesAbbr: ["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],
+				namesShort: ["Su","Ll","Ma","Me","Ia","Gw","Sa"]
+			},
+			months: {
+				names: ["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr",""],
+				namesAbbr: ["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "km-KH", "default", {
+	name: "km-KH",
+	englishName: "Khmer (Cambodia)",
+	nativeName: "ខ្មែរ (កម្ពុជា)",
+	language: "km",
+	numberFormat: {
+		pattern: ["- n"],
+		groupSizes: [3,0],
+		NaN: "NAN",
+		negativeInfinity: "-- អនន្ត",
+		positiveInfinity: "អនន្ត",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			symbol: "៛"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ថ្ងៃអាទិត្យ","ថ្ងៃច័ន្ទ","ថ្ងៃអង្គារ","ថ្ងៃពុធ","ថ្ងៃព្រហស្បតិ៍","ថ្ងៃសុក្រ","ថ្ងៃសៅរ៍"],
+				namesAbbr: ["អាទិ.","ច.","អ.","ពុ","ព្រហ.","សុ.","ស."],
+				namesShort: ["អា","ច","អ","ពុ","ព្","សុ","ស"]
+			},
+			months: {
+				names: ["មករា","កុម្ភៈ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ",""],
+				namesAbbr: ["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"មុនគ.ស.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy H:mm tt",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "'ថ្ងៃទី' dd 'ខែ' MM",
+				Y: "'ខែ' MM 'ឆ្នាំ' yyyy"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm tt",
+				F: "dddd, MMMM dd, yyyy HH:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lo-LA", "default", {
+	name: "lo-LA",
+	englishName: "Lao (Lao P.D.R.)",
+	nativeName: "ລາວ (ສ.ປ.ປ. ລາວ)",
+	language: "lo",
+	numberFormat: {
+		pattern: ["(n)"],
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["(n$)","n$"],
+			groupSizes: [3,0],
+			symbol: "₭"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],
+				namesAbbr: ["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],
+				namesShort: ["ອ","ຈ","ອ","ພ","ພ","ສ","ເ"]
+			},
+			months: {
+				names: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""],
+				namesAbbr: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""]
+			},
+			AM: ["ເຊົ້າ","ເຊົ້າ","ເຊົ້າ"],
+			PM: ["ແລງ","ແລງ","ແລງ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy H:mm tt",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gl-ES", "default", {
+	name: "gl-ES",
+	englishName: "Galician (Galician)",
+	nativeName: "galego (galego)",
+	language: "gl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","luns","martes","mércores","xoves","venres","sábado"],
+				namesAbbr: ["dom","luns","mar","mér","xov","ven","sáb"],
+				namesShort: ["do","lu","ma","mé","xo","ve","sá"]
+			},
+			months: {
+				names: ["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro",""],
+				namesAbbr: ["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kok-IN", "default", {
+	name: "kok-IN",
+	englishName: "Konkani (India)",
+	nativeName: "कोंकणी (भारत)",
+	language: "kok",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],
+				namesAbbr: ["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],
+				namesShort: ["आ","स","म","ब","ब","स","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""],
+				namesAbbr: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "syr-SY", "default", {
+	name: "syr-SY",
+	englishName: "Syriac (Syria)",
+	nativeName: "ܣܘܪܝܝܐ (سوريا)",
+	language: "syr",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],
+				namesAbbr: ["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],
+				namesShort: ["ܐ","ܒ","ܓ","ܕ","ܗ","ܥ","ܫ"]
+			},
+			months: {
+				names: ["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ",""],
+				namesAbbr: ["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ",""]
+			},
+			AM: ["ܩ.ܛ","ܩ.ܛ","ܩ.ܛ"],
+			PM: ["ܒ.ܛ","ܒ.ܛ","ܒ.ܛ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "si-LK", "default", {
+	name: "si-LK",
+	englishName: "Sinhala (Sri Lanka)",
+	nativeName: "සිංහල (ශ්‍රී ලංකා)",
+	language: "si",
+	numberFormat: {
+		groupSizes: [3,2],
+		negativeInfinity: "-අනන්තය",
+		positiveInfinity: "අනන්තය",
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "රු."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],
+				namesAbbr: ["ඉරිදා","සඳුදා","කුජදා","බුදදා","ගුරුදා","කිවිදා","ශනිදා"],
+				namesShort: ["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"]
+			},
+			months: {
+				names: ["ජනවාරි","පෙබරවාරි","මාර්තු","අ‌ප්‍රේල්","මැයි","ජූනි","ජූලි","අ‌ගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්",""],
+				namesAbbr: ["ජන.","පෙබ.","මාර්තු.","අප්‍රේල්.","මැයි.","ජූනි.","ජූලි.","අගෝ.","සැප්.","ඔක්.","නොවැ.","දෙසැ.",""]
+			},
+			AM: ["පෙ.ව.","පෙ.ව.","පෙ.ව."],
+			PM: ["ප.ව.","ප.ව.","ප.ව."],
+			eras: [{"name":"ක්‍රි.ව.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy MMMM' මස 'dd' වැනිදා 'dddd",
+				f: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm tt",
+				F: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm:ss tt",
+				Y: "yyyy MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu-Cans-CA", "default", {
+	name: "iu-Cans-CA",
+	englishName: "Inuktitut (Syllabics, Canada)",
+	nativeName: "ᐃᓄᒃᑎᑐᑦ (ᑲᓇᑕᒥ)",
+	language: "iu-Cans",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ᓈᑦᑏᖑᔭ","ᓇᒡᒐᔾᔭᐅ","ᐊᐃᑉᐱᖅ","ᐱᖓᑦᓯᖅ","ᓯᑕᒻᒥᖅ","ᑕᓪᓕᕐᒥᖅ","ᓯᕙᑖᕐᕕᒃ"],
+				namesAbbr: ["ᓈᑦᑏ","ᓇᒡᒐ","ᐊᐃᑉᐱ","ᐱᖓᑦᓯ","ᓯᑕ","ᑕᓪᓕ","ᓯᕙᑖᕐᕕᒃ"],
+				namesShort: ["ᓈ","ᓇ","ᐊ","ᐱ","ᓯ","ᑕ","ᓯ"]
+			},
+			months: {
+				names: ["ᔮᓐᓄᐊᕆ","ᕖᕝᕗᐊᕆ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌᓯ","ᓯᑎᐱᕆ","ᐅᑐᐱᕆ","ᓄᕕᐱᕆ","ᑎᓯᐱᕆ",""],
+				namesAbbr: ["ᔮᓐᓄ","ᕖᕝᕗ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌ","ᓯᑎᐱ","ᐅᑐᐱ","ᓄᕕᐱ","ᑎᓯᐱ",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd,MMMM dd,yyyy",
+				f: "dddd,MMMM dd,yyyy h:mm tt",
+				F: "dddd,MMMM dd,yyyy h:mm:ss tt",
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "am-ET", "default", {
+	name: "am-ET",
+	englishName: "Amharic (Ethiopia)",
+	nativeName: "አማርኛ (ኢትዮጵያ)",
+	language: "am",
+	numberFormat: {
+		decimals: 1,
+		groupSizes: [3,0],
+		NaN: "NAN",
+		percent: {
+			pattern: ["-n%","n%"],
+			decimals: 1,
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			groupSizes: [3,0],
+			symbol: "ETB"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
+			},
+			months: {
+				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
+				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
+			},
+			AM: ["ጡዋት","ጡዋት","ጡዋት"],
+			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
+			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd '፣' MMMM d 'ቀን' yyyy",
+				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
+				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
+				M: "MMMM d ቀን",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ne-NP", "default", {
+	name: "ne-NP",
+	englishName: "Nepali (Nepal)",
+	nativeName: "नेपाली (नेपाल)",
+	language: "ne",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["आइतवार","सोमवार","मङ्गलवार","बुधवार","बिहीवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],
+				namesShort: ["आ","सो","म","बु","बि","शु","श"]
+			},
+			months: {
+				names: ["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जून","जुलाई","अगस्त","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर",""],
+				namesAbbr: ["जन","फेब","मार्च","अप्रिल","मे","जून","जुलाई","अग","सेप्ट","अक्ट","नोभ","डिस",""]
+			},
+			AM: ["विहानी","विहानी","विहानी"],
+			PM: ["बेलुकी","बेलुकी","बेलुकी"],
+			eras: [{"name":"a.d.","start":null,"offset":0}],
+			patterns: {
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fy-NL", "default", {
+	name: "fy-NL",
+	englishName: "Frisian (Netherlands)",
+	nativeName: "Frysk (Nederlân)",
+	language: "fy",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],
+				namesAbbr: ["Sn","Mo","Ti","Wo","To","Fr","Sn"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["jannewaris","febrewaris","maart","april","maaie","juny","july","augustus","septimber","oktober","novimber","desimber",""],
+				namesAbbr: ["jann","febr","mrt","apr","maaie","jun","jul","aug","sept","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ps-AF", "default", {
+	name: "ps-AF",
+	englishName: "Pashto (Afghanistan)",
+	nativeName: "پښتو (افغانستان)",
+	language: "ps",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": "،",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": "،",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			",": "٬",
+			".": "٫",
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښزمرى","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښ","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fil-PH", "default", {
+	name: "fil-PH",
+	englishName: "Filipino (Philippines)",
+	nativeName: "Filipino (Pilipinas)",
+	language: "fil",
+	numberFormat: {
+		currency: {
+			symbol: "PhP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Linggo","Lunes","Martes","Mierkoles","Huebes","Biernes","Sabado"],
+				namesAbbr: ["Lin","Lun","Mar","Mier","Hueb","Bier","Saba"],
+				namesShort: ["L","L","M","M","H","B","S"]
+			},
+			months: {
+				names: ["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septyembre","Oktubre","Nobyembre","Disyembre",""],
+				namesAbbr: ["En","Peb","Mar","Abr","Mayo","Hun","Hul","Agos","Sept","Okt","Nob","Dis",""]
+			},
+			eras: [{"name":"Anno Domini","start":null,"offset":0}]
+		}
+	}
+});
+
+Globalize.addCultureInfo( "dv-MV", "default", {
+	name: "dv-MV",
+	englishName: "Divehi (Maldives)",
+	nativeName: "ދިވެހިބަސް (ދިވެހި ރާއްޖެ)",
+	language: "dv",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["n $-","n $"],
+			symbol: "ރ."
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""],
+				namesAbbr: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"ހިޖްރީ","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd/MM/yyyy HH:mm",
+				F: "dd/MM/yyyy HH:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""],
+				namesAbbr: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"މީލާދީ","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yy",
+				D: "ddd, yyyy MMMM dd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "ddd, yyyy MMMM dd HH:mm",
+				F: "ddd, yyyy MMMM dd HH:mm:ss",
+				Y: "yyyy, MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ha-Latn-NG", "default", {
+	name: "ha-Latn-NG",
+	englishName: "Hausa (Latin, Nigeria)",
+	nativeName: "Hausa (Nigeria)",
+	language: "ha-Latn",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "yo-NG", "default", {
+	name: "yo-NG",
+	englishName: "Yoruba (Nigeria)",
+	nativeName: "Yoruba (Nigeria)",
+	language: "yo",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Osu kinni","Osu keji","Osu keta","Osu kerin","Osu karun","Osu kefa","Osu keje","Osu kejo","Osu kesan","Osu kewa","Osu kokanla","Osu keresi",""],
+				namesAbbr: ["kin.","kej.","ket.","ker.","kar.","kef.","kej.","kej.","kes.","kew.","kok.","ker.",""]
+			},
+			AM: ["Owuro","owuro","OWURO"],
+			PM: ["Ale","ale","ALE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "quz-BO", "default", {
+	name: "quz-BO",
+	englishName: "Quechua (Bolivia)",
+	nativeName: "runasimi (Qullasuyu)",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nso-ZA", "default", {
+	name: "nso-ZA",
+	englishName: "Sesotho sa Leboa (South Africa)",
+	nativeName: "Sesotho sa Leboa (Afrika Borwa)",
+	language: "nso",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],
+				namesAbbr: ["Lam","Moš","Lbb","Lbr","Lbn","Lbh","Mok"],
+				namesShort: ["L","M","L","L","L","L","M"]
+			},
+			months: {
+				names: ["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole",""],
+				namesAbbr: ["Pher","Hlak","Mop","Mor","Mos","Ngwat","Phup","Phat","Lew","Dip","Dib","Man",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ba-RU", "default", {
+	name: "ba-RU",
+	englishName: "Bashkir (Russia)",
+	nativeName: "Башҡорт (Россия)",
+	language: "ba",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ",",
+			symbol: "һ."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Йәкшәмбе","Дүшәмбе","Шишәмбе","Шаршамбы","Кесаҙна","Йома","Шәмбе"],
+				namesAbbr: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"],
+				namesShort: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"]
+			},
+			months: {
+				names: ["ғинуар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь",""],
+				namesAbbr: ["ғин","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy 'й'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'й' H:mm",
+				F: "d MMMM yyyy 'й' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lb-LU", "default", {
+	name: "lb-LU",
+	englishName: "Luxembourgish (Luxembourg)",
+	nativeName: "Lëtzebuergesch (Luxembourg)",
+	language: "lb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "n. num.",
+		negativeInfinity: "-onendlech",
+		positiveInfinity: "+onendlech",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],
+				namesAbbr: ["Son","Méi","Dën","Mët","Don","Fre","Sam"],
+				namesShort: ["So","Mé","Dë","Më","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kl-GL", "default", {
+	name: "kl-GL",
+	englishName: "Greenlandic (Greenland)",
+	nativeName: "kalaallisut (Kalaallit Nunaat)",
+	language: "kl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			groupSizes: [3,0],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],
+				namesAbbr: ["sap","ata","mar","ping","sis","tal","arf"],
+				namesShort: ["sa","at","ma","pi","si","ta","ar"]
+			},
+			months: {
+				names: ["januari","februari","martsi","apriili","maaji","juni","juli","aggusti","septembari","oktobari","novembari","decembari",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ig-NG", "default", {
+	name: "ig-NG",
+	englishName: "Igbo (Nigeria)",
+	nativeName: "Igbo (Nigeria)",
+	language: "ig",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Onwa mbu","Onwa ibua","Onwa ato","Onwa ano","Onwa ise","Onwa isi","Onwa asa","Onwa asato","Onwa itolu","Onwa iri","Onwa iri n'ofu","Onwa iri n'ibua",""],
+				namesAbbr: ["mbu.","ibu.","ato.","ano.","ise","isi","asa","asa.","ito.","iri.","n'of.","n'ib.",""]
+			},
+			AM: ["Ututu","ututu","UTUTU"],
+			PM: ["Efifie","efifie","EFIFIE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ii-CN", "default", {
+	name: "ii-CN",
+	englishName: "Yi (PRC)",
+	nativeName: "ꆈꌠꁱꂷ (ꍏꉸꏓꂱꇭꉼꇩ)",
+	language: "ii",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ꌗꂷꀋꉬ",
+		negativeInfinity: "ꀄꊭꌐꀋꉆ",
+		positiveInfinity: "ꈤꇁꑖꀋꉬ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ꑭꆏꑍ","ꆏꊂ꒔","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],
+				namesAbbr: ["ꑭꆏ","ꆏ꒔","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],
+				namesShort: ["ꆏ","꒔","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"]
+			},
+			months: {
+				names: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""],
+				namesAbbr: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""]
+			},
+			AM: ["ꂵꆪꈌꈐ","ꂵꆪꈌꈐ","ꂵꆪꈌꈐ"],
+			PM: ["ꂵꆪꈌꉈ","ꂵꆪꈌꉈ","ꂵꆪꈌꉈ"],
+			eras: [{"name":"ꇬꑼ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ꈎ' M'ꆪ' d'ꑍ'",
+				t: "tt h:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ꈎ' M'ꆪ' d'ꑍ' tt h:mm",
+				F: "yyyy'ꈎ' M'ꆪ' d'ꑍ' H:mm:ss",
+				M: "M'ꆪ' d'ꑍ'",
+				Y: "yyyy'ꈎ' M'ꆪ'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "arn-CL", "default", {
+	name: "arn-CL",
+	englishName: "Mapudungun (Chile)",
+	nativeName: "Mapudungun (Chile)",
+	language: "arn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "moh-CA", "default", {
+	name: "moh-CA",
+	englishName: "Mohawk (Mohawk)",
+	nativeName: "Kanien'kéha",
+	language: "moh",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Awentatokentì:ke","Awentataón'ke","Ratironhia'kehronòn:ke","Soséhne","Okaristiiáhne","Ronwaia'tanentaktonhne","Entákta"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["Tsothohrkó:Wa","Enniska","Enniskó:Wa","Onerahtókha","Onerahtohkó:Wa","Ohiari:Ha","Ohiarihkó:Wa","Seskéha","Seskehkó:Wa","Kenténha","Kentenhkó:Wa","Tsothóhrha",""]
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "br-FR", "default", {
+	name: "br-FR",
+	englishName: "Breton (France)",
+	nativeName: "brezhoneg (Frañs)",
+	language: "br",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NkN",
+		negativeInfinity: "-Anfin",
+		positiveInfinity: "+Anfin",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],
+				namesAbbr: ["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],
+				namesShort: ["Su","Lu","Mz","Mc","Ya","Gw","Sa"]
+			},
+			months: {
+				names: ["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu",""],
+				namesAbbr: ["Gen.","C'hwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"g. J.-K.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ug-CN", "default", {
+	name: "ug-CN",
+	englishName: "Uyghur (PRC)",
+	nativeName: "ئۇيغۇرچە (جۇڭخۇا خەلق جۇمھۇرىيىتى)",
+	language: "ug",
+	isRTL: true,
+	numberFormat: {
+		NaN: "سان ئەمەس",
+		negativeInfinity: "مەنپىي چەكسىزلىك",
+		positiveInfinity: "مۇسبەت چەكسىزلىك",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],
+				namesAbbr: ["يە","دۈ","سە","چا","پە","جۈ","شە"],
+				namesShort: ["ي","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""],
+				namesAbbr: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""]
+			},
+			AM: ["چۈشتىن بۇرۇن","چۈشتىن بۇرۇن","چۈشتىن بۇرۇن"],
+			PM: ["چۈشتىن كېيىن","چۈشتىن كېيىن","چۈشتىن كېيىن"],
+			eras: [{"name":"مىلادى","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-M-d",
+				D: "yyyy-'يىلى' MMMM d-'كۈنى،'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm",
+				F: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm:ss",
+				M: "MMMM d'-كۈنى'",
+				Y: "yyyy-'يىلى' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mi-NZ", "default", {
+	name: "mi-NZ",
+	englishName: "Maori (New Zealand)",
+	nativeName: "Reo Māori (Aotearoa)",
+	language: "mi",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],
+				namesAbbr: ["Ta","Hi","Tū","Apa","Pa","Me","Ho"],
+				namesShort: ["Ta","Hi","Tū","Aa","Pa","Me","Ho"]
+			},
+			months: {
+				names: ["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngongoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea",""],
+				namesAbbr: ["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM, yyyy",
+				f: "dddd, dd MMMM, yyyy h:mm tt",
+				F: "dddd, dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM, yy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "oc-FR", "default", {
+	name: "oc-FR",
+	englishName: "Occitan (France)",
+	nativeName: "Occitan (França)",
+	language: "oc",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numeric",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "+Infinit",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],
+				namesAbbr: ["dim.","lun.","mar.","mèc.","jòu.","ven.","sab."],
+				namesShort: ["di","lu","ma","mè","jò","ve","sa"]
+			},
+			months: {
+				names: ["genier","febrier","març","abril","mai","junh","julh","agost","setembre","octobre","novembre","desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			monthsGenitive: {
+				names: ["de genier","de febrier","de març","d'abril","de mai","de junh","de julh","d'agost","de setembre","d'octobre","de novembre","de desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"après Jèsus-Crist","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd,' lo 'd MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd,' lo 'd MMMM' de 'yyyy HH:mm",
+				F: "dddd,' lo 'd MMMM' de 'yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "co-FR", "default", {
+	name: "co-FR",
+	englishName: "Corsican (France)",
+	nativeName: "Corsu (France)",
+	language: "co",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Mica numericu",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "+Infinitu",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumenica","luni","marti","mercuri","ghjovi","venderi","sabbatu"],
+				namesAbbr: ["dum.","lun.","mar.","mer.","ghj.","ven.","sab."],
+				namesShort: ["du","lu","ma","me","gh","ve","sa"]
+			},
+			months: {
+				names: ["ghjennaghju","ferraghju","marzu","aprile","maghju","ghjunghju","lugliu","aostu","settembre","ottobre","nuvembre","dicembre",""],
+				namesAbbr: ["ghje","ferr","marz","apri","magh","ghju","lugl","aost","sett","otto","nuve","dice",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"dopu J-C","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gsw-FR", "default", {
+	name: "gsw-FR",
+	englishName: "Alsatian (France)",
+	nativeName: "Elsässisch (Frànkrisch)",
+	language: "gsw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Ohne Nummer",
+		negativeInfinity: "-Unendlich",
+		positiveInfinity: "+Unendlich",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sundàà","Mondàà","Dienschdàà","Mittwuch","Dunnerschdàà","Fridàà","Sàmschdàà"],
+				namesAbbr: ["Su.","Mo.","Di.","Mi.","Du.","Fr.","Sà."],
+				namesShort: ["Su","Mo","Di","Mi","Du","Fr","Sà"]
+			},
+			months: {
+				names: ["Jänner","Feverje","März","Àpril","Mai","Jüni","Jüli","Augscht","September","Oktower","Nowember","Dezember",""],
+				namesAbbr: ["Jän.","Fev.","März","Apr.","Mai","Jüni","Jüli","Aug.","Sept.","Okt.","Now.","Dez.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"Vor J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sah-RU", "default", {
+	name: "sah-RU",
+	englishName: "Yakut (Russia)",
+	nativeName: "саха (Россия)",
+	language: "sah",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NAN",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "с."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],
+				namesAbbr: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"],
+				namesShort: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"]
+			},
+			months: {
+				names: ["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйа","Бэс ыйа","От ыйа","Атырдьах ыйа","Балаҕан ыйа","Алтынньы","Сэтинньи","Ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			monthsGenitive: {
+				names: ["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "MM.dd.yyyy",
+				D: "MMMM d yyyy 'с.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d yyyy 'с.' H:mm",
+				F: "MMMM d yyyy 'с.' H:mm:ss",
+				Y: "MMMM yyyy 'с.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "qut-GT", "default", {
+	name: "qut-GT",
+	englishName: "K'iche (Guatemala)",
+	nativeName: "K'iche (Guatemala)",
+	language: "qut",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["juq'ij","kaq'ij","oxq'ij","kajq'ij","joq'ij","waqq'ij","wuqq'ij"],
+				namesAbbr: ["juq","kaq","oxq","kajq","joq","waqq","wuqq"],
+				namesShort: ["ju","ka","ox","ka","jo","wa","wu"]
+			},
+			months: {
+				names: ["nab'e ik'","ukab' ik'","rox ik'","ukaj ik'","uro' ik'","uwaq ik'","uwuq ik'","uwajxaq ik'","ub'elej ik'","ulaj ik'","ujulaj ik'","ukab'laj ik'",""],
+				namesAbbr: ["nab'e","ukab","rox","ukaj","uro","uwaq","uwuq","uwajxaq","ub'elej","ulaj","ujulaj","ukab'laj",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "rw-RW", "default", {
+	name: "rw-RW",
+	englishName: "Kinyarwanda (Rwanda)",
+	nativeName: "Kinyarwanda (Rwanda)",
+	language: "rw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "RWF"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Ku cyumweru"],
+				namesAbbr: ["mbe.","kab.","gat.","kan.","gat.","gat.","cyu."],
+				namesShort: ["mb","ka","ga","ka","ga","ga","cy"]
+			},
+			months: {
+				names: ["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza",""],
+				namesAbbr: ["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukwa","Ugu","Uku",""]
+			},
+			AM: ["saa moya z.m.","saa moya z.m.","SAA MOYA Z.M."],
+			PM: ["saa moya z.n.","saa moya z.n.","SAA MOYA Z.N."],
+			eras: [{"name":"AD","start":null,"offset":0}]
+		}
+	}
+});
+
+Globalize.addCultureInfo( "wo-SN", "default", {
+	name: "wo-SN",
+	englishName: "Wolof (Senegal)",
+	nativeName: "Wolof (Sénégal)",
+	language: "wo",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "XOF"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "prs-AF", "default", {
+	name: "prs-AF",
+	englishName: "Dari (Afghanistan)",
+	nativeName: "درى (افغانستان)",
+	language: "prs",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 5,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 5,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gd-GB", "default", {
+	name: "gd-GB",
+	englishName: "Scottish Gaelic (United Kingdom)",
+	nativeName: "Gàidhlig (An Rìoghachd Aonaichte)",
+	language: "gd",
+	numberFormat: {
+		negativeInfinity: "-Neo-chrìochnachd",
+		positiveInfinity: "Neo-chrìochnachd",
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],
+				namesAbbr: ["Dòm","Lua","Mài","Cia","Ard","Hao","Sat"],
+				namesShort: ["D","L","M","C","A","H","S"]
+			},
+			months: {
+				names: ["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd",""],
+				namesAbbr: ["Fao","Gea","Màr","Gib","Cèi","Ògm","Iuc","Lùn","Sul","Dàm","Sam","Dùb",""]
+			},
+			AM: ["m","m","M"],
+			PM: ["f","f","F"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-IQ", "default", {
+	name: "ar-IQ",
+	englishName: "Arabic (Iraq)",
+	nativeName: "العربية (العراق)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.ع.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-CN", "default", {
+	name: "zh-CN",
+	englishName: "Chinese (Simplified, PRC)",
+	nativeName: "中文(中华人民共和国)",
+	language: "zh-CHS",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-CH", "default", {
+	name: "de-CH",
+	englishName: "German (Switzerland)",
+	nativeName: "Deutsch (Schweiz)",
+	language: "de",
+	numberFormat: {
+		",": "'",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "Fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-GB", "default", {
+	name: "en-GB",
+	englishName: "English (United Kingdom)",
+	nativeName: "English (United Kingdom)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-MX", "default", {
+	name: "es-MX",
+	englishName: "Spanish (Mexico)",
+	nativeName: "Español (México)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-BE", "default", {
+	name: "fr-BE",
+	englishName: "French (Belgium)",
+	nativeName: "français (Belgique)",
+	language: "fr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "it-CH", "default", {
+	name: "it-CH",
+	englishName: "Italian (Switzerland)",
+	nativeName: "italiano (Svizzera)",
+	language: "it",
+	numberFormat: {
+		",": "'",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nl-BE", "default", {
+	name: "nl-BE",
+	englishName: "Dutch (Belgium)",
+	nativeName: "Nederlands (België)",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Niet-een-getal)",
+		negativeInfinity: "-oneindig",
+		positiveInfinity: "oneindig",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nn-NO", "default", {
+	name: "nn-NO",
+	englishName: "Norwegian, Nynorsk (Norway)",
+	nativeName: "norsk, nynorsk (Noreg)",
+	language: "nn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],
+				namesAbbr: ["sø","må","ty","on","to","fr","la"],
+				namesShort: ["sø","må","ty","on","to","fr","la"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pt-PT", "default", {
+	name: "pt-PT",
+	englishName: "Portuguese (Portugal)",
+	nativeName: "português (Portugal)",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro",""],
+				namesAbbr: ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "d/M",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn-CS", "default", {
+	name: "sr-Latn-CS",
+	englishName: "Serbian (Latin, Serbia and Montenegro (Former))",
+	nativeName: "srpski (Srbija i Crna Gora (Prethodno))",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sv-FI", "default", {
+	name: "sv-FI",
+	englishName: "Swedish (Finland)",
+	nativeName: "svenska (Finland)",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az-Cyrl-AZ", "default", {
+	name: "az-Cyrl-AZ",
+	englishName: "Azeri (Cyrillic, Azerbaijan)",
+	nativeName: "Азәрбајҹан (Азәрбајҹан)",
+	language: "az-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "ман."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],
+				namesAbbr: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],
+				namesShort: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"]
+			},
+			months: {
+				names: ["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["јанвар","феврал","март","апрел","мај","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","мая","ијун","ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "dsb-DE", "default", {
+	name: "dsb-DE",
+	englishName: "Lower Sorbian (Germany)",
+	nativeName: "dolnoserbšćina (Nimska)",
+	language: "dsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekońcne",
+		positiveInfinity: "+njekońcne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njeźela","ponjeźele","wałtora","srjoda","stwortk","pětk","sobota"],
+				namesAbbr: ["nje","pon","wał","srj","stw","pět","sob"],
+				namesShort: ["n","p","w","s","s","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'goź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'goź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "se-SE", "default", {
+	name: "se-SE",
+	englishName: "Sami, Northern (Sweden)",
+	nativeName: "davvisámegiella (Ruoŧŧa)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","mánnodat","disdat","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","mán","dis","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ga-IE", "default", {
+	name: "ga-IE",
+	englishName: "Irish (Ireland)",
+	nativeName: "Gaeilge (Éire)",
+	language: "ga",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],
+				namesAbbr: ["Domh","Luan","Máir","Céad","Déar","Aoi","Sath"],
+				namesShort: ["Do","Lu","Má","Cé","De","Ao","Sa"]
+			},
+			months: {
+				names: ["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig",""],
+				namesAbbr: ["Ean","Feabh","Már","Aib","Bealt","Meith","Iúil","Lún","M.Fómh","D.Fómh","Samh","Noll",""]
+			},
+			AM: ["r.n.","r.n.","R.N."],
+			PM: ["i.n.","i.n.","I.N."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ms-BN", "default", {
+	name: "ms-BN",
+	englishName: "Malay (Brunei Darussalam)",
+	nativeName: "Bahasa Melayu (Brunei Darussalam)",
+	language: "ms",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz-Cyrl-UZ", "default", {
+	name: "uz-Cyrl-UZ",
+	englishName: "Uzbek (Cyrillic, Uzbekistan)",
+	nativeName: "Ўзбек (Ўзбекистон)",
+	language: "uz-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "сўм"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],
+				namesAbbr: ["якш","дш","сш","чш","пш","ж","ш"],
+				namesShort: ["я","д","с","ч","п","ж","ш"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","мая","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'йил' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'йил' d-MMMM HH:mm",
+				F: "yyyy 'йил' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bn-BD", "default", {
+	name: "bn-BD",
+	englishName: "Bengali (Bangladesh)",
+	nativeName: "বাংলা (বাংলাদেশ)",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "৳"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn-Mong-CN", "default", {
+	name: "mn-Mong-CN",
+	englishName: "Mongolian (Traditional Mongolian, PRC)",
+	nativeName: "ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ (ᠪᠦᠭᠦᠳᠡ ᠨᠠᠢᠷᠠᠮᠳᠠᠬᠤ ᠳᠤᠮᠳᠠᠳᠤ ᠠᠷᠠᠳ ᠣᠯᠣᠰ)",
+	language: "mn-Mong",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ᠲᠤᠭᠠᠠ ᠪᠤᠰᠤ",
+		negativeInfinity: "ᠰᠦᠬᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠡᠬᠡ",
+		positiveInfinity: "ᠡᠶ᠋ᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠠᠬᠡ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesAbbr: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesShort: ["ᠡ‍","ᠨᠢ‍","ᠬᠣ‍","ᠭᠤ‍","ᠳᠥ‍","ᠲᠠ‍","ᠵᠢ‍"]
+			},
+			months: {
+				names: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""],
+				namesAbbr: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ᠣᠨ ᠲᠣᠭᠠᠯᠠᠯ ᠤᠨ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm",
+				F: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm:ss",
+				M: "M'ᠰᠠᠷ᠎ᠠ' d'ᠡᠳᠦᠷ'",
+				Y: "yyyy'ᠣᠨ' M'ᠰᠠᠷ᠎ᠠ'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu-Latn-CA", "default", {
+	name: "iu-Latn-CA",
+	englishName: "Inuktitut (Latin, Canada)",
+	nativeName: "Inuktitut (Kanatami)",
+	language: "iu-Latn",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tzm-Latn-DZ", "default", {
+	name: "tzm-Latn-DZ",
+	englishName: "Tamazight (Latin, Algeria)",
+	nativeName: "Tamazight (Djazaïr)",
+	language: "tzm-Latn",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "quz-EC", "default", {
+	name: "quz-EC",
+	englishName: "Quechua (Ecuador)",
+	nativeName: "runasimi (Ecuador)",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-EG", "default", {
+	name: "ar-EG",
+	englishName: "Arabic (Egypt)",
+	nativeName: "العربية (مصر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ج.م.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-HK", "default", {
+	name: "zh-HK",
+	englishName: "Chinese (Traditional, Hong Kong S.A.R.)",
+	nativeName: "中文(香港特別行政區)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-AT", "default", {
+	name: "de-AT",
+	englishName: "German (Austria)",
+	nativeName: "Deutsch (Österreich)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd. MMMM yyyy HH:mm",
+				F: "dddd, dd. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-AU", "default", {
+	name: "en-AU",
+	englishName: "English (Australia)",
+	nativeName: "English (Australia)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-ES", "default", {
+	name: "es-ES",
+	englishName: "Spanish (Spain, International Sort)",
+	nativeName: "Español (España, alfabetización internacional)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-CA", "default", {
+	name: "fr-CA",
+	englishName: "French (Canada)",
+	nativeName: "français (Canada)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["(n $)","n $"],
+			",": " ",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl-CS", "default", {
+	name: "sr-Cyrl-CS",
+	englishName: "Serbian (Cyrillic, Serbia and Montenegro (Former))",
+	nativeName: "српски (Србија и Црна Гора (Претходно))",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "se-FI", "default", {
+	name: "se-FI",
+	englishName: "Sami, Northern (Finland)",
+	nativeName: "davvisámegiella (Suopma)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. b. 'yyyy H:mm",
+				F: "MMMM d'. b. 'yyyy H:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "quz-PE", "default", {
+	name: "quz-PE",
+	englishName: "Quechua (Peru)",
+	nativeName: "runasimi (Piruw)",
+	language: "quz",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			symbol: "S/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-LY", "default", {
+	name: "ar-LY",
+	englishName: "Arabic (Libya)",
+	nativeName: "العربية (ليبيا)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			decimals: 3,
+			symbol: "د.ل.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-SG", "default", {
+	name: "zh-SG",
+	englishName: "Chinese (Simplified, Singapore)",
+	nativeName: "中文(新加坡)",
+	language: "zh-CHS",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt h:mm",
+				F: "yyyy'年'M'月'd'日' tt h:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-LU", "default", {
+	name: "de-LU",
+	englishName: "German (Luxembourg)",
+	nativeName: "Deutsch (Luxemburg)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-CA", "default", {
+	name: "en-CA",
+	englishName: "English (Canada)",
+	nativeName: "English (Canada)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "MMMM-dd-yy",
+				f: "MMMM-dd-yy h:mm tt",
+				F: "MMMM-dd-yy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-GT", "default", {
+	name: "es-GT",
+	englishName: "Spanish (Guatemala)",
+	nativeName: "Español (Guatemala)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-CH", "default", {
+	name: "fr-CH",
+	englishName: "French (Switzerland)",
+	nativeName: "français (Suisse)",
+	language: "fr",
+	numberFormat: {
+		",": "'",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hr-BA", "default", {
+	name: "hr-BA",
+	englishName: "Croatian (Latin, Bosnia and Herzegovina)",
+	nativeName: "hrvatski (Bosna i Hercegovina)",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smj-NO", "default", {
+	name: "smj-NO",
+	englishName: "Sami, Lule (Norway)",
+	nativeName: "julevusámegiella (Vuodna)",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sådnåbiejvve","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["såd","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-DZ", "default", {
+	name: "ar-DZ",
+	englishName: "Arabic (Algeria)",
+	nativeName: "العربية (الجزائر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.ج.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-MO", "default", {
+	name: "zh-MO",
+	englishName: "Chinese (Traditional, Macao S.A.R.)",
+	nativeName: "中文(澳門特別行政區)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "MOP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-LI", "default", {
+	name: "de-LI",
+	englishName: "German (Liechtenstein)",
+	nativeName: "Deutsch (Liechtenstein)",
+	language: "de",
+	numberFormat: {
+		",": "'",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "CHF"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-NZ", "default", {
+	name: "en-NZ",
+	englishName: "English (New Zealand)",
+	nativeName: "English (New Zealand)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-CR", "default", {
+	name: "es-CR",
+	englishName: "Spanish (Costa Rica)",
+	nativeName: "Español (Costa Rica)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			",": ".",
+			".": ",",
+			symbol: "₡"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-LU", "default", {
+	name: "fr-LU",
+	englishName: "French (Luxembourg)",
+	nativeName: "français (Luxembourg)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs-Latn-BA", "default", {
+	name: "bs-Latn-BA",
+	englishName: "Bosnian (Latin, Bosnia and Herzegovina)",
+	nativeName: "bosanski (Bosna i Hercegovina)",
+	language: "bs-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smj-SE", "default", {
+	name: "smj-SE",
+	englishName: "Sami, Lule (Sweden)",
+	nativeName: "julevusámegiella (Svierik)",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["ájl","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["á","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-MA", "default", {
+	name: "ar-MA",
+	englishName: "Arabic (Morocco)",
+	nativeName: "العربية (المملكة المغربية)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.م.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-IE", "default", {
+	name: "en-IE",
+	englishName: "English (Ireland)",
+	nativeName: "English (Ireland)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-PA", "default", {
+	name: "es-PA",
+	englishName: "Spanish (Panama)",
+	nativeName: "Español (Panamá)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "B/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-MC", "default", {
+	name: "fr-MC",
+	englishName: "French (Monaco)",
+	nativeName: "français (Principauté de Monaco)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn-BA", "default", {
+	name: "sr-Latn-BA",
+	englishName: "Serbian (Latin, Bosnia and Herzegovina)",
+	nativeName: "srpski (Bosna i Hercegovina)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sma-NO", "default", {
+	name: "sma-NO",
+	englishName: "Sami, Southern (Norway)",
+	nativeName: "åarjelsaemiengiele (Nöörje)",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-TN", "default", {
+	name: "ar-TN",
+	englishName: "Arabic (Tunisia)",
+	nativeName: "العربية (تونس)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ت.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-ZA", "default", {
+	name: "en-ZA",
+	englishName: "English (South Africa)",
+	nativeName: "English (South Africa)",
+	numberFormat: {
+		",": " ",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " "
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-DO", "default", {
+	name: "es-DO",
+	englishName: "Spanish (Dominican Republic)",
+	nativeName: "Español (República Dominicana)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "RD$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl-BA", "default", {
+	name: "sr-Cyrl-BA",
+	englishName: "Serbian (Cyrillic, Bosnia and Herzegovina)",
+	nativeName: "српски (Босна и Херцеговина)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sma-SE", "default", {
+	name: "sma-SE",
+	englishName: "Sami, Southern (Sweden)",
+	nativeName: "åarjelsaemiengiele (Sveerje)",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-OM", "default", {
+	name: "ar-OM",
+	englishName: "Arabic (Oman)",
+	nativeName: "العربية (عمان)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "ر.ع.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-JM", "default", {
+	name: "en-JM",
+	englishName: "English (Jamaica)",
+	nativeName: "English (Jamaica)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "J$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-VE", "default", {
+	name: "es-VE",
+	englishName: "Spanish (Bolivarian Republic of Venezuela)",
+	nativeName: "Español (Republica Bolivariana de Venezuela)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "Bs. F."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs-Cyrl-BA", "default", {
+	name: "bs-Cyrl-BA",
+	englishName: "Bosnian (Cyrillic, Bosnia and Herzegovina)",
+	nativeName: "босански (Босна и Херцеговина)",
+	language: "bs-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sms-FI", "default", {
+	name: "sms-FI",
+	englishName: "Sami, Skolt (Finland)",
+	nativeName: "sääm´ǩiõll (Lää´ddjânnam)",
+	language: "sms",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],
+				namesAbbr: ["pâ","vu","mâ","se","ne","pi","su"],
+				namesShort: ["p","v","m","s","n","p","s"]
+			},
+			months: {
+				names: ["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			monthsGenitive: {
+				names: ["ođđee´jjmannu","tä´lvvmannu","pâ´zzlâšttammannu","njuhččmannu","vue´ssmannu","ǩie´ssmannu","suei´nnmannu","på´rǧǧmannu","čõhččmannu","kålggmannu","skamm´mannu","rosttovmannu",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-YE", "default", {
+	name: "ar-YE",
+	englishName: "Arabic (Yemen)",
+	nativeName: "العربية (اليمن)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.ي.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-029", "default", {
+	name: "en-029",
+	englishName: "English (Caribbean)",
+	nativeName: "English (Caribbean)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "MM/dd/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-CO", "default", {
+	name: "es-CO",
+	englishName: "Spanish (Colombia)",
+	nativeName: "Español (Colombia)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn-RS", "default", {
+	name: "sr-Latn-RS",
+	englishName: "Serbian (Latin, Serbia)",
+	nativeName: "srpski (Srbija)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smn-FI", "default", {
+	name: "smn-FI",
+	englishName: "Sami, Inari (Finland)",
+	nativeName: "sämikielâ (Suomâ)",
+	language: "smn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],
+				namesAbbr: ["pa","vu","ma","ko","tu","vá","lá"],
+				namesShort: ["p","v","m","k","t","v","l"]
+			},
+			months: {
+				names: ["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu",""],
+				namesAbbr: ["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-SY", "default", {
+	name: "ar-SY",
+	englishName: "Arabic (Syria)",
+	nativeName: "العربية (سوريا)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-BZ", "default", {
+	name: "en-BZ",
+	englishName: "English (Belize)",
+	nativeName: "English (Belize)",
+	numberFormat: {
+		currency: {
+			groupSizes: [3,0],
+			symbol: "BZ$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd MMMM yyyy hh:mm tt",
+				F: "dddd, dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-PE", "default", {
+	name: "es-PE",
+	englishName: "Spanish (Peru)",
+	nativeName: "Español (Perú)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["$ -n","$ n"],
+			symbol: "S/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl-RS", "default", {
+	name: "sr-Cyrl-RS",
+	englishName: "Serbian (Cyrillic, Serbia)",
+	nativeName: "српски (Србија)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-JO", "default", {
+	name: "ar-JO",
+	englishName: "Arabic (Jordan)",
+	nativeName: "العربية (الأردن)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ا.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-TT", "default", {
+	name: "en-TT",
+	englishName: "English (Trinidad and Tobago)",
+	nativeName: "English (Trinidad y Tobago)",
+	numberFormat: {
+		currency: {
+			groupSizes: [3,0],
+			symbol: "TT$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd MMMM yyyy hh:mm tt",
+				F: "dddd, dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-AR", "default", {
+	name: "es-AR",
+	englishName: "Spanish (Argentina)",
+	nativeName: "Español (Argentina)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn-ME", "default", {
+	name: "sr-Latn-ME",
+	englishName: "Serbian (Latin, Montenegro)",
+	nativeName: "srpski (Crna Gora)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-LB", "default", {
+	name: "ar-LB",
+	englishName: "Arabic (Lebanon)",
+	nativeName: "العربية (لبنان)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.ل.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-ZW", "default", {
+	name: "en-ZW",
+	englishName: "English (Zimbabwe)",
+	nativeName: "English (Zimbabwe)",
+	numberFormat: {
+		currency: {
+			symbol: "Z$"
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-EC", "default", {
+	name: "es-EC",
+	englishName: "Spanish (Ecuador)",
+	nativeName: "Español (Ecuador)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl-ME", "default", {
+	name: "sr-Cyrl-ME",
+	englishName: "Serbian (Cyrillic, Montenegro)",
+	nativeName: "српски (Црна Гора)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-KW", "default", {
+	name: "ar-KW",
+	englishName: "Arabic (Kuwait)",
+	nativeName: "العربية (الكويت)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ك.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-PH", "default", {
+	name: "en-PH",
+	englishName: "English (Republic of the Philippines)",
+	nativeName: "English (Philippines)",
+	numberFormat: {
+		currency: {
+			symbol: "Php"
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-CL", "default", {
+	name: "es-CL",
+	englishName: "Spanish (Chile)",
+	nativeName: "Español (Chile)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-AE", "default", {
+	name: "ar-AE",
+	englishName: "Arabic (U.A.E.)",
+	nativeName: "العربية (الإمارات العربية المتحدة)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.إ.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-UY", "default", {
+	name: "es-UY",
+	englishName: "Spanish (Uruguay)",
+	nativeName: "Español (Uruguay)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$U"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-BH", "default", {
+	name: "ar-BH",
+	englishName: "Arabic (Bahrain)",
+	nativeName: "العربية (البحرين)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ب.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-PY", "default", {
+	name: "es-PY",
+	englishName: "Spanish (Paraguay)",
+	nativeName: "Español (Paraguay)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "Gs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-QA", "default", {
+	name: "ar-QA",
+	englishName: "Arabic (Qatar)",
+	nativeName: "العربية (قطر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.ق.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-IN", "default", {
+	name: "en-IN",
+	englishName: "English (India)",
+	nativeName: "English (India)",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "Rs."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-BO", "default", {
+	name: "es-BO",
+	englishName: "Spanish (Bolivia)",
+	nativeName: "Español (Bolivia)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-MY", "default", {
+	name: "en-MY",
+	englishName: "English (Malaysia)",
+	nativeName: "English (Malaysia)",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM, yyyy",
+				f: "dddd, d MMMM, yyyy h:mm tt",
+				F: "dddd, d MMMM, yyyy h:mm:ss tt",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-SV", "default", {
+	name: "es-SV",
+	englishName: "Spanish (El Salvador)",
+	nativeName: "Español (El Salvador)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-SG", "default", {
+	name: "en-SG",
+	englishName: "English (Singapore)",
+	nativeName: "English (Singapore)",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM, yyyy",
+				f: "dddd, d MMMM, yyyy h:mm tt",
+				F: "dddd, d MMMM, yyyy h:mm:ss tt",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-HN", "default", {
+	name: "es-HN",
+	englishName: "Spanish (Honduras)",
+	nativeName: "Español (Honduras)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			symbol: "L."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-NI", "default", {
+	name: "es-NI",
+	englishName: "Spanish (Nicaragua)",
+	nativeName: "Español (Nicaragua)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			groupSizes: [3,0],
+			symbol: "C$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-PR", "default", {
+	name: "es-PR",
+	englishName: "Spanish (Puerto Rico)",
+	nativeName: "Español (Puerto Rico)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-US", "default", {
+	name: "es-US",
+	englishName: "Spanish (United States)",
+	nativeName: "Español (Estados Unidos)",
+	language: "es",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sa"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs-Cyrl", "default", {
+	name: "bs-Cyrl",
+	englishName: "Bosnian (Cyrillic)",
+	nativeName: "босански",
+	language: "bs-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs-Latn", "default", {
+	name: "bs-Latn",
+	englishName: "Bosnian (Latin)",
+	nativeName: "bosanski",
+	language: "bs-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl", "default", {
+	name: "sr-Cyrl",
+	englishName: "Serbian (Cyrillic)",
+	nativeName: "српски",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn", "default", {
+	name: "sr-Latn",
+	englishName: "Serbian (Latin)",
+	nativeName: "srpski",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smn", "default", {
+	name: "smn",
+	englishName: "Sami (Inari)",
+	nativeName: "sämikielâ",
+	language: "smn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],
+				namesAbbr: ["pa","vu","ma","ko","tu","vá","lá"],
+				namesShort: ["p","v","m","k","t","v","l"]
+			},
+			months: {
+				names: ["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu",""],
+				namesAbbr: ["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az-Cyrl", "default", {
+	name: "az-Cyrl",
+	englishName: "Azeri (Cyrillic)",
+	nativeName: "Азәрбајҹан дили",
+	language: "az-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "ман."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],
+				namesAbbr: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],
+				namesShort: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"]
+			},
+			months: {
+				names: ["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["јанвар","феврал","март","апрел","мај","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","мая","ијун","ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sms", "default", {
+	name: "sms",
+	englishName: "Sami (Skolt)",
+	nativeName: "sääm´ǩiõll",
+	language: "sms",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],
+				namesAbbr: ["pâ","vu","mâ","se","ne","pi","su"],
+				namesShort: ["p","v","m","s","n","p","s"]
+			},
+			months: {
+				names: ["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			monthsGenitive: {
+				names: ["ođđee´jjmannu","tä´lvvmannu","pâ´zzlâšttammannu","njuhččmannu","vue´ssmannu","ǩie´ssmannu","suei´nnmannu","på´rǧǧmannu","čõhččmannu","kålggmannu","skamm´mannu","rosttovmannu",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh", "default", {
+	name: "zh",
+	englishName: "Chinese",
+	nativeName: "中文",
+	language: "zh",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nn", "default", {
+	name: "nn",
+	englishName: "Norwegian (Nynorsk)",
+	nativeName: "norsk (nynorsk)",
+	language: "nn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],
+				namesAbbr: ["sø","må","ty","on","to","fr","la"],
+				namesShort: ["sø","må","ty","on","to","fr","la"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs", "default", {
+	name: "bs",
+	englishName: "Bosnian",
+	nativeName: "bosanski",
+	language: "bs",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az-Latn", "default", {
+	name: "az-Latn",
+	englishName: "Azeri (Latin)",
+	nativeName: "Azərbaycan­ılı",
+	language: "az-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sma", "default", {
+	name: "sma",
+	englishName: "Sami (Southern)",
+	nativeName: "åarjelsaemiengiele",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz-Cyrl", "default", {
+	name: "uz-Cyrl",
+	englishName: "Uzbek (Cyrillic)",
+	nativeName: "Ўзбек",
+	language: "uz-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "сўм"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],
+				namesAbbr: ["якш","дш","сш","чш","пш","ж","ш"],
+				namesShort: ["я","д","с","ч","п","ж","ш"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","мая","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'йил' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'йил' d-MMMM HH:mm",
+				F: "yyyy 'йил' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn-Cyrl", "default", {
+	name: "mn-Cyrl",
+	englishName: "Mongolian (Cyrillic)",
+	nativeName: "Монгол хэл",
+	language: "mn-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu-Cans", "default", {
+	name: "iu-Cans",
+	englishName: "Inuktitut (Syllabics)",
+	nativeName: "ᐃᓄᒃᑎᑐᑦ",
+	language: "iu-Cans",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ᓈᑦᑏᖑᔭ","ᓇᒡᒐᔾᔭᐅ","ᐊᐃᑉᐱᖅ","ᐱᖓᑦᓯᖅ","ᓯᑕᒻᒥᖅ","ᑕᓪᓕᕐᒥᖅ","ᓯᕙᑖᕐᕕᒃ"],
+				namesAbbr: ["ᓈᑦᑏ","ᓇᒡᒐ","ᐊᐃᑉᐱ","ᐱᖓᑦᓯ","ᓯᑕ","ᑕᓪᓕ","ᓯᕙᑖᕐᕕᒃ"],
+				namesShort: ["ᓈ","ᓇ","ᐊ","ᐱ","ᓯ","ᑕ","ᓯ"]
+			},
+			months: {
+				names: ["ᔮᓐᓄᐊᕆ","ᕖᕝᕗᐊᕆ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌᓯ","ᓯᑎᐱᕆ","ᐅᑐᐱᕆ","ᓄᕕᐱᕆ","ᑎᓯᐱᕆ",""],
+				namesAbbr: ["ᔮᓐᓄ","ᕖᕝᕗ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌ","ᓯᑎᐱ","ᐅᑐᐱ","ᓄᕕᐱ","ᑎᓯᐱ",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd,MMMM dd,yyyy",
+				f: "dddd,MMMM dd,yyyy h:mm tt",
+				F: "dddd,MMMM dd,yyyy h:mm:ss tt",
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-Hant", "default", {
+	name: "zh-Hant",
+	englishName: "Chinese (Traditional)",
+	nativeName: "中文(繁體)",
+	language: "zh-Hant",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nb", "default", {
+	name: "nb",
+	englishName: "Norwegian (Bokmål)",
+	nativeName: "norsk (bokmål)",
+	language: "nb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr", "default", {
+	name: "sr",
+	englishName: "Serbian",
+	nativeName: "srpski",
+	language: "sr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tg-Cyrl", "default", {
+	name: "tg-Cyrl",
+	englishName: "Tajik (Cyrillic)",
+	nativeName: "Тоҷикӣ",
+	language: "tg-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "dsb", "default", {
+	name: "dsb",
+	englishName: "Lower Sorbian",
+	nativeName: "dolnoserbšćina",
+	language: "dsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekońcne",
+		positiveInfinity: "+njekońcne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njeźela","ponjeźele","wałtora","srjoda","stwortk","pětk","sobota"],
+				namesAbbr: ["nje","pon","wał","srj","stw","pět","sob"],
+				namesShort: ["n","p","w","s","s","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'goź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'goź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smj", "default", {
+	name: "smj",
+	englishName: "Sami (Lule)",
+	nativeName: "julevusámegiella",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["ájl","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["á","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz-Latn", "default", {
+	name: "uz-Latn",
+	englishName: "Uzbek (Latin)",
+	nativeName: "U'zbek",
+	language: "uz-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn-Mong", "default", {
+	name: "mn-Mong",
+	englishName: "Mongolian (Traditional Mongolian)",
+	nativeName: "ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ",
+	language: "mn-Mong",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ᠲᠤᠭᠠᠠ ᠪᠤᠰᠤ",
+		negativeInfinity: "ᠰᠦᠬᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠡᠬᠡ",
+		positiveInfinity: "ᠡᠶ᠋ᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠠᠬᠡ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesAbbr: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesShort: ["ᠡ‍","ᠨᠢ‍","ᠬᠣ‍","ᠭᠤ‍","ᠳᠥ‍","ᠲᠠ‍","ᠵᠢ‍"]
+			},
+			months: {
+				names: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""],
+				namesAbbr: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ᠣᠨ ᠲᠣᠭᠠᠯᠠᠯ ᠤᠨ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm",
+				F: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm:ss",
+				M: "M'ᠰᠠᠷ᠎ᠠ' d'ᠡᠳᠦᠷ'",
+				Y: "yyyy'ᠣᠨ' M'ᠰᠠᠷ᠎ᠠ'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu-Latn", "default", {
+	name: "iu-Latn",
+	englishName: "Inuktitut (Latin)",
+	nativeName: "Inuktitut",
+	language: "iu-Latn",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tzm-Latn", "default", {
+	name: "tzm-Latn",
+	englishName: "Tamazight (Latin)",
+	nativeName: "Tamazight",
+	language: "tzm-Latn",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ha-Latn", "default", {
+	name: "ha-Latn",
+	englishName: "Hausa (Latin)",
+	nativeName: "Hausa",
+	language: "ha-Latn",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-CHS", "default", {
+	name: "zh-CHS",
+	englishName: "Chinese (Simplified) Legacy",
+	nativeName: "中文(简体) 旧版",
+	language: "zh-CHS",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-CHT", "default", {
+	name: "zh-CHT",
+	englishName: "Chinese (Traditional) Legacy",
+	nativeName: "中文(繁體) 舊版",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/jquery.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/jquery.js
new file mode 100644
index 0000000..2c12adb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/jquery.js
@@ -0,0 +1,9046 @@
+/*!
+ * jQuery JavaScript Library v1.6.4
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Sep 12 18:54:48 2011 -0400
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Check for digits
+	rdigit = /\d/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = (context ? context.ownerDocument || context : document);
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return (context || rootjQuery).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if (selector.selector !== undefined) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.6.4",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, +i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.resolveWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).unbind( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery._Deferred();
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNaN: function( obj ) {
+		return obj == null || !rdigit.test( obj ) || isNaN( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw msg;
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return (new Function( "return " + data ))();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// The extra typeof function check is to prevent crashes
+			// in Safari 2 (See: #3039)
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+		if ( !array ) {
+			return -1;
+		}
+
+		if ( indexOf ) {
+			return indexOf.call( array, elem );
+		}
+
+		for ( var i = 0, length = array.length; i < length; i++ ) {
+			if ( array[ i ] === elem ) {
+				return i;
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return (new Date()).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+var // Promise methods
+	promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
+	// Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+	// Create a simple deferred (one callbacks list)
+	_Deferred: function() {
+		var // callbacks list
+			callbacks = [],
+			// stored [ context , args ]
+			fired,
+			// to avoid firing when already doing so
+			firing,
+			// flag to know if the deferred has been cancelled
+			cancelled,
+			// the deferred itself
+			deferred  = {
+
+				// done( f1, f2, ...)
+				done: function() {
+					if ( !cancelled ) {
+						var args = arguments,
+							i,
+							length,
+							elem,
+							type,
+							_fired;
+						if ( fired ) {
+							_fired = fired;
+							fired = 0;
+						}
+						for ( i = 0, length = args.length; i < length; i++ ) {
+							elem = args[ i ];
+							type = jQuery.type( elem );
+							if ( type === "array" ) {
+								deferred.done.apply( deferred, elem );
+							} else if ( type === "function" ) {
+								callbacks.push( elem );
+							}
+						}
+						if ( _fired ) {
+							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+						}
+					}
+					return this;
+				},
+
+				// resolve with given context and args
+				resolveWith: function( context, args ) {
+					if ( !cancelled && !fired && !firing ) {
+						// make sure args are available (#8421)
+						args = args || [];
+						firing = 1;
+						try {
+							while( callbacks[ 0 ] ) {
+								callbacks.shift().apply( context, args );
+							}
+						}
+						finally {
+							fired = [ context, args ];
+							firing = 0;
+						}
+					}
+					return this;
+				},
+
+				// resolve with this as context and given arguments
+				resolve: function() {
+					deferred.resolveWith( this, arguments );
+					return this;
+				},
+
+				// Has this deferred been resolved?
+				isResolved: function() {
+					return !!( firing || fired );
+				},
+
+				// Cancel
+				cancel: function() {
+					cancelled = 1;
+					callbacks = [];
+					return this;
+				}
+			};
+
+		return deferred;
+	},
+
+	// Full fledged deferred (two callbacks list)
+	Deferred: function( func ) {
+		var deferred = jQuery._Deferred(),
+			failDeferred = jQuery._Deferred(),
+			promise;
+		// Add errorDeferred methods, then and promise
+		jQuery.extend( deferred, {
+			then: function( doneCallbacks, failCallbacks ) {
+				deferred.done( doneCallbacks ).fail( failCallbacks );
+				return this;
+			},
+			always: function() {
+				return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
+			},
+			fail: failDeferred.done,
+			rejectWith: failDeferred.resolveWith,
+			reject: failDeferred.resolve,
+			isRejected: failDeferred.isResolved,
+			pipe: function( fnDone, fnFail ) {
+				return jQuery.Deferred(function( newDefer ) {
+					jQuery.each( {
+						done: [ fnDone, "resolve" ],
+						fail: [ fnFail, "reject" ]
+					}, function( handler, data ) {
+						var fn = data[ 0 ],
+							action = data[ 1 ],
+							returned;
+						if ( jQuery.isFunction( fn ) ) {
+							deferred[ handler ](function() {
+								returned = fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise().then( newDefer.resolve, newDefer.reject );
+								} else {
+									newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+								}
+							});
+						} else {
+							deferred[ handler ]( newDefer[ action ] );
+						}
+					});
+				}).promise();
+			},
+			// Get a promise for this deferred
+			// If obj is provided, the promise aspect is added to the object
+			promise: function( obj ) {
+				if ( obj == null ) {
+					if ( promise ) {
+						return promise;
+					}
+					promise = obj = {};
+				}
+				var i = promiseMethods.length;
+				while( i-- ) {
+					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+				}
+				return obj;
+			}
+		});
+		// Make sure only one callback list will be used
+		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+		// Unexpose cancel
+		delete deferred.cancel;
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = arguments,
+			i = 0,
+			length = args.length,
+			count = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					// Strange bug in FF4:
+					// Values changed onto the arguments object sometimes end up as undefined values
+					// outside the $.when method. Cloning the object into a fresh array solves the issue
+					deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+				}
+			};
+		}
+		if ( length > 1 ) {
+			for( ; i < length; i++ ) {
+				if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return deferred.promise();
+	}
+});
+
+
+
+jQuery.support = (function() {
+
+	var div = document.createElement( "div" ),
+		documentElement = document.documentElement,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		support,
+		fragment,
+		body,
+		testElementParent,
+		testElement,
+		testElementStyle,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName( "tbody" ).length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName( "link" ).length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55$/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains it's value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.firstChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	div.innerHTML = "";
+
+	// Figure out if the W3C box model works as expected
+	div.style.width = div.style.paddingLeft = "1px";
+
+	body = document.getElementsByTagName( "body" )[ 0 ];
+	// We use our own, invisible, body unless the body is already present
+	// in which case we use a div (#9239)
+	testElement = document.createElement( body ? "div" : "body" );
+	testElementStyle = {
+		visibility: "hidden",
+		width: 0,
+		height: 0,
+		border: 0,
+		margin: 0,
+		background: "none"
+	};
+	if ( body ) {
+		jQuery.extend( testElementStyle, {
+			position: "absolute",
+			left: "-1000px",
+			top: "-1000px"
+		});
+	}
+	for ( i in testElementStyle ) {
+		testElement.style[ i ] = testElementStyle[ i ];
+	}
+	testElement.appendChild( div );
+	testElementParent = body || documentElement;
+	testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	support.boxModel = div.offsetWidth === 2;
+
+	if ( "zoom" in div.style ) {
+		// Check if natively block-level elements act like inline-block
+		// elements when setting their display to 'inline' and giving
+		// them layout
+		// (IE < 8 does this)
+		div.style.display = "inline";
+		div.style.zoom = 1;
+		support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+		// Check if elements with layout shrink-wrap their children
+		// (IE 6 does this)
+		div.style.display = "";
+		div.innerHTML = "<div style='width:4px;'></div>";
+		support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+	}
+
+	div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+	tds = div.getElementsByTagName( "td" );
+
+	// Check if table cells still have offsetWidth/Height when they are set
+	// to display:none and there are still other visible table cells in a
+	// table row; if so, offsetWidth/Height are not reliable for use when
+	// determining if an element has been hidden directly using
+	// display:none (it is still safe to use offsets if a parent element is
+	// hidden; don safety goggles and see bug #4512 for more information).
+	// (only IE 8 fails this test)
+	isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+	tds[ 0 ].style.display = "";
+	tds[ 1 ].style.display = "none";
+
+	// Check if empty table cells still have offsetWidth/Height
+	// (IE < 8 fail this test)
+	support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( document.defaultView && document.defaultView.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Remove the body element we added
+	testElement.innerHTML = "";
+	testElementParent.removeChild( testElement );
+
+	// Technique from Juriy Zaytsev
+	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		} ) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Null connected elements to avoid leaks in IE
+	testElement = fragment = select = opt = body = marginDiv = div = input = null;
+
+	return support;
+})();
+
+// Keep track of boxModel
+jQuery.boxModel = jQuery.support.boxModel;
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ jQuery.expando ] = id = ++jQuery.uuid;
+			} else {
+				id = jQuery.expando;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+			} else {
+				cache[ id ] = jQuery.extend(cache[ id ], name);
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// Internal jQuery data is stored in a separate object inside the object's data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data
+		if ( pvt ) {
+			if ( !thisCache[ internalKey ] ) {
+				thisCache[ internalKey ] = {};
+			}
+
+			thisCache = thisCache[ internalKey ];
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+		// not attempt to inspect the internal events object using jQuery.data, as this
+		// internal data object is undocumented and subject to change.
+		if ( name === "events" && !thisCache[name] ) {
+			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+			if ( thisCache ) {
+
+				// Support interoperable removal of hyphenated or camelcased keys
+				if ( !thisCache[ name ] ) {
+					name = jQuery.camelCase( name );
+				}
+
+				delete thisCache[ name ];
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !isEmptyDataObject(thisCache) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( pvt ) {
+			delete cache[ id ][ internalKey ];
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		var internalCache = cache[ id ][ internalKey ];
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the entire user cache at once because it's faster than
+		// iterating through each key, but we need to continue to persist internal
+		// data if it existed
+		if ( internalCache ) {
+			cache[ id ] = {};
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+
+			cache[ id ][ internalKey ] = internalCache;
+
+		// Otherwise, we need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		} else if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ jQuery.expando ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( jQuery.expando );
+			} else {
+				elem[ jQuery.expando ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 ) {
+			    var attr = this[0].attributes, name;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var $this = jQuery( this ),
+					args = [ parts[0], value ];
+
+				$this.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				$this.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				!jQuery.isNaN( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery.data( elem, deferDataKey, undefined, true );
+	if ( defer &&
+		( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
+		( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
+				!jQuery.data( elem, markDataKey, undefined, true ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.resolve();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = (type || "fx") + "mark";
+			jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
+			if ( count ) {
+				jQuery.data( elem, key, count, true );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		if ( elem ) {
+			type = (type || "fx") + "queue";
+			var q = jQuery.data( elem, type, undefined, true );
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery.data( elem, type, jQuery.makeArray(data), true );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			defer;
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift("inprogress");
+			}
+
+			fn.call(elem, function() {
+				jQuery.dequeue(elem, type);
+			});
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function() {
+			var elem = this;
+			setTimeout(function() {
+				jQuery.dequeue( elem, type );
+			}, time );
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
+				count++;
+				tmp.done( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	nodeHook, boolHook;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+	
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+	
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = (value || "").split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ";
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret,
+			elem = this[0];
+		
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ? 
+					// handle most common string cases
+					ret.replace(rreturn, "") : 
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return undefined;
+		}
+
+		var isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+					var option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+	
+	attrFix: {
+		// Always normalize to ensure hook usage
+		tabindex: "tabIndex"
+	},
+	
+	attr: function( elem, name, value, pass ) {
+		var nType = elem.nodeType;
+		
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return undefined;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( !("getAttribute" in elem) ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		var ret, hooks,
+			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// Normalize the name if needed
+		if ( notxml ) {
+			name = jQuery.attrFix[ name ] || name;
+
+			hooks = jQuery.attrHooks[ name ];
+
+			if ( !hooks ) {
+				// Use boolHook for boolean attributes
+				if ( rboolean.test( name ) ) {
+					hooks = boolHook;
+
+				// Use nodeHook if available( IE6/7 )
+				} else if ( nodeHook ) {
+					hooks = nodeHook;
+				}
+			}
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return undefined;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, name ) {
+		var propName;
+		if ( elem.nodeType === 1 ) {
+			name = jQuery.attrFix[ name ] || name;
+
+			jQuery.attr( elem, name, "" );
+			elem.removeAttribute( name );
+
+			// Set corresponding property to false for boolean attributes
+			if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
+				elem[ propName ] = false;
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+	
+	prop: function( elem, name, value ) {
+		var nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return undefined;
+		}
+
+		var ret, hooks,
+			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return (elem[ name ] = value);
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+	
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabindex propHook to attrHooks for back-compat
+jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode;
+		return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !jQuery.support.getSetAttribute ) {
+	
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			// Return undefined if nodeValue is empty string
+			return ret && ret.nodeValue !== "" ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return (ret.nodeValue = value + "");
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return (elem.style.cssText = "" + value);
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
+			}
+		}
+	});
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+	rformElems = /^(?:textarea|input|select)$/i,
+	rperiod = /\./g,
+	rspaces = / /g,
+	rescape = /[^\w\s.|`]/g,
+	fcleanup = function( nm ) {
+		return nm.replace(rescape, "\\$&");
+	};
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function( elem, types, handler, data ) {
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		} else if ( !handler ) {
+			// Fixes bug #7229. Fix recommended by jdalton
+			return;
+		}
+
+		var handleObjIn, handleObj;
+
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure
+		var elemData = jQuery._data( elem );
+
+		// If no elemData is found then we must be trying to bind to one of the
+		// banned noData elements
+		if ( !elemData ) {
+			return;
+		}
+
+		var events = elemData.events,
+			eventHandle = elemData.handle;
+
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+		}
+
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native events in IE.
+		eventHandle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		var type, i = 0, namespaces;
+
+		while ( (type = types[ i++ ]) ) {
+			handleObj = handleObjIn ?
+				jQuery.extend({}, handleObjIn) :
+				{ handler: handler, data: data };
+
+			// Namespaced event handlers
+			if ( type.indexOf(".") > -1 ) {
+				namespaces = type.split(".");
+				type = namespaces.shift();
+				handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+			} else {
+				namespaces = [];
+				handleObj.namespace = "";
+			}
+
+			handleObj.type = type;
+			if ( !handleObj.guid ) {
+				handleObj.guid = handler.guid;
+			}
+
+			// Get the current list of functions bound to this event
+			var handlers = events[ type ],
+				special = jQuery.event.special[ type ] || {};
+
+			// Init the event handler queue
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers.push( handleObj );
+
+			// Keep track of which events have been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, pos ) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		}
+
+		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			events = elemData && elemData.events;
+
+		if ( !elemData || !events ) {
+			return;
+		}
+
+		// types is actually an event object here
+		if ( types && types.type ) {
+			handler = types.handler;
+			types = types.type;
+		}
+
+		// Unbind all events for the element
+		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+			types = types || "";
+
+			for ( type in events ) {
+				jQuery.event.remove( elem, type + types );
+			}
+
+			return;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).unbind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		while ( (type = types[ i++ ]) ) {
+			origType = type;
+			handleObj = null;
+			all = type.indexOf(".") < 0;
+			namespaces = [];
+
+			if ( !all ) {
+				// Namespaced event handlers
+				namespaces = type.split(".");
+				type = namespaces.shift();
+
+				namespace = new RegExp("(^|\\.)" +
+					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+			}
+
+			eventType = events[ type ];
+
+			if ( !eventType ) {
+				continue;
+			}
+
+			if ( !handler ) {
+				for ( j = 0; j < eventType.length; j++ ) {
+					handleObj = eventType[ j ];
+
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						jQuery.event.remove( elem, origType, handleObj.handler, j );
+						eventType.splice( j--, 1 );
+					}
+				}
+
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+
+			for ( j = pos || 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( handler.guid === handleObj.guid ) {
+					// remove the given handler for the given type
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						if ( pos == null ) {
+							eventType.splice( j--, 1 );
+						}
+
+						if ( special.remove ) {
+							special.remove.call( elem, handleObj );
+						}
+					}
+
+					if ( pos != null ) {
+						break;
+					}
+				}
+			}
+
+			// remove generic event handler if no more handlers exist
+			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				ret = null;
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			var handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			delete elemData.events;
+			delete elemData.handle;
+
+			if ( jQuery.isEmptyObject( elemData ) ) {
+				jQuery.removeData( elem, undefined, true );
+			}
+		}
+	},
+	
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			exclusive;
+
+		if ( type.indexOf("!") >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf(".") >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join(".");
+		event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
+		
+		// triggerHandler() and global events don't bubble or run the default action
+		if ( onlyHandlers || !elem ) {
+			event.preventDefault();
+			event.stopPropagation();
+		}
+
+		// Handle a global trigger
+		if ( !elem ) {
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			jQuery.each( jQuery.cache, function() {
+				// internalKey variable is just used to make it easier to find
+				// and potentially change this stuff later; currently it just
+				// points to jQuery.expando
+				var internalKey = jQuery.expando,
+					internalCache = this[ internalKey ];
+				if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+					jQuery.event.trigger( event, data, internalCache.handle.elem );
+				}
+			});
+			return;
+		}
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		event.target = elem;
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		var cur = elem,
+			// IE doesn't like method names with a colon (#3533, #8272)
+			ontype = type.indexOf(":") < 0 ? "on" + type : "";
+
+		// Fire event on the current element, then bubble up the DOM tree
+		do {
+			var handle = jQuery._data( cur, "handle" );
+
+			event.currentTarget = cur;
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Trigger an inline bound script
+			if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
+				event.result = false;
+				event.preventDefault();
+			}
+
+			// Bubble up to document, then to window
+			cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
+		} while ( cur && !event.isPropagationStopped() );
+
+		// If nobody prevented the default action, do it now
+		if ( !event.isDefaultPrevented() ) {
+			var old,
+				special = jQuery.event.special[ type ] || {};
+
+			if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction)() check here because IE6/7 fails that test.
+				// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
+				try {
+					if ( ontype && elem[ type ] ) {
+						// Don't re-trigger an onFOO event when we call its FOO() method
+						old = elem[ ontype ];
+
+						if ( old ) {
+							elem[ ontype ] = null;
+						}
+
+						jQuery.event.triggered = type;
+						elem[ type ]();
+					}
+				} catch ( ieError ) {}
+
+				if ( old ) {
+					elem[ ontype ] = old;
+				}
+
+				jQuery.event.triggered = undefined;
+			}
+		}
+		
+		return event.result;
+	},
+
+	handle: function( event ) {
+		event = jQuery.event.fix( event || window.event );
+		// Snapshot the handlers list since a called handler may add/remove events.
+		var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
+			run_all = !event.exclusive && !event.namespace,
+			args = Array.prototype.slice.call( arguments, 0 );
+
+		// Use the fix-ed Event rather than the (read-only) native event
+		args[0] = event;
+		event.currentTarget = this;
+
+		for ( var j = 0, l = handlers.length; j < l; j++ ) {
+			var handleObj = handlers[ j ];
+
+			// Triggered event must 1) be non-exclusive and have no namespace, or
+			// 2) have namespace(s) a subset or equal to those in the bound event.
+			if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
+				// Pass in a reference to the handler function itself
+				// So that we can later remove it
+				event.handler = handleObj.handler;
+				event.data = handleObj.data;
+				event.handleObj = handleObj;
+
+				var ret = handleObj.handler.apply( this, args );
+
+				if ( ret !== undefined ) {
+					event.result = ret;
+					if ( ret === false ) {
+						event.preventDefault();
+						event.stopPropagation();
+					}
+				}
+
+				if ( event.isImmediatePropagationStopped() ) {
+					break;
+				}
+			}
+		}
+		return event.result;
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ) {
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target ) {
+			// Fixes #1925 where srcElement might not be defined either
+			event.target = event.srcElement || document;
+		}
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement ) {
+			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+		}
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var eventDocument = event.target.ownerDocument || document,
+				doc = eventDocument.documentElement,
+				body = eventDocument.body;
+
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+		}
+
+		// Add which for key events
+		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+			event.which = event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button !== undefined ) {
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+		}
+
+		return event;
+	},
+
+	// Deprecated, use jQuery.guid instead
+	guid: 1E8,
+
+	// Deprecated, use jQuery.proxy instead
+	proxy: jQuery.proxy,
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady,
+			teardown: jQuery.noop
+		},
+
+		live: {
+			add: function( handleObj ) {
+				jQuery.event.add( this,
+					liveConvert( handleObj.origType, handleObj.selector ),
+					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+			},
+
+			remove: function( handleObj ) {
+				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+			}
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !this.preventDefault ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+
+	// Check if mouse(over|out) are still within the same parent element
+	var related = event.relatedTarget,
+		inside = false,
+		eventType = event.type;
+
+	event.type = event.data;
+
+	if ( related !== this ) {
+
+		if ( related ) {
+			inside = jQuery.contains( this, related );
+		}
+
+		if ( !inside ) {
+
+			jQuery.event.handle.apply( this, arguments );
+
+			event.type = eventType;
+		}
+	}
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+	event.type = event.data;
+	jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		setup: function( data ) {
+			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+		},
+		teardown: function( data ) {
+			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+		}
+	};
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function( data, namespaces ) {
+			if ( !jQuery.nodeName( this, "form" ) ) {
+				jQuery.event.add(this, "click.specialSubmit", function( e ) {
+					// Avoid triggering error on non-existent type attribute in IE VML (#7071)
+					var elem = e.target,
+						type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+
+					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+
+					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+			} else {
+				return false;
+			}
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialSubmit" );
+		}
+	};
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+	var changeFilters,
+
+	getVal = function( elem ) {
+		var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
+			val = elem.value;
+
+		if ( type === "radio" || type === "checkbox" ) {
+			val = elem.checked;
+
+		} else if ( type === "select-multiple" ) {
+			val = elem.selectedIndex > -1 ?
+				jQuery.map( elem.options, function( elem ) {
+					return elem.selected;
+				}).join("-") :
+				"";
+
+		} else if ( jQuery.nodeName( elem, "select" ) ) {
+			val = elem.selectedIndex;
+		}
+
+		return val;
+	},
+
+	testChange = function testChange( e ) {
+		var elem = e.target, data, val;
+
+		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+			return;
+		}
+
+		data = jQuery._data( elem, "_change_data" );
+		val = getVal(elem);
+
+		// the current data will be also retrieved by beforeactivate
+		if ( e.type !== "focusout" || elem.type !== "radio" ) {
+			jQuery._data( elem, "_change_data", val );
+		}
+
+		if ( data === undefined || val === data ) {
+			return;
+		}
+
+		if ( data != null || val ) {
+			e.type = "change";
+			e.liveFired = undefined;
+			jQuery.event.trigger( e, arguments[1], elem );
+		}
+	};
+
+	jQuery.event.special.change = {
+		filters: {
+			focusout: testChange,
+
+			beforedeactivate: testChange,
+
+			click: function( e ) {
+				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+				if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Change has to be called before submit
+			// Keydown will be called before keypress, which is used in submit-event delegation
+			keydown: function( e ) {
+				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+				if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
+					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+					type === "select-multiple" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Beforeactivate happens also before the previous element is blurred
+			// with this event you can't trigger a change event, but you can store
+			// information
+			beforeactivate: function( e ) {
+				var elem = e.target;
+				jQuery._data( elem, "_change_data", getVal(elem) );
+			}
+		},
+
+		setup: function( data, namespaces ) {
+			if ( this.type === "file" ) {
+				return false;
+			}
+
+			for ( var type in changeFilters ) {
+				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+			}
+
+			return rformElems.test( this.nodeName );
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialChange" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+
+	changeFilters = jQuery.event.special.change.filters;
+
+	// Handle when the input is .focus()'d
+	changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+	// Piggyback on a donor event to simulate a different one.
+	// Fake originalEvent to avoid donor's stopPropagation, but if the
+	// simulated event prevents default then we do the same on the donor.
+	// Don't pass args or remember liveFired; they apply to the donor event.
+	var event = jQuery.extend( {}, args[ 0 ] );
+	event.type = type;
+	event.originalEvent = {};
+	event.liveFired = undefined;
+	jQuery.event.handle.call( elem, event );
+	if ( event.isDefaultPrevented() ) {
+		args[ 0 ].preventDefault();
+	}
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0;
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+
+		function handler( donor ) {
+			// Donor event is always a native one; fix it and switch its type.
+			// Let focusin/out handler cancel the donor focus/blur event.
+			var e = jQuery.event.fix( donor );
+			e.type = fix;
+			e.originalEvent = {};
+			jQuery.event.trigger( e, null, e.target );
+			if ( e.isDefaultPrevented() ) {
+				donor.preventDefault();
+			}
+		}
+	});
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+	jQuery.fn[ name ] = function( type, data, fn ) {
+		var handler;
+
+		// Handle object literals
+		if ( typeof type === "object" ) {
+			for ( var key in type ) {
+				this[ name ](key, data, type[key], fn);
+			}
+			return this;
+		}
+
+		if ( arguments.length === 2 || data === false ) {
+			fn = data;
+			data = undefined;
+		}
+
+		if ( name === "one" ) {
+			handler = function( event ) {
+				jQuery( this ).unbind( event, handler );
+				return fn.apply( this, arguments );
+			};
+			handler.guid = fn.guid || jQuery.guid++;
+		} else {
+			handler = fn;
+		}
+
+		if ( type === "unload" && name !== "one" ) {
+			this.one( type, data, fn );
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.add( this[i], type, handler, data );
+			}
+		}
+
+		return this;
+	};
+});
+
+jQuery.fn.extend({
+	unbind: function( type, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" && !type.preventDefault ) {
+			for ( var key in type ) {
+				this.unbind(key, type[key]);
+			}
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.remove( this[i], type, fn );
+			}
+		}
+
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.live( types, data, fn, selector );
+	},
+
+	undelegate: function( selector, types, fn ) {
+		if ( arguments.length === 0 ) {
+			return this.unbind( "live" );
+
+		} else {
+			return this.die( types, null, fn, selector );
+		}
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+var liveMap = {
+	focus: "focusin",
+	blur: "focusout",
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+		var type, i = 0, match, namespaces, preType,
+			selector = origSelector || this.selector,
+			context = origSelector ? this : jQuery( this.context );
+
+		if ( typeof types === "object" && !types.preventDefault ) {
+			for ( var key in types ) {
+				context[ name ]( key, data, types[key], selector );
+			}
+
+			return this;
+		}
+
+		if ( name === "die" && !types &&
+					origSelector && origSelector.charAt(0) === "." ) {
+
+			context.unbind( origSelector );
+
+			return this;
+		}
+
+		if ( data === false || jQuery.isFunction( data ) ) {
+			fn = data || returnFalse;
+			data = undefined;
+		}
+
+		types = (types || "").split(" ");
+
+		while ( (type = types[ i++ ]) != null ) {
+			match = rnamespaces.exec( type );
+			namespaces = "";
+
+			if ( match )  {
+				namespaces = match[0];
+				type = type.replace( rnamespaces, "" );
+			}
+
+			if ( type === "hover" ) {
+				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+				continue;
+			}
+
+			preType = type;
+
+			if ( liveMap[ type ] ) {
+				types.push( liveMap[ type ] + namespaces );
+				type = type + namespaces;
+
+			} else {
+				type = (liveMap[ type ] || type) + namespaces;
+			}
+
+			if ( name === "live" ) {
+				// bind live handler
+				for ( var j = 0, l = context.length; j < l; j++ ) {
+					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+				}
+
+			} else {
+				// unbind live handler
+				context.unbind( "live." + liveConvert( type, selector ), fn );
+			}
+		}
+
+		return this;
+	};
+});
+
+function liveHandler( event ) {
+	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+		elems = [],
+		selectors = [],
+		events = jQuery._data( this, "events" );
+
+	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+		return;
+	}
+
+	if ( event.namespace ) {
+		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+	}
+
+	event.liveFired = this;
+
+	var live = events.live.slice(0);
+
+	for ( j = 0; j < live.length; j++ ) {
+		handleObj = live[j];
+
+		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+			selectors.push( handleObj.selector );
+
+		} else {
+			live.splice( j--, 1 );
+		}
+	}
+
+	match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+	for ( i = 0, l = match.length; i < l; i++ ) {
+		close = match[i];
+
+		for ( j = 0; j < live.length; j++ ) {
+			handleObj = live[j];
+
+			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+				elem = close.elem;
+				related = null;
+
+				// Those two events require additional checking
+				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+					event.type = handleObj.preType;
+					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+
+					// Make sure not to accidentally match a child element with the same selector
+					if ( related && jQuery.contains( elem, related ) ) {
+						related = elem;
+					}
+				}
+
+				if ( !related || related !== elem ) {
+					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+				}
+			}
+		}
+	}
+
+	for ( i = 0, l = elems.length; i < l; i++ ) {
+		match = elems[i];
+
+		if ( maxLevel && match.level > maxLevel ) {
+			break;
+		}
+
+		event.currentTarget = match.elem;
+		event.data = match.handleObj.data;
+		event.handleObj = match.handleObj;
+
+		ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+		if ( ret === false || event.isPropagationStopped() ) {
+			maxLevel = match.level;
+
+			if ( ret === false ) {
+				stop = false;
+			}
+			if ( event.isImmediatePropagationStopped() ) {
+				break;
+			}
+		}
+	}
+
+	return stop;
+}
+
+function liveConvert( type, selector ) {
+	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.bind( name, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+	
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+		
+			parts.push( m[1] );
+		
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+				
+				set = posProcess( selector, set );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var match,
+			type = Expr.order[i];
+		
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			var left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				var found, item,
+					filter = Expr.filter[ type ],
+					left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+	
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+		
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+			
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					if ( type === "first" ) { 
+						return true; 
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					return true;
+
+				case "nth":
+					var first = match[2],
+						last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+					
+					var doneName = match[0],
+						parent = elem.parentNode;
+	
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+						
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+
+						parent.sizcache = doneName;
+					}
+					
+					var diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+		},
+		
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+	var ret = "", elem;
+
+	for ( var i = 0; elems[i]; i++ ) {
+		elem = elems[i];
+
+		// Get the text from text nodes and CDATA nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+			ret += elem.nodeValue;
+
+		// Traverse everything else, except comment nodes
+		} else if ( elem.nodeType !== 8 ) {
+			ret += Sizzle.getText( elem.childNodes );
+		}
+	}
+
+	return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+	
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+				
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+					
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+				
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+						
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+							
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+					
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+	
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try { 
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+	
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+			
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833) 
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && ( typeof selector === "string" ?
+			jQuery.filter( selector, this ).length > 0 :
+			this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+		
+		// Array
+		if ( jQuery.isArray( selectors ) ) {
+			var match, selector,
+				matches = {},
+				level = 1;
+
+			if ( cur && selectors.length ) {
+				for ( i = 0, l = selectors.length; i < l; i++ ) {
+					selector = selectors[i];
+
+					if ( !matches[ selector ] ) {
+						matches[ selector ] = POS.test( selector ) ?
+							jQuery( selector, context || this.context ) :
+							selector;
+					}
+				}
+
+				while ( cur && cur.ownerDocument && cur !== context ) {
+					for ( selector in matches ) {
+						match = matches[ selector ];
+
+						if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
+							ret.push({ selector: selector, elem: cur, level: level });
+						}
+					}
+
+					cur = cur.parentNode;
+					level++;
+				}
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until ),
+			// The variable 'args' was introduced in
+			// https://github.com/jquery/jquery/commit/52a0238
+			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+			// http://code.google.com/p/v8/issues/detail?id=1050
+			args = slice.call(arguments);
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, args.join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return (elem === qualifier) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+	});
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function() {
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery(arguments[0]);
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery(arguments[0]).toArray() );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnocache.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || (l > 1 && i < lastIndex) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var internalKey = jQuery.expando,
+		oldData = jQuery.data( src ),
+		curData = jQuery.data( dest, oldData );
+
+	// Switch to use the internal data object, if it exists, for the next
+	// stage of data copying
+	if ( (oldData = oldData[ internalKey ]) ) {
+		var events = oldData.events;
+				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+		if ( events ) {
+			delete curData.handle;
+			curData.events = {};
+
+			for ( var type in events ) {
+				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+				}
+			}
+		}
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc;
+
+  // nodes may contain either an explicit document object,
+  // a jQuery collection or context object.
+  // If nodes[0] contains a valid object to assign to doc
+  if ( nodes && nodes[0] ) {
+    doc = nodes[0].ownerDocument || nodes[0];
+  }
+
+  // Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ args[0] ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = (i > 0 ? this.clone(true) : this).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( "getElementsByTagName" in elem ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( "querySelectorAll" in elem ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	if ( jQuery.nodeName( elem, "input" ) ) {
+		fixDefaultChecked( elem );
+	} else if ( "getElementsByTagName" in elem ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var clone = elem.cloneNode(true),
+				srcElements,
+				destElements,
+				i;
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName
+			// instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ] && cache[ id ][ internalKey ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+			return undefined;
+		}
+
+		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+			style = elem.style;
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+			// Remember the original values
+			left = style.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : (ret || 0);
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			jQuery.each( which, function() {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+				}
+			});
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		jQuery.each( which, function() {
+			val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+			}
+		});
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+	
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for(; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for(; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.bind( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery._Deferred(),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.done;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					jQuery.error( e );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for( key in s.converters ) {
+				if( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+						jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data(elem, "olddisplay") || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				if ( this[i].style ) {
+					var display = jQuery.css( this[i], "display" );
+
+					if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+						jQuery._data( this[i], "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		return this[ optall.queue === false ? "each" : "queue" ](function() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p,
+				display, e,
+				parts, start, end, unit;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height
+					// animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+						if ( !jQuery.support.inlineBlockNeedsLayout ) {
+							this.style.display = "inline-block";
+
+						} else {
+							display = defaultDisplay( this.nodeName );
+
+							// inline-level elements accept inline-block;
+							// block-level elements need to be inline with layout
+							if ( display === "inline" ) {
+								this.style.display = "inline-block";
+
+							} else {
+								this.style.display = "inline";
+								this.style.zoom = 1;
+							}
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test(val) ) {
+					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ((end || 1) / e.cur()) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function( clearQueue, gotoEnd ) {
+		if ( clearQueue ) {
+			this.queue([]);
+		}
+
+		this.each(function() {
+			var timers = jQuery.timers,
+				i = timers.length;
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+			while ( i-- ) {
+				if ( timers[i].elem === this ) {
+					if (gotoEnd) {
+						// force the next step to be the last
+						timers[i](true);
+					}
+
+					timers.splice(i, 1);
+				}
+			}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if ( !gotoEnd ) {
+			this.dequeue();
+		}
+
+		return this;
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue !== false ) {
+				jQuery.dequeue( this );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		function t( gotoEnd ) {
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options,
+			i, n;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( i in options.animatedProperties ) {
+				if ( options.animatedProperties[i] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function (index, value) {
+						elem.style[ "overflow" + value ] = options.overflow[index];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery(elem).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( var p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[p] );
+					}
+				}
+
+				// Execute the complete function
+				options.complete.call( elem );
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ((this.end - this.start) * this.pos);
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
+			if ( !timers[i]() ) {
+				timers.splice(i--, 1);
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		jQuery.offset.initialize();
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+	initialize: function() {
+		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+		container.innerHTML = html;
+		body.insertBefore( container, body.firstChild );
+		innerDiv = container.firstChild;
+		checkDiv = innerDiv.firstChild;
+		td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		checkDiv.style.position = "fixed";
+		checkDiv.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+		checkDiv.style.position = checkDiv.style.top = "";
+
+		innerDiv.style.overflow = "hidden";
+		innerDiv.style.position = "relative";
+
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+		body.removeChild( container );
+		jQuery.offset.initialize = jQuery.noop;
+	},
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		jQuery.offset.initialize();
+
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if (options.top != null) {
+			props.top = (options.top - curOffset.top) + curTop;
+		}
+		if (options.left != null) {
+			props.left = (options.left - curOffset.left) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNaN( ret ) ? orig : ret;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+})(window);
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw-libs.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw-libs.js
new file mode 100644
index 0000000..54978ad
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw-libs.js
@@ -0,0 +1,8136 @@
+/*!
+ * JSizes - JQuery plugin v0.33
+ *
+ * Licensed under the revised BSD License.
+ * Copyright 2008-2010 Bram Stein
+ * All rights reserved.
+ */
+/*global jQuery*/
+(function ($) {
+	var num = function (value) {
+			return parseInt(value, 10) || 0;
+		};
+
+	/**
+	 * Sets or gets the values for min-width, min-height, max-width
+	 * and max-height.
+	 */
+	$.each(['min', 'max'], function (i, name) {
+		$.fn[name + 'Size'] = function (value) {
+			var width, height;
+			if (value) {
+				if (value.width !== undefined) {
+					this.css(name + '-width', value.width);
+				}
+				if (value.height !== undefined) {
+					this.css(name + '-height', value.height);
+				}
+				return this;
+			}
+			else {
+				width = this.css(name + '-width');
+				height = this.css(name + '-height');
+				// Apparently:
+				//  * Opera returns -1px instead of none
+				//  * IE6 returns undefined instead of none
+				return {'width': (name === 'max' && (width === undefined || width === 'none' || num(width) === -1) && Number.MAX_VALUE) || num(width), 
+						'height': (name === 'max' && (height === undefined || height === 'none' || num(height) === -1) && Number.MAX_VALUE) || num(height)};
+			}
+		};
+	});
+
+	/**
+	 * Returns whether or not an element is visible.
+	 */
+	$.fn.isVisible = function () {
+		return this.is(':visible');
+	};
+
+	/**
+	 * Sets or gets the values for border, margin and padding.
+	 */
+	$.each(['border', 'margin', 'padding'], function (i, name) {
+		$.fn[name] = function (value) {
+			if (value) {
+				if (value.top !== undefined) {
+					this.css(name + '-top' + (name === 'border' ? '-width' : ''), value.top);
+				}
+				if (value.bottom !== undefined) {
+					this.css(name + '-bottom' + (name === 'border' ? '-width' : ''), value.bottom);
+				}
+				if (value.left !== undefined) {
+					this.css(name + '-left' + (name === 'border' ? '-width' : ''), value.left);
+				}
+				if (value.right !== undefined) {
+					this.css(name + '-right' + (name === 'border' ? '-width' : ''), value.right);
+				}
+				return this;
+			}
+			else {
+				return {top: num(this.css(name + '-top' + (name === 'border' ? '-width' : ''))),
+						bottom: num(this.css(name + '-bottom' + (name === 'border' ? '-width' : ''))),
+						left: num(this.css(name + '-left' + (name === 'border' ? '-width' : ''))),
+						right: num(this.css(name + '-right' + (name === 'border' ? '-width' : '')))};
+			}
+		};
+	});
+})(jQuery);
+/*!
+ * jLayout Border Layout - JavaScript Layout Algorithms v0.4
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009, Bram Stein
+ * All rights reserved.
+ */
+/*global jLayout */
+(function () {
+	jLayout = typeof jLayout === 'undefined' ? {} : jLayout;
+
+	jLayout.border = function (spec) {
+		var my = {},
+			that = {},
+			east = spec.east,
+			west = spec.west,
+			north = spec.north,
+			south = spec.south,
+			center = spec.center;
+
+		my.hgap = spec.hgap || 0;
+		my.vgap = spec.vgap || 0;
+
+		that.items = function () {
+			var items = [];
+			if (east) {
+				items.push(east);
+			}
+
+			if (west) {
+				items.push(west);
+			}
+
+			if (north) {
+				items.push(north);
+			}
+
+			if (south) {
+				items.push(south);
+			}
+
+			if (center) {
+				items.push(center);
+			}
+			return items;
+		};		
+
+		that.layout = function (container) {
+			var size = container.bounds(),
+				insets = container.insets(),
+				top = insets.top,
+				bottom = size.height - insets.bottom,
+				left = insets.left,
+				right = size.width - insets.right,
+				tmp;
+
+			if (north && north.isVisible()) {
+				tmp = north.preferredSize();
+				north.bounds({'x': left, 'y': top, 'width': right - left, 'height': tmp.height});
+				north.doLayout();
+
+				top += tmp.height + my.vgap;
+			}
+			if (south && south.isVisible()) {
+				tmp = south.preferredSize();
+				south.bounds({'x': left, 'y': bottom - tmp.height, 'width': right - left, 'height': tmp.height});
+				south.doLayout();
+
+				bottom -= tmp.height + my.vgap;
+			}
+			if (east && east.isVisible()) {
+				tmp = east.preferredSize();
+				east.bounds({'x': right - tmp.width, 'y': top, 'width': tmp.width, 'height': bottom - top});
+				east.doLayout();
+
+				right -= tmp.width + my.hgap;
+			}
+			if (west && west.isVisible()) {
+				tmp = west.preferredSize();
+				west.bounds({'x': left, 'y': top, 'width': tmp.width, 'height': bottom - top});
+				west.doLayout();
+
+				left += tmp.width + my.hgap;
+			}
+			if (center && center.isVisible()) {
+				center.bounds({'x': left, 'y': top, 'width': right - left, 'height': bottom - top});
+				center.doLayout();
+			}
+			return container;
+		};
+
+		function typeLayout(type) {
+			return function (container) {
+				var insets = container.insets(),
+					width = 0,
+					height = 0,
+					type_size;
+
+				if (east && east.isVisible()) {
+					type_size = east[type + 'Size']();
+					width += type_size.width + my.hgap;
+					height = type_size.height;
+				}
+				if (west && west.isVisible()) {
+					type_size = west[type + 'Size']();
+					width += type_size.width + my.hgap;
+					height = Math.max(type_size.height, height);
+				}
+				if (center && center.isVisible()) {
+					type_size = center[type + 'Size']();
+					width += type_size.width;
+					height = Math.max(type_size.height, height);
+				}
+				if (north && north.isVisible()) {
+					type_size = north[type + 'Size']();
+					width = Math.max(type_size.width, width);
+					height += type_size.height + my.vgap;
+				}
+				if (south && south.isVisible()) {
+					type_size = south[type + 'Size']();
+					width = Math.max(type_size.width, width);
+					height += type_size.height + my.vgap;
+				}
+
+				return {
+					'width': width + insets.left + insets.right, 
+					'height': height + insets.top + insets.bottom
+				};
+			};
+		}
+		that.preferred = typeLayout('preferred');
+		that.minimum = typeLayout('minimum');
+		that.maximum = typeLayout('maximum');
+		return that;
+	};
+})();
+/*!
+ * jLayout Grid Layout - JavaScript Layout Algorithms v0.41
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009, Bram Stein
+ * All rights reserved.
+ */
+/*global jLayout */
+(function () {
+	jLayout = typeof jLayout === 'undefined' ? {} : jLayout;
+
+	jLayout.grid = function (spec, shared) {
+		var my = shared || {},
+			that = {};
+
+		my.hgap = spec.hgap || 0;
+		my.vgap = spec.vgap || 0;
+
+		// initialize the number of columns to the number of items
+		// we're laying out.
+		my.items = spec.items || [];
+		my.columns = spec.columns || my.items.length;
+		my.rows = spec.rows || 0;
+		my.fillVertical = spec.fill && spec.fill === 'vertical';
+
+		if (my.rows > 0) {
+			my.columns = Math.floor((my.items.length + my.rows - 1) / my.rows); 
+		} else {
+			my.rows = Math.floor((my.items.length + my.columns - 1) / my.columns);
+		}
+	
+		that.items = function () {
+			var r = [];
+			Array.prototype.push.apply(r, my.items);
+			return r;
+		};
+
+		that.layout = function (container) {
+			var i, j,
+				insets = container.insets(),
+				x = insets.left,
+				y = insets.top,
+				width = (container.bounds().width - (insets.left + insets.right) - (my.columns - 1) * my.hgap) / my.columns,
+				height = (container.bounds().height - (insets.top + insets.bottom) - (my.rows - 1) * my.vgap) / my.rows;
+
+			for (i = 0, j = 1; i < my.items.length; i += 1, j += 1) {
+				my.items[i].bounds({'x': x, 'y': y, 'width': width, 'height': height});
+
+				if (!my.fillVertical) {
+					if (j >= my.columns) {
+						y += height + my.vgap;
+						x = insets.left;
+						j = 0;
+					}
+					else {
+						x += width + my.hgap;
+					}
+				} else {
+					if (j >= my.rows) {
+						x += width + my.hgap;
+						y = insets.top;
+						j = 0;
+					} else {
+						y += height + my.vgap;
+					}
+				}
+				my.items[i].doLayout();
+			}
+			return container;
+		};
+
+		function typeLayout(type) {
+			return function (container) {
+				var i = 0, 
+					width = 0, 
+					height = 0, 
+					type_size,
+					insets = container.insets();
+
+				for (; i < my.items.length; i += 1) {
+					type_size = my.items[i][type + 'Size']();
+					width = Math.max(width, type_size.width);
+					height = Math.max(height, type_size.height);
+				}
+				return {
+					'width': insets.left + insets.right + my.columns * width + (my.columns - 1) * my.hgap, 
+					'height': insets.top + insets.bottom + my.rows * height + (my.rows - 1) * my.vgap
+				};
+			};
+		}
+
+		// this creates the min and preferred size methods, as they
+		// only differ in the function they call.
+		that.preferred = typeLayout('preferred');
+		that.minimum = typeLayout('minimum');
+		that.maximum = typeLayout('maximum');
+		return that;
+	};
+})();
+
+/*!
+ * jLayout Flex Grid Layout - JavaScript Layout Algorithms v0.4
+ * Based on: http://www.javaworld.com/javaworld/javatips/jw-javatip121.html
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009, Bram Stein
+ * All rights reserved.
+ */
+/*global jLayout */
+(function () {
+	jLayout = typeof jLayout === 'undefined' ? {} : jLayout;
+
+	// The flex grid has a dependency on the grid layout, so please make
+	// sure you include the grid layout manager before the flex grid
+	// layout manager.
+	if (typeof jLayout.grid !== 'undefined') {
+		jLayout.flexGrid = function (spec) {
+			var my = {},
+				that = this.grid(spec, my);
+
+			function zeroArray(a, l) {
+				var i = 0;
+				for (; i < l; i += 1) {
+					a[i] = 0;
+				}
+				return a;
+			}
+
+			function typeLayout(type) {
+				return function (container) {
+					var i = 0, r = 0, c = 0, nw = 0, nh = 0,
+						w = zeroArray([], my.columns),
+						h = zeroArray([], my.rows),
+						type_size,
+						insets = container.insets();
+			
+					for (i = 0; i < my.items.length; i += 1) {
+						r = i / my.columns;
+						c = i % my.columns;
+						type_size = my.items[i][type + 'Size']();
+						if (w[c] < type_size.width) {
+							w[c] = type_size.width;
+						}
+						if (h[r] < type_size.height) {
+							h[r] = type_size.height;
+						}
+					}
+					for (i = 0; i < my.columns; i += 1) {
+						nw += w[i];
+					}
+					for (i = 0; i < my.rows; i += 1) {
+						nh += h[i];
+					}
+					return {
+						width: insets.left + insets.right + nw + (my.columns - 1) * my.hgap,
+						height: insets.top + insets.bottom + nh + (my.rows - 1) * my.vgap
+					};
+				};
+			}
+
+			that.preferred = typeLayout('preferred');
+			that.minimum = typeLayout('minimum');
+			that.maximum = typeLayout('maximum');
+
+			that.layout = function (container) {
+				var i = 0, c = 0, r = 0,
+					pd = that.preferred(container),
+					sw = container.bounds().width / pd.width,
+					sh = container.bounds().height / pd.height,
+					w = zeroArray([], my.columns),
+					h = zeroArray([], my.rows),
+					insets = container.insets(),
+					x = insets.left,
+					y = insets.top,
+					d;
+
+				for (i = 0; i < my.items.length; i += 1) {
+					r = i / my.columns;
+					c = i % my.columns;
+					d = my.items[i].preferredSize();
+					d.width = sw * d.width;
+					d.height = sh * d.height;
+
+					if (w[c] < d.width) {
+						w[c] = d.width;
+					}
+					if (h[r] < d.height) {
+						h[r] = d.height;
+					}
+				}
+
+				for (c = 0; c < my.columns; c += 1) {
+					for (r = 0, y = insets.top; r < my.rows; r += 1) {
+						i = r * my.columns + c;
+						if (i < my.items.length) {
+							my.items[i].bounds({'x': x, 'y': y, 'width': w[c], 'height': h[r]});
+							my.items[i].doLayout();
+						}
+						y += h[r] + my.vgap;
+					}
+					x += w[c] + my.hgap;
+				}
+
+				return container;
+			};
+			return that;
+		};
+	}
+})();
+/*!
+ * jLayout Flow Layout - JavaScript Layout Algorithms v0.12
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009, Bram Stein
+ * All rights reserved.
+ */
+/*global jLayout */
+(function () {
+	jLayout = typeof jLayout === 'undefined' ? {} : jLayout;
+
+	jLayout.flow = function (options) {
+		var my = {},
+			that = {};
+
+		
+		my.hgap = typeof options.hgap === 'number' && !isNaN(options.hgap) ? options.hgap : 5;
+		my.vgap = typeof options.vgap === 'number' && !isNaN(options.vgap) ? options.vgap : 5;
+		my.items = options.items || [];
+		my.alignment = (options.alignment && (options.alignment === 'center' || options.alignment === 'right' || options.alignment === 'left') && options.alignment) || 'left';		
+
+		that.items = function () {
+			var r = [];
+			Array.prototype.push.apply(r, my.items);
+			return r;
+		};
+
+		that.layout = function (container) {
+			var parentSize = container.bounds(),
+				insets = container.insets(),
+				i = 0,
+				len = my.items.length,
+				itemSize,
+				currentRow = [],
+				rowSize = {
+					width: 0,
+					height: 0
+				},
+				offset = {
+					x: insets.left,
+					y: insets.top
+				};
+
+			parentSize.width -= insets.left + insets.right;
+			parentSize.height -= insets.top + insets.bottom;
+
+			for (; i < len; i += 1) {
+				if (my.items[i].isVisible()) {
+					itemSize = my.items[i].preferredSize();
+					
+					if ((rowSize.width + itemSize.width) > parentSize.width) {
+						align(currentRow, offset, rowSize, parentSize);
+
+						currentRow = [];
+						offset.y += rowSize.height;
+						offset.x = insets.left;
+						rowSize.width = 0;
+						rowSize.height = 0;
+					}
+					rowSize.height = Math.max(rowSize.height, itemSize.height + my.vgap);
+					rowSize.width += itemSize.width + my.hgap;
+
+					currentRow.push(my.items[i]);
+				}
+			}
+			align(currentRow, offset, rowSize, parentSize);
+			return container;
+		};
+
+		function align(row, offset, rowSize, parentSize) {
+			var location = {
+					x: offset.x,
+					y: offset.y
+				},
+				i = 0,
+				len = row.length;
+
+			switch (my.alignment) {
+				case 'center': {
+					location.x += (my.hgap + parentSize.width - rowSize.width) / 2;
+					break;
+				}
+				case 'right': {
+					location.x += parentSize.width - rowSize.width + my.hgap;
+					break;
+				}
+			}
+
+			for (; i < len; i += 1) {
+				location.y = offset.y;
+				row[i].bounds(location);
+				row[i].doLayout();
+				location.x += row[i].bounds().width + my.hgap;
+			}
+		}
+
+		function typeLayout(type) {
+			return function (container) {
+				var i = 0, 
+					width = 0, 
+					height = 0, 
+					typeSize,
+					firstComponent = false,
+					insets = container.insets();
+
+				for (; i < my.items.length; i += 1) {
+					if (my.items[i].isVisible()) {
+						typeSize = my.items[i][type + 'Size']();
+						height = Math.max(height, typeSize.height);
+						width += typeSize.width;
+					}
+				}
+
+				return {
+					'width': width + insets.left + insets.right + (my.items.length - 1) * my.hgap,
+					'height': height + insets.top + insets.bottom
+				};
+			};
+		}
+
+		that.preferred = typeLayout('preferred');
+		that.minimum = typeLayout('minimum');
+		that.maximum = typeLayout('maximum');		
+
+		return that;
+	};
+})();
+
+/*!
+ * jLayout JQuery Plugin v0.17
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009 Bram Stein
+ * All rights reserved.
+ */
+/*global jQuery jLayout*/
+if (jQuery && jLayout) {
+	(function ($) {
+		/**
+		 * This wraps jQuery objects in another object that supplies
+		 * the methods required for the layout algorithms.
+		 */
+		function wrap(item, resize) {
+			var that = {};
+
+			$.each(['min', 'max'], function (i, name) {
+				that[name + 'imumSize'] = function (value) {
+                    var l = item.data('jlayout');
+                    
+					if (l) {
+						return l[name + 'imum'](that);
+					} else {
+						return item[name + 'Size'](value);
+					}
+				};
+			});
+
+			$.extend(that, {
+				doLayout: function () {
+                    var l = item.data('jlayout');
+                    
+					if (l) {
+                        l.layout(that);
+					}
+					item.css({position: 'absolute'});
+				},
+				isVisible: function () {
+					return item.isVisible();
+				},
+				insets: function () {
+					var p = item.padding(),
+						b = item.border();
+
+					return {
+                        'top': p.top, 
+						'bottom': p.bottom + b.bottom + b.top, 
+						'left': p.left, 
+						'right': p.right + b.right + b.left
+                    };
+				},
+				bounds: function (value) {
+					var tmp = {};
+
+					if (value) {
+						if (typeof value.x === 'number') {
+							tmp.left = value.x;
+						}
+						if (typeof value.y === 'number') {
+							tmp.top = value.y;
+						}
+						if (typeof value.width === 'number') {
+							tmp.width = (value.width - (item.outerWidth(true) - item.width()));
+							tmp.width = (tmp.width >= 0) ? tmp.width : 0;
+						}
+						if (typeof value.height === 'number') {
+							tmp.height = value.height - (item.outerHeight(true) - item.height());
+							tmp.height = (tmp.height >= 0) ? tmp.height : 0;
+						}
+						item.css(tmp);
+						return item;
+					} else {
+						tmp = item.position();
+						return {
+                          	'x': tmp.left,
+                        	'y': tmp.top,
+							'width': item.outerWidth(false),
+							'height': item.outerHeight(false)
+                        };
+					}
+				},
+				preferredSize: function () {
+					var minSize,
+						maxSize,
+						margin = item.margin(),
+						size = {width: 0, height: 0},
+                        l = item.data('jlayout');
+
+					if (l && resize) {
+						size = l.preferred(that);
+
+						minSize = that.minimumSize();
+						maxSize = that.maximumSize();
+
+						size.width += margin.left + margin.right;
+						size.height += margin.top + margin.bottom;
+
+						if (size.width < minSize.width || size.height < minSize.height) {
+							size.width = Math.max(size.width, minSize.width);
+							size.height = Math.max(size.height, minSize.height);
+						} else if (size.width > maxSize.width || size.height > maxSize.height) {
+							size.width = Math.min(size.width, maxSize.width);
+							size.height = Math.min(size.height, maxSize.height);
+						}
+					} else {
+                        size = that.bounds();
+						size.width += margin.left + margin.right;
+						size.height += margin.top + margin.bottom;
+					}
+					return size;
+				}
+			});
+			return that;
+		}
+
+		$.fn.layout = function (options) {
+			var opts = $.extend({}, $.fn.layout.defaults, options);
+			return $.each(this, function () {
+				var element = $(this),
+					o = $.metadata && element.metadata().layout ? $.extend(opts, element.metadata().layout) : opts,
+					elementWrapper = wrap(element, o.resize);
+
+				if (o.type === 'border' && typeof jLayout.border !== 'undefined') {                
+					$.each(['north', 'south', 'west', 'east', 'center'], function (i, name) {
+						if (element.children().hasClass(name)) {
+							o[name] = wrap(element.children('.' + name + ':first'));
+						}
+					});
+					element.data('jlayout', jLayout.border(o));
+				} else if (o.type === 'grid' && typeof jLayout.grid !== 'undefined') {
+					o.items = [];
+					element.children().each(function (i) {
+						if (!$(this).hasClass('ui-resizable-handle')) {
+							o.items[i] = wrap($(this));
+						}
+					});
+					element.data('jlayout', jLayout.grid(o));
+				} else if (o.type === 'flexGrid' && typeof jLayout.flexGrid !== 'undefined') {
+					o.items = [];
+					element.children().each(function (i) {
+						if (!$(this).hasClass('ui-resizable-handle')) {
+							o.items[i] = wrap($(this));
+						}
+					});
+					element.data('jlayout', jLayout.flexGrid(o));
+				} else if (o.type === 'column' && typeof jLayout.column !== 'undefined') {
+					o.items = [];
+					element.children().each(function (i) {
+						if (!$(this).hasClass('ui-resizable-handle')) {
+							o.items[i] = wrap($(this));
+						}
+					});
+					element.data('jlayout', jLayout.column(o));
+				} else if (o.type === 'flow' && typeof jLayout.flow !== 'undefined') {
+					o.items = [];
+					element.children().each(function (i) {
+						if (!$(this).hasClass('ui-resizable-handle')) {
+							o.items[i] = wrap($(this));
+						}
+					});
+					element.data('jlayout', jLayout.flow(o));					
+				}
+                
+				if (o.resize) {
+					elementWrapper.bounds(elementWrapper.preferredSize());
+				}
+                
+				elementWrapper.doLayout();
+				element.css({position: 'relative'});
+				if ($.ui !== undefined) {
+					element.addClass('ui-widget');
+				}
+			});
+		};
+
+		$.fn.layout.defaults = {
+			resize: true,
+			type: 'grid'
+		};
+	})(jQuery);
+}
+/*
+* jQuery Mobile Framework Git Build: SHA1: e30428803d6e0bfc2165ec9a2d26cd93a0f3a8e6 <> Date: Thu Apr 5 16:35:09 2012 +0900
+* http://jquerymobile.com
+*
+* Copyright 2011 (c) jQuery Project
+* Dual licensed under the MIT or GPL Version 2 licenses.
+* http://jquery.org/license
+*
+*/
+/*!
+ * jQuery UI Widget @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+	var _cleanData = $.cleanData;
+	$.cleanData = function( elems ) {
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			$( elem ).triggerHandler( "remove" );
+		}
+		_cleanData( elems );
+	};
+} else {
+	var _remove = $.fn.remove;
+	$.fn.remove = function( selector, keepData ) {
+		return this.each(function() {
+			if ( !keepData ) {
+				if ( !selector || $.filter( selector, [ this ] ).length ) {
+					$( "*", this ).add( [ this ] ).each(function() {
+						$( this ).triggerHandler( "remove" );
+					});
+				}
+			}
+			return _remove.call( $(this), selector, keepData );
+		});
+	};
+}
+
+$.widget = function( name, base, prototype ) {
+	var namespace = name.split( "." )[ 0 ],
+		fullName;
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName ] = function( elem ) {
+		return !!$.data( elem, name );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	$[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without initializing for simple inheritance
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+
+	var basePrototype = new base();
+	// we need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+//	$.each( basePrototype, function( key, val ) {
+//		if ( $.isPlainObject(val) ) {
+//			basePrototype[ key ] = $.extend( {}, val );
+//		}
+//	});
+	basePrototype.options = $.extend( true, {}, basePrototype.options );
+	$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+		namespace: namespace,
+		widgetName: name,
+		widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+		widgetBaseClass: fullName
+	}, prototype );
+
+	$.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = Array.prototype.slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.extend.apply( null, [ true, options ].concat(args) ) :
+			options;
+
+		// prevent calls to internal methods
+		if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+			return returnValue;
+		}
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var instance = $.data( this, name );
+				if ( !instance ) {
+					throw "cannot call methods on " + name + " prior to initialization; " +
+						"attempted to call method '" + options + "'";
+				}
+				if ( !$.isFunction( instance[options] ) ) {
+					throw "no such method '" + options + "' for " + name + " widget instance";
+				}
+				var methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, name );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					$.data( this, name, new object( options, this ) );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( options, element ) {
+	// allow instantiation without initializing for simple inheritance
+	if ( arguments.length ) {
+		this._createWidget( options, element );
+	}
+};
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	options: {
+		disabled: false
+	},
+	_createWidget: function( options, element ) {
+		// $.widget.bridge stores the plugin instance, but we do it anyway
+		// so that it's stored even before the _create function runs
+		$.data( element, this.widgetName, this );
+		this.element = $( element );
+		this.options = $.extend( true, {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		var self = this;
+		this.element.bind( "remove." + this.widgetName, function() {
+			self.destroy();
+		});
+
+		this._create();
+		this._trigger( "create" );
+		this._init();
+	},
+	_getCreateOptions: function() {
+		var options = {};
+		if ( $.metadata ) {
+			options = $.metadata.get( element )[ this.widgetName ];
+		}
+		return options;
+	},
+	_create: function() {},
+	_init: function() {},
+
+	destroy: function() {
+		this.element
+			.unbind( "." + this.widgetName )
+			.removeData( this.widgetName );
+		this.widget()
+			.unbind( "." + this.widgetName )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetBaseClass + "-disabled " +
+				"ui-state-disabled" );
+	},
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.extend( {}, this.options );
+		}
+
+		if  (typeof key === "string" ) {
+			if ( value === undefined ) {
+				return this.options[ key ];
+			}
+			options = {};
+			options[ key ] = value;
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var self = this;
+		$.each( options, function( key, value ) {
+			self._setOption( key, value );
+		});
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				[ value ? "addClass" : "removeClass"](
+					this.widgetBaseClass + "-disabled" + " " +
+					"ui-state-disabled" )
+				.attr( "aria-disabled", value );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_trigger: function( type, event, data ) {
+		var callback = this.options[ type ];
+
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		data = data || {};
+
+		// copy original event properties over to the new event
+		// this would happen if we could call $.event.fix instead of $.Event
+		// but we don't have a way to force an event to be fixed multiple times
+		if ( event.originalEvent ) {
+			for ( var i = $.event.props.length, prop; i; ) {
+				prop = $.event.props[ --i ];
+				event[ prop ] = event.originalEvent[ prop ];
+			}
+		}
+
+		this.element.trigger( event, data );
+
+		return !( $.isFunction(callback) &&
+			callback.call( this.element[0], event, data ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+})( jQuery );
+/*
+* widget factory extentions for mobile
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.widget", {
+	// decorate the parent _createWidget to trigger `widgetinit` for users
+	// who wish to do post post `widgetcreate` alterations/additions
+	//
+	// TODO create a pull request for jquery ui to trigger this event
+	// in the original _createWidget
+	_createWidget: function() {
+		$.Widget.prototype._createWidget.apply( this, arguments );
+		this._trigger( 'init' );
+	},
+
+	_getCreateOptions: function() {
+
+		var elem = this.element,
+			options = {};
+
+		$.each( this.options, function( option ) {
+
+			var value = elem.jqmData( option.replace( /[A-Z]/g, function( c ) {
+							return "-" + c.toLowerCase();
+						})
+					);
+
+			if ( value !== undefined ) {
+				options[ option ] = value;
+			}
+		});
+
+		return options;
+	},
+
+	enhanceWithin: function( target ) {
+		// TODO remove dependency on the page widget for the keepNative.
+		// Currently the keepNative value is defined on the page prototype so
+		// the method is as well
+		var page = $(target).closest(":jqmData(role='page')").data( "page" ),
+			keepNative = (page && page.keepNativeSelector()) || "";
+
+		$( this.options.initSelector, target ).not( keepNative )[ this.widgetName ]();
+	}
+});
+
+})( jQuery );
+/*
+* a workaround for window.matchMedia
+*/
+
+(function( $, undefined ) {
+
+var $window = $( window ),
+	$html = $( "html" );
+
+/* $.mobile.media method: pass a CSS media type or query and get a bool return
+	note: this feature relies on actual media query support for media queries, though types will work most anywhere
+	examples:
+		$.mobile.media('screen') //>> tests for screen media type
+		$.mobile.media('screen and (min-width: 480px)') //>> tests for screen media type with window width > 480px
+		$.mobile.media('@media screen and (-webkit-min-device-pixel-ratio: 2)') //>> tests for webkit 2x pixel ratio (iPhone 4)
+*/
+$.mobile.media = (function() {
+	// TODO: use window.matchMedia once at least one UA implements it
+	var cache = {},
+		testDiv = $( "<div id='jquery-mediatest'>" ),
+		fakeBody = $( "<body>" ).append( testDiv );
+
+	return function( query ) {
+		if ( !( query in cache ) ) {
+			var styleBlock = document.createElement( "style" ),
+				cssrule = "@media " + query + " { #jquery-mediatest { position:absolute; } }";
+
+			//must set type for IE!
+			styleBlock.type = "text/css";
+
+			if ( styleBlock.styleSheet  ){
+				styleBlock.styleSheet.cssText = cssrule;
+			} else {
+				styleBlock.appendChild( document.createTextNode(cssrule) );
+			}
+
+			$html.prepend( fakeBody ).prepend( styleBlock );
+			cache[ query ] = testDiv.css( "position" ) === "absolute";
+			fakeBody.add( styleBlock ).remove();
+		}
+		return cache[ query ];
+	};
+})();
+
+})(jQuery);
+/*
+* support tests
+*/
+
+(function( $, undefined ) {
+
+var fakeBody = $( "<body>" ).prependTo( "html" ),
+	fbCSS = fakeBody[ 0 ].style,
+	vendors = [ "Webkit", "Moz", "O" ],
+	webos = "palmGetResource" in window, //only used to rule out scrollTop
+	operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]",
+	bb = window.blackberry; //only used to rule out box shadow, as it's filled opaque on BB
+
+// thx Modernizr
+function propExists( prop ) {
+	var uc_prop = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 ),
+		props = ( prop + " " + vendors.join( uc_prop + " " ) + uc_prop ).split( " " );
+
+	for ( var v in props ){
+		if ( fbCSS[ props[ v ] ] !== undefined ) {
+			return true;
+		}
+	}
+}
+
+// Test for dynamic-updating base tag support ( allows us to avoid href,src attr rewriting )
+function baseTagTest() {
+	var fauxBase = location.protocol + "//" + location.host + location.pathname + "ui-dir/",
+		base = $( "head base" ),
+		fauxEle = null,
+		href = "",
+		link, rebase;
+
+	if ( !base.length ) {
+		base = fauxEle = $( "<base>", { "href": fauxBase }).appendTo( "head" );
+	} else {
+		href = base.attr( "href" );
+	}
+
+	link = $( "<a href='testurl' />" ).prependTo( fakeBody );
+	rebase = link[ 0 ].href;
+	base[ 0 ].href = href || location.pathname;
+
+	if ( fauxEle ) {
+		fauxEle.remove();
+	}
+	return rebase.indexOf( fauxBase ) === 0;
+}
+
+
+// non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683
+// allows for inclusion of IE 6+, including Windows Mobile 7
+$.mobile.browser = {};
+$.mobile.browser.ie = (function() {
+	var v = 3,
+	div = document.createElement( "div" ),
+	a = div.all || [];
+
+	while ( div.innerHTML = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->", a[ 0 ] );
+
+	return v > 4 ? v : !v;
+})();
+
+
+$.extend( $.support, {
+	orientation: "orientation" in window && "onorientationchange" in window,
+	touch: "ontouchend" in document,
+	cssTransitions: "WebKitTransitionEvent" in window,
+	pushState: "pushState" in history && "replaceState" in history,
+	mediaquery: $.mobile.media( "only all" ),
+	cssPseudoElement: !!propExists( "content" ),
+	touchOverflow: !!propExists( "overflowScrolling" ),
+	boxShadow: !!propExists( "boxShadow" ) && !bb,
+	scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos && !operamini,
+	dynamicBaseTag: baseTagTest()
+});
+
+fakeBody.remove();
+
+
+// $.mobile.ajaxBlacklist is used to override ajaxEnabled on platforms that have known conflicts with hash history updates (BB5, Symbian)
+// or that generally work better browsing in regular http for full page refreshes (Opera Mini)
+// Note: This detection below is used as a last resort.
+// We recommend only using these detection methods when all other more reliable/forward-looking approaches are not possible
+var nokiaLTE7_3 = (function(){
+
+	var ua = window.navigator.userAgent;
+
+	//The following is an attempt to match Nokia browsers that are running Symbian/s60, with webkit, version 7.3 or older
+	return ua.indexOf( "Nokia" ) > -1 &&
+			( ua.indexOf( "Symbian/3" ) > -1 || ua.indexOf( "Series60/5" ) > -1 ) &&
+			ua.indexOf( "AppleWebKit" ) > -1 &&
+			ua.match( /(BrowserNG|NokiaBrowser)\/7\.[0-3]/ );
+})();
+
+$.mobile.ajaxBlacklist =
+			// BlackBerry browsers, pre-webkit
+			window.blackberry && !window.WebKitPoint ||
+			// Opera Mini
+			operamini ||
+			// Symbian webkits pre 7.3
+			nokiaLTE7_3;
+
+// Lastly, this workaround is the only way we've found so far to get pre 7.3 Symbian webkit devices
+// to render the stylesheets when they're referenced before this script, as we'd recommend doing.
+// This simply reappends the CSS in place, which for some reason makes it apply
+if ( nokiaLTE7_3 ) {
+	$(function() {
+		$( "head link[rel='stylesheet']" ).attr( "rel", "alternate stylesheet" ).attr( "rel", "stylesheet" );
+	});
+}
+
+// For ruling out shadows via css
+if ( !$.support.boxShadow ) {
+	$( "html" ).addClass( "ui-mobile-nosupport-boxshadow" );
+}
+
+})( jQuery );
+/*
+* "mouse" plugin
+*/
+
+// This plugin is an experiment for abstracting away the touch and mouse
+// events so that developers don't have to worry about which method of input
+// the device their document is loaded on supports.
+//
+// The idea here is to allow the developer to register listeners for the
+// basic mouse events, such as mousedown, mousemove, mouseup, and click,
+// and the plugin will take care of registering the correct listeners
+// behind the scenes to invoke the listener at the fastest possible time
+// for that device, while still retaining the order of event firing in
+// the traditional mouse environment, should multiple handlers be registered
+// on the same element for different events.
+//
+// The current version exposes the following virtual events to jQuery bind methods:
+// "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel"
+
+(function( $, window, document, undefined ) {
+
+var dataPropertyName = "virtualMouseBindings",
+	touchTargetPropertyName = "virtualTouchID",
+	virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split( " " ),
+	touchEventProps = "clientX clientY pageX pageY screenX screenY".split( " " ),
+	activeDocHandlers = {},
+	resetTimerID = 0,
+	startX = 0,
+	startY = 0,
+	didScroll = false,
+	clickBlockList = [],
+	blockMouseTriggers = false,
+	blockTouchTriggers = false,
+	eventCaptureSupported = "addEventListener" in document,
+	$document = $( document ),
+	nextTouchID = 1,
+	lastTouchID = 0;
+
+$.vmouse = {
+	moveDistanceThreshold: 10,
+	clickDistanceThreshold: 10,
+	resetTimerDuration: 1500
+};
+
+function getNativeEvent( event ) {
+
+	while ( event && typeof event.originalEvent !== "undefined" ) {
+		event = event.originalEvent;
+	}
+	return event;
+}
+
+function createVirtualEvent( event, eventType ) {
+
+	var t = event.type,
+		oe, props, ne, prop, ct, touch, i, j;
+
+	event = $.Event(event);
+	event.type = eventType;
+
+	oe = event.originalEvent;
+	props = $.event.props;
+
+	// copy original event properties over to the new event
+	// this would happen if we could call $.event.fix instead of $.Event
+	// but we don't have a way to force an event to be fixed multiple times
+	if ( oe ) {
+		for ( i = props.length, prop; i; ) {
+			prop = props[ --i ];
+			event[ prop ] = oe[ prop ];
+		}
+	}
+
+	// make sure that if the mouse and click virtual events are generated
+	// without a .which one is defined
+	if ( t.search(/mouse(down|up)|click/) > -1 && !event.which ){
+		event.which = 1;
+	}
+
+	if ( t.search(/^touch/) !== -1 ) {
+		ne = getNativeEvent( oe );
+		t = ne.touches;
+		ct = ne.changedTouches;
+		touch = ( t && t.length ) ? t[0] : ( (ct && ct.length) ? ct[ 0 ] : undefined );
+
+		if ( touch ) {
+			for ( j = 0, len = touchEventProps.length; j < len; j++){
+				prop = touchEventProps[ j ];
+				event[ prop ] = touch[ prop ];
+			}
+		}
+	}
+
+	return event;
+}
+
+function getVirtualBindingFlags( element ) {
+
+	var flags = {},
+		b, k;
+
+	while ( element ) {
+
+		b = $.data( element, dataPropertyName );
+
+		for (  k in b ) {
+			if ( b[ k ] ) {
+				flags[ k ] = flags.hasVirtualBinding = true;
+			}
+		}
+		element = element.parentNode;
+	}
+	return flags;
+}
+
+function getClosestElementWithVirtualBinding( element, eventType ) {
+	var b;
+	while ( element ) {
+
+		b = $.data( element, dataPropertyName );
+
+		if ( b && ( !eventType || b[ eventType ] ) ) {
+			return element;
+		}
+		element = element.parentNode;
+	}
+	return null;
+}
+
+function enableTouchBindings() {
+	blockTouchTriggers = false;
+}
+
+function disableTouchBindings() {
+	blockTouchTriggers = true;
+}
+
+function enableMouseBindings() {
+	lastTouchID = 0;
+	clickBlockList.length = 0;
+	blockMouseTriggers = false;
+
+	// When mouse bindings are enabled, our
+	// touch bindings are disabled.
+	disableTouchBindings();
+}
+
+function disableMouseBindings() {
+	// When mouse bindings are disabled, our
+	// touch bindings are enabled.
+	enableTouchBindings();
+}
+
+function startResetTimer() {
+	clearResetTimer();
+	resetTimerID = setTimeout(function(){
+		resetTimerID = 0;
+		enableMouseBindings();
+	}, $.vmouse.resetTimerDuration );
+}
+
+function clearResetTimer() {
+	if ( resetTimerID ){
+		clearTimeout( resetTimerID );
+		resetTimerID = 0;
+	}
+}
+
+function triggerVirtualEvent( eventType, event, flags ) {
+	var ve;
+
+	if ( ( flags && flags[ eventType ] ) ||
+				( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) {
+
+		ve = createVirtualEvent( event, eventType );
+
+		$( event.target).trigger( ve );
+	}
+
+	return ve;
+}
+
+function mouseEventCallback( event ) {
+	var touchID = $.data(event.target, touchTargetPropertyName);
+
+	if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ){
+		var ve = triggerVirtualEvent( "v" + event.type, event );
+		if ( ve ) {
+			if ( ve.isDefaultPrevented() ) {
+				event.preventDefault();
+			}
+			if ( ve.isPropagationStopped() ) {
+				event.stopPropagation();
+			}
+			if ( ve.isImmediatePropagationStopped() ) {
+				event.stopImmediatePropagation();
+			}
+		}
+	}
+}
+
+function handleTouchStart( event ) {
+
+	var touches = getNativeEvent( event ).touches,
+		target, flags;
+
+	if ( touches && touches.length === 1 ) {
+
+		target = event.target;
+		flags = getVirtualBindingFlags( target );
+
+		if ( flags.hasVirtualBinding ) {
+
+			lastTouchID = nextTouchID++;
+			$.data( target, touchTargetPropertyName, lastTouchID );
+
+			clearResetTimer();
+
+			disableMouseBindings();
+			didScroll = false;
+
+			var t = getNativeEvent( event ).touches[ 0 ];
+			startX = t.pageX;
+			startY = t.pageY;
+
+			triggerVirtualEvent( "vmouseover", event, flags );
+			triggerVirtualEvent( "vmousedown", event, flags );
+		}
+	}
+}
+
+function handleScroll( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	if ( !didScroll ) {
+		triggerVirtualEvent( "vmousecancel", event, getVirtualBindingFlags( event.target ) );
+	}
+
+	didScroll = true;
+	startResetTimer();
+}
+
+function handleTouchMove( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	var t = getNativeEvent( event ).touches[ 0 ],
+		didCancel = didScroll,
+		moveThreshold = $.vmouse.moveDistanceThreshold;
+		didScroll = didScroll ||
+			( Math.abs(t.pageX - startX) > moveThreshold ||
+				Math.abs(t.pageY - startY) > moveThreshold ),
+		flags = getVirtualBindingFlags( event.target );
+
+	if ( didScroll && !didCancel ) {
+		triggerVirtualEvent( "vmousecancel", event, flags );
+	}
+
+	triggerVirtualEvent( "vmousemove", event, flags );
+	startResetTimer();
+}
+
+function handleTouchEnd( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	disableTouchBindings();
+
+	var flags = getVirtualBindingFlags( event.target ),
+		t;
+	triggerVirtualEvent( "vmouseup", event, flags );
+
+	if ( !didScroll ) {
+		var ve = triggerVirtualEvent( "vclick", event, flags );
+		if ( ve && ve.isDefaultPrevented() ) {
+			// The target of the mouse events that follow the touchend
+			// event don't necessarily match the target used during the
+			// touch. This means we need to rely on coordinates for blocking
+			// any click that is generated.
+			t = getNativeEvent( event ).changedTouches[ 0 ];
+			clickBlockList.push({
+				touchID: lastTouchID,
+				x: t.clientX,
+				y: t.clientY
+			});
+
+			// Prevent any mouse events that follow from triggering
+			// virtual event notifications.
+			blockMouseTriggers = true;
+		}
+	}
+	triggerVirtualEvent( "vmouseout", event, flags);
+	didScroll = false;
+
+	startResetTimer();
+}
+
+function hasVirtualBindings( ele ) {
+	var bindings = $.data( ele, dataPropertyName ),
+		k;
+
+	if ( bindings ) {
+		for ( k in bindings ) {
+			if ( bindings[ k ] ) {
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+function dummyMouseHandler(){}
+
+function getSpecialEventObject( eventType ) {
+	var realType = eventType.substr( 1 );
+
+	return {
+		setup: function( data, namespace ) {
+			// If this is the first virtual mouse binding for this element,
+			// add a bindings object to its data.
+
+			if ( !hasVirtualBindings( this ) ) {
+				$.data( this, dataPropertyName, {});
+			}
+
+			// If setup is called, we know it is the first binding for this
+			// eventType, so initialize the count for the eventType to zero.
+			var bindings = $.data( this, dataPropertyName );
+			bindings[ eventType ] = true;
+
+			// If this is the first virtual mouse event for this type,
+			// register a global handler on the document.
+
+			activeDocHandlers[ eventType ] = ( activeDocHandlers[ eventType ] || 0 ) + 1;
+
+			if ( activeDocHandlers[ eventType ] === 1 ) {
+				$document.bind( realType, mouseEventCallback );
+			}
+
+			// Some browsers, like Opera Mini, won't dispatch mouse/click events
+			// for elements unless they actually have handlers registered on them.
+			// To get around this, we register dummy handlers on the elements.
+
+			$( this ).bind( realType, dummyMouseHandler );
+
+			// For now, if event capture is not supported, we rely on mouse handlers.
+			if ( eventCaptureSupported ) {
+				// If this is the first virtual mouse binding for the document,
+				// register our touchstart handler on the document.
+
+				activeDocHandlers[ "touchstart" ] = ( activeDocHandlers[ "touchstart" ] || 0) + 1;
+
+				if (activeDocHandlers[ "touchstart" ] === 1) {
+					$document.bind( "touchstart", handleTouchStart )
+						.bind( "touchend", handleTouchEnd )
+
+						// On touch platforms, touching the screen and then dragging your finger
+						// causes the window content to scroll after some distance threshold is
+						// exceeded. On these platforms, a scroll prevents a click event from being
+						// dispatched, and on some platforms, even the touchend is suppressed. To
+						// mimic the suppression of the click event, we need to watch for a scroll
+						// event. Unfortunately, some platforms like iOS don't dispatch scroll
+						// events until *AFTER* the user lifts their finger (touchend). This means
+						// we need to watch both scroll and touchmove events to figure out whether
+						// or not a scroll happenens before the touchend event is fired.
+
+						.bind( "touchmove", handleTouchMove )
+						.bind( "scroll", handleScroll );
+				}
+			}
+		},
+
+		teardown: function( data, namespace ) {
+			// If this is the last virtual binding for this eventType,
+			// remove its global handler from the document.
+
+			--activeDocHandlers[ eventType ];
+
+			if ( !activeDocHandlers[ eventType ] ) {
+				$document.unbind( realType, mouseEventCallback );
+			}
+
+			if ( eventCaptureSupported ) {
+				// If this is the last virtual mouse binding in existence,
+				// remove our document touchstart listener.
+
+				--activeDocHandlers[ "touchstart" ];
+
+				if ( !activeDocHandlers[ "touchstart" ] ) {
+					$document.unbind( "touchstart", handleTouchStart )
+						.unbind( "touchmove", handleTouchMove )
+						.unbind( "touchend", handleTouchEnd )
+						.unbind( "scroll", handleScroll );
+				}
+			}
+
+			var $this = $( this ),
+				bindings = $.data( this, dataPropertyName );
+
+			// teardown may be called when an element was
+			// removed from the DOM. If this is the case,
+			// jQuery core may have already stripped the element
+			// of any data bindings so we need to check it before
+			// using it.
+			if ( bindings ) {
+				bindings[ eventType ] = false;
+			}
+
+			// Unregister the dummy event handler.
+
+			$this.unbind( realType, dummyMouseHandler );
+
+			// If this is the last virtual mouse binding on the
+			// element, remove the binding data from the element.
+
+			if ( !hasVirtualBindings( this ) ) {
+				$this.removeData( dataPropertyName );
+			}
+		}
+	};
+}
+
+// Expose our custom events to the jQuery bind/unbind mechanism.
+
+for ( var i = 0; i < virtualEventNames.length; i++ ){
+	$.event.special[ virtualEventNames[ i ] ] = getSpecialEventObject( virtualEventNames[ i ] );
+}
+
+// Add a capture click handler to block clicks.
+// Note that we require event capture support for this so if the device
+// doesn't support it, we punt for now and rely solely on mouse events.
+if ( eventCaptureSupported ) {
+	document.addEventListener( "click", function( e ){
+		var cnt = clickBlockList.length,
+			target = e.target,
+			x, y, ele, i, o, touchID;
+
+		if ( cnt ) {
+			x = e.clientX;
+			y = e.clientY;
+			threshold = $.vmouse.clickDistanceThreshold;
+
+			// The idea here is to run through the clickBlockList to see if
+			// the current click event is in the proximity of one of our
+			// vclick events that had preventDefault() called on it. If we find
+			// one, then we block the click.
+			//
+			// Why do we have to rely on proximity?
+			//
+			// Because the target of the touch event that triggered the vclick
+			// can be different from the target of the click event synthesized
+			// by the browser. The target of a mouse/click event that is syntehsized
+			// from a touch event seems to be implementation specific. For example,
+			// some browsers will fire mouse/click events for a link that is near
+			// a touch event, even though the target of the touchstart/touchend event
+			// says the user touched outside the link. Also, it seems that with most
+			// browsers, the target of the mouse/click event is not calculated until the
+			// time it is dispatched, so if you replace an element that you touched
+			// with another element, the target of the mouse/click will be the new
+			// element underneath that point.
+			//
+			// Aside from proximity, we also check to see if the target and any
+			// of its ancestors were the ones that blocked a click. This is necessary
+			// because of the strange mouse/click target calculation done in the
+			// Android 2.1 browser, where if you click on an element, and there is a
+			// mouse/click handler on one of its ancestors, the target will be the
+			// innermost child of the touched element, even if that child is no where
+			// near the point of touch.
+
+			ele = target;
+
+			while ( ele ) {
+				for ( i = 0; i < cnt; i++ ) {
+					o = clickBlockList[ i ];
+					touchID = 0;
+
+					if ( ( ele === target && Math.abs( o.x - x ) < threshold && Math.abs( o.y - y ) < threshold ) ||
+								$.data( ele, touchTargetPropertyName ) === o.touchID ) {
+						// XXX: We may want to consider removing matches from the block list
+						//      instead of waiting for the reset timer to fire.
+						e.preventDefault();
+						e.stopPropagation();
+						return;
+					}
+				}
+				ele = ele.parentNode;
+			}
+		}
+	}, true);
+}
+})( jQuery, window, document );
+/* 
+* "events" plugin - Handles events
+*/
+
+(function( $, window, undefined ) {
+
+// add new event shortcuts
+$.each( ( "touchstart touchmove touchend orientationchange throttledresize " +
+					"tap taphold swipe swipeleft swiperight scrollstart scrollstop" ).split( " " ), function( i, name ) {
+
+	$.fn[ name ] = function( fn ) {
+		return fn ? this.bind( name, fn ) : this.trigger( name );
+	};
+
+	$.attrFn[ name ] = true;
+});
+
+var supportTouch = $.support.touch,
+	scrollEvent = "touchmove scroll",
+	touchStartEvent = supportTouch ? "touchstart" : "mousedown",
+	touchStopEvent = supportTouch ? "touchend" : "mouseup",
+	touchMoveEvent = supportTouch ? "touchmove" : "mousemove";
+
+function triggerCustomEvent( obj, eventType, event ) {
+	var originalType = event.type;
+	event.type = eventType;
+
+	// event.liveFired is already set by basic events e.g. vclick,
+	// which is fired already.
+	// To fire this custom event, event.liveFired must be cleared.
+	event.liveFired = undefined;
+
+	$.event.handle.call( obj, event );
+	event.type = originalType;
+}
+
+// also handles scrollstop
+$.event.special.scrollstart = {
+
+	enabled: true,
+
+	setup: function() {
+
+		var thisObject = this,
+			$this = $( thisObject ),
+			scrolling,
+			timer;
+
+		function trigger( event, state ) {
+			scrolling = state;
+			triggerCustomEvent( thisObject, scrolling ? "scrollstart" : "scrollstop", event );
+		}
+
+		// iPhone triggers scroll after a small delay; use touchmove instead
+		$this.bind( scrollEvent, function( event ) {
+
+			if ( !$.event.special.scrollstart.enabled ) {
+				return;
+			}
+
+			if ( !scrolling ) {
+				trigger( event, true );
+			}
+
+			clearTimeout( timer );
+			timer = setTimeout(function() {
+				trigger( event, false );
+			}, 50 );
+		});
+	}
+};
+
+// also handles taphold
+$.event.special.tap = {
+	setup: function() {
+		var thisObject = this,
+			$this = $( thisObject );
+
+		$this.bind( "vmousedown", function( event ) {
+
+			if ( event.which && event.which !== 1 ) {
+				return false;
+			}
+
+			var origTarget = event.target,
+				origEvent = event.originalEvent,
+				timer;
+
+			function clearTapTimer() {
+				clearTimeout( timer );
+			}
+
+			function clearTapHandlers() {
+				clearTapTimer();
+
+				$this.unbind( "vclick", clickHandler )
+					.unbind( "vmouseup", clearTapTimer )
+					.unbind( "vmousecancel", clearTapHandlers );
+			}
+
+			function clickHandler(event) {
+				clearTapHandlers();
+
+				// ONLY trigger a 'tap' event if the start target is
+				// the same as the stop target.
+				if ( origTarget == event.target ) {
+					triggerCustomEvent( thisObject, "tap", event );
+				}
+			}
+
+			$this.bind( "vmousecancel", clearTapHandlers )
+				.bind( "vmouseup", clearTapTimer )
+				.bind( "vclick", clickHandler );
+
+			timer = setTimeout(function() {
+					triggerCustomEvent( thisObject, "taphold", $.Event( "taphold" ) );
+			}, 750 );
+		});
+	}
+};
+
+// also handles swipeleft, swiperight
+$.event.special.swipe = {
+	scrollSupressionThreshold: 10, // More than this horizontal displacement, and we will suppress scrolling.
+
+	durationThreshold: 1000, // More time than this, and it isn't a swipe.
+
+	horizontalDistanceThreshold: 30,  // Swipe horizontal displacement must be more than this.
+
+	verticalDistanceThreshold: 75,  // Swipe vertical displacement must be less than this.
+
+	setup: function() {
+		var thisObject = this,
+			$this = $( thisObject );
+
+		$this.bind( touchStartEvent, function( event ) {
+			var data = event.originalEvent.touches ?
+								event.originalEvent.touches[ 0 ] : event,
+				start = {
+					time: ( new Date() ).getTime(),
+					coords: [ data.pageX, data.pageY ],
+					origin: $( event.target )
+				},
+				stop;
+
+			function moveHandler( event ) {
+
+				if ( !start ) {
+					return;
+				}
+
+				var data = event.originalEvent.touches ?
+						event.originalEvent.touches[ 0 ] : event;
+
+				stop = {
+					time: ( new Date() ).getTime(),
+					coords: [ data.pageX, data.pageY ]
+				};
+
+				// prevent scrolling
+				if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
+					event.preventDefault();
+				}
+			}
+
+			$this.bind( touchMoveEvent, moveHandler )
+				.one( touchStopEvent, function( event ) {
+					$this.unbind( touchMoveEvent, moveHandler );
+
+					if ( start && stop ) {
+						if ( stop.time - start.time < $.event.special.swipe.durationThreshold &&
+								Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold &&
+								Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) {
+
+							start.origin.trigger( "swipe" )
+								.trigger( start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight" );
+						}
+					}
+					start = stop = undefined;
+				});
+		});
+	}
+};
+
+(function( $, window ) {
+	// "Cowboy" Ben Alman
+
+	var win = $( window ),
+		special_event,
+		get_orientation,
+		last_orientation;
+
+	$.event.special.orientationchange = special_event = {
+		setup: function() {
+			// If the event is supported natively, return false so that jQuery
+			// will bind to the event using DOM methods.
+			if ( $.support.orientation && $.mobile.orientationChangeEnabled ) {
+				return false;
+			}
+
+			// Get the current orientation to avoid initial double-triggering.
+			last_orientation = get_orientation();
+
+			// Because the orientationchange event doesn't exist, simulate the
+			// event by testing window dimensions on resize.
+			win.bind( "throttledresize", handler );
+		},
+		teardown: function(){
+			// If the event is not supported natively, return false so that
+			// jQuery will unbind the event using DOM methods.
+			if ( $.support.orientation && $.mobile.orientationChangeEnabled ) {
+				return false;
+			}
+
+			// Because the orientationchange event doesn't exist, unbind the
+			// resize event handler.
+			win.unbind( "throttledresize", handler );
+		},
+		add: function( handleObj ) {
+			// Save a reference to the bound event handler.
+			var old_handler = handleObj.handler;
+
+
+			handleObj.handler = function( event ) {
+				// Modify event object, adding the .orientation property.
+				event.orientation = get_orientation();
+
+				// Call the originally-bound event handler and return its result.
+				return old_handler.apply( this, arguments );
+			};
+		}
+	};
+
+	// If the event is not supported natively, this handler will be bound to
+	// the window resize event to simulate the orientationchange event.
+	function handler() {
+		// Get the current orientation.
+		var orientation = get_orientation();
+
+		if ( orientation !== last_orientation ) {
+			// The orientation has changed, so trigger the orientationchange event.
+			last_orientation = orientation;
+			win.trigger( "orientationchange" );
+		}
+	}
+
+	// Get the current page orientation. This method is exposed publicly, should it
+	// be needed, as jQuery.event.special.orientationchange.orientation()
+	$.event.special.orientationchange.orientation = get_orientation = function() {
+		var isPortrait = true, elem = document.documentElement;
+
+		// prefer window orientation to the calculation based on screensize as
+		// the actual screen resize takes place before or after the orientation change event
+		// has been fired depending on implementation (eg android 2.3 is before, iphone after).
+		// More testing is required to determine if a more reliable method of determining the new screensize
+		// is possible when orientationchange is fired. (eg, use media queries + element + opacity)
+		if ( $.support.orientation ) {
+			// if the window orientation registers as 0 or 180 degrees report
+			// portrait, otherwise landscape
+			isPortrait = window.orientation % 180 == 0;
+		} else {
+			isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;
+		}
+
+		return isPortrait ? "portrait" : "landscape";
+	};
+
+})( jQuery, window );
+
+
+// throttled resize event
+(function() {
+
+	$.event.special.throttledresize = {
+		setup: function() {
+			$( this ).bind( "resize", handler );
+		},
+		teardown: function(){
+			$( this ).unbind( "resize", handler );
+		}
+	};
+
+	var throttle = 250,
+		handler = function() {
+			curr = ( new Date() ).getTime();
+			diff = curr - lastCall;
+
+			if ( diff >= throttle ) {
+
+				lastCall = curr;
+				$( this ).trigger( "throttledresize" );
+
+			} else {
+
+				if ( heldCall ) {
+					clearTimeout( heldCall );
+				}
+
+				// Promise a held call will still execute
+				heldCall = setTimeout( handler, throttle - diff );
+			}
+		},
+		lastCall = 0,
+		heldCall,
+		curr,
+		diff;
+})();
+
+
+$.each({
+	scrollstop: "scrollstart",
+	taphold: "tap",
+	swipeleft: "swipe",
+	swiperight: "swipe"
+}, function( event, sourceEvent ) {
+
+	$.event.special[ event ] = {
+		setup: function() {
+			$( this ).bind( sourceEvent, $.noop );
+		}
+	};
+});
+
+})( jQuery, this );
+// Script: jQuery hashchange event
+// 
+// *Version: 1.3, Last updated: 7/21/2010*
+// 
+// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
+// GitHub       - http://github.com/cowboy/jquery-hashchange/
+// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
+// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
+// 
+// About: License
+// 
+// Copyright (c) 2010 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// These working examples, complete with fully commented code, illustrate a few
+// ways in which this plugin can be used.
+// 
+// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
+// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
+// 
+// About: Support and Testing
+// 
+// Information about what version or versions of jQuery this plugin has been
+// tested with, what browsers it has been tested in, and where the unit tests
+// reside (so you can test it yourself).
+// 
+// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
+//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
+// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
+// 
+// About: Known issues
+// 
+// While this jQuery hashchange event implementation is quite stable and
+// robust, there are a few unfortunate browser bugs surrounding expected
+// hashchange event-based behaviors, independent of any JavaScript
+// window.onhashchange abstraction. See the following examples for more
+// information:
+// 
+// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
+// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
+// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
+// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
+// 
+// Also note that should a browser natively support the window.onhashchange 
+// event, but not report that it does, the fallback polling loop will be used.
+// 
+// About: Release History
+// 
+// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
+//         "removable" for mobile-only development. Added IE6/7 document.title
+//         support. Attempted to make Iframe as hidden as possible by using
+//         techniques from http://www.paciellogroup.com/blog/?p=604. Added 
+//         support for the "shortcut" format $(window).hashchange( fn ) and
+//         $(window).hashchange() like jQuery provides for built-in events.
+//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
+//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
+//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
+//         file to address access denied issues when setting document.domain in
+//         IE6/7.
+// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
+//         from a page on another domain would cause an error in Safari 4. Also,
+//         IE6/7 Iframe is now inserted after the body (this actually works),
+//         which prevents the page from scrolling when the event is first bound.
+//         Event can also now be bound before DOM ready, but it won't be usable
+//         before then in IE6/7.
+// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
+//         where browser version is incorrectly reported as 8.0, despite
+//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
+// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
+//         window.onhashchange functionality into a separate plugin for users
+//         who want just the basic event & back button support, without all the
+//         extra awesomeness that BBQ provides. This plugin will be included as
+//         part of jQuery BBQ, but also be available separately.
+
+(function($,window,undefined){
+  '$:nomunge'; // Used by YUI compressor.
+  
+  // Reused string.
+  var str_hashchange = 'hashchange',
+    
+    // Method / object references.
+    doc = document,
+    fake_onhashchange,
+    special = $.event.special,
+    
+    // Does the browser support window.onhashchange? Note that IE8 running in
+    // IE7 compatibility mode reports true for 'onhashchange' in window, even
+    // though the event isn't supported, so also test document.documentMode.
+    doc_mode = doc.documentMode,
+    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
+  
+  // Get location.hash (or what you'd expect location.hash to be) sans any
+  // leading #. Thanks for making this necessary, Firefox!
+  function get_fragment( url ) {
+    url = url || location.href;
+    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
+  };
+  
+  // Method: jQuery.fn.hashchange
+  // 
+  // Bind a handler to the window.onhashchange event or trigger all bound
+  // window.onhashchange event handlers. This behavior is consistent with
+  // jQuery's built-in event handlers.
+  // 
+  // Usage:
+  // 
+  // > jQuery(window).hashchange( [ handler ] );
+  // 
+  // Arguments:
+  // 
+  //  handler - (Function) Optional handler to be bound to the hashchange
+  //    event. This is a "shortcut" for the more verbose form:
+  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
+  //    all bound window.onhashchange event handlers will be triggered. This
+  //    is a shortcut for the more verbose
+  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
+  //    the <hashchange event> section.
+  // 
+  // Returns:
+  // 
+  //  (jQuery) The initial jQuery collection of elements.
+  
+  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
+  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
+  $.fn[ str_hashchange ] = function( fn ) {
+    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
+  };
+  
+  // Property: jQuery.fn.hashchange.delay
+  // 
+  // The numeric interval (in milliseconds) at which the <hashchange event>
+  // polling loop executes. Defaults to 50.
+  
+  // Property: jQuery.fn.hashchange.domain
+  // 
+  // If you're setting document.domain in your JavaScript, and you want hash
+  // history to work in IE6/7, not only must this property be set, but you must
+  // also set document.domain BEFORE jQuery is loaded into the page. This
+  // property is only applicable if you are supporting IE6/7 (or IE8 operating
+  // in "IE7 compatibility" mode).
+  // 
+  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
+  // path of the included "document-domain.html" file, which can be renamed or
+  // modified if necessary (note that the document.domain specified must be the
+  // same in both your main JavaScript as well as in this file).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.domain = document.domain;
+  
+  // Property: jQuery.fn.hashchange.src
+  // 
+  // If, for some reason, you need to specify an Iframe src file (for example,
+  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
+  // do so using this property. Note that when using this property, history
+  // won't be recorded in IE6/7 until the Iframe src file loads. This property
+  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
+  // compatibility" mode).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.src = 'path/to/file.html';
+  
+  $.fn[ str_hashchange ].delay = 50;
+  /*
+  $.fn[ str_hashchange ].domain = null;
+  $.fn[ str_hashchange ].src = null;
+  */
+  
+  // Event: hashchange event
+  // 
+  // Fired when location.hash changes. In browsers that support it, the native
+  // HTML5 window.onhashchange event is used, otherwise a polling loop is
+  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
+  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
+  // compatibility" mode), a hidden Iframe is created to allow the back button
+  // and hash-based history to work.
+  // 
+  // Usage as described in <jQuery.fn.hashchange>:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).hashchange( function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).hashchange();
+  // 
+  // A more verbose usage that allows for event namespacing:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).bind( 'hashchange', function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).trigger( 'hashchange' );
+  // 
+  // Additional Notes:
+  // 
+  // * The polling loop and Iframe are not created until at least one handler
+  //   is actually bound to the 'hashchange' event.
+  // * If you need the bound handler(s) to execute immediately, in cases where
+  //   a location.hash exists on page load, via bookmark or page refresh for
+  //   example, use jQuery(window).hashchange() or the more verbose 
+  //   jQuery(window).trigger( 'hashchange' ).
+  // * The event can be bound before DOM ready, but since it won't be usable
+  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
+  //   to bind it inside a DOM ready handler.
+  
+  // Override existing $.event.special.hashchange methods (allowing this plugin
+  // to be defined after jQuery BBQ in BBQ's source code).
+  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
+    
+    // Called only when the first 'hashchange' event is bound to window.
+    setup: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to create our own. And we don't want to call this
+      // until the user binds to the event, just in case they never do, since it
+      // will create a polling loop and possibly even a hidden Iframe.
+      $( fake_onhashchange.start );
+    },
+    
+    // Called only when the last 'hashchange' event is unbound from window.
+    teardown: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to stop ours (if possible).
+      $( fake_onhashchange.stop );
+    }
+    
+  });
+  
+  // fake_onhashchange does all the work of triggering the window.onhashchange
+  // event for browsers that don't natively support it, including creating a
+  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
+  // Iframe to enable back and forward.
+  fake_onhashchange = (function(){
+    var self = {},
+      timeout_id,
+      
+      // Remember the initial hash so it doesn't get triggered immediately.
+      last_hash = get_fragment(),
+      
+      fn_retval = function(val){ return val; },
+      history_set = fn_retval,
+      history_get = fn_retval;
+    
+    // Start the polling loop.
+    self.start = function() {
+      timeout_id || poll();
+    };
+    
+    // Stop the polling loop.
+    self.stop = function() {
+      timeout_id && clearTimeout( timeout_id );
+      timeout_id = undefined;
+    };
+    
+    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
+    // if location.hash has changed, and triggers the 'hashchange' event on
+    // window when necessary.
+    function poll() {
+      var hash = get_fragment(),
+        history_hash = history_get( last_hash );
+      
+      if ( hash !== last_hash ) {
+        history_set( last_hash = hash, history_hash );
+        
+        $(window).trigger( str_hashchange );
+        
+      } else if ( history_hash !== last_hash ) {
+        location.href = location.href.replace( /#.*/, '' ) + history_hash;
+      }
+      
+      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
+    };
+    
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    $.browser.msie && !supports_onhashchange && (function(){
+      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
+      // when running in "IE7 compatibility" mode.
+      
+      var iframe,
+        iframe_src;
+      
+      // When the event is bound and polling starts in IE 6/7, create a hidden
+      // Iframe for history handling.
+      self.start = function(){
+        if ( !iframe ) {
+          iframe_src = $.fn[ str_hashchange ].src;
+          iframe_src = iframe_src && iframe_src + get_fragment();
+          
+          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
+          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
+          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
+            
+            // When Iframe has completely loaded, initialize the history and
+            // start polling.
+            .one( 'load', function(){
+              iframe_src || history_set( get_fragment() );
+              poll();
+            })
+            
+            // Load Iframe src if specified, otherwise nothing.
+            .attr( 'src', iframe_src || 'javascript:0' )
+            
+            // Append Iframe after the end of the body to prevent unnecessary
+            // initial page scrolling (yes, this works).
+            .insertAfter( 'body' )[0].contentWindow;
+          
+          // Whenever `document.title` changes, update the Iframe's title to
+          // prettify the back/next history menu entries. Since IE sometimes
+          // errors with "Unspecified error" the very first time this is set
+          // (yes, very useful) wrap this with a try/catch block.
+          doc.onpropertychange = function(){
+            try {
+              if ( event.propertyName === 'title' ) {
+                iframe.document.title = doc.title;
+              }
+            } catch(e) {}
+          };
+          
+        }
+      };
+      
+      // Override the "stop" method since an IE6/7 Iframe was created. Even
+      // if there are no longer any bound event handlers, the polling loop
+      // is still necessary for back/next to work at all!
+      self.stop = fn_retval;
+      
+      // Get history by looking at the hidden Iframe's location.hash.
+      history_get = function() {
+        return get_fragment( iframe.location.href );
+      };
+      
+      // Set a new history item by opening and then closing the Iframe
+      // document, *then* setting its location.hash. If document.domain has
+      // been set, update that as well.
+      history_set = function( hash, history_hash ) {
+        var iframe_doc = iframe.document,
+          domain = $.fn[ str_hashchange ].domain;
+        
+        if ( hash !== history_hash ) {
+          // Update Iframe with any initial `document.title` that might be set.
+          iframe_doc.title = doc.title;
+          
+          // Opening the Iframe's document after it has been closed is what
+          // actually adds a history entry.
+          iframe_doc.open();
+          
+          // Set document.domain for the Iframe document as well, if necessary.
+          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
+          
+          iframe_doc.close();
+          
+          // Update the Iframe's hash, for great justice.
+          iframe.location.hash = hash;
+        }
+      };
+      
+    })();
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    
+    return self;
+  })();
+  
+})(jQuery,this);
+/*
+* "page" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.page", $.mobile.widget, {
+	options: {
+		theme: "c",
+		domCache: false,
+		keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')"
+	},
+
+	_create: function() {
+
+		this._trigger( "beforecreate" );
+
+		this.element
+			.attr( "tabindex", "0" )
+			.addClass( "ui-page ui-body-" + this.options.theme );
+	},
+
+	keepNativeSelector: function() {
+		var options = this.options,
+			keepNativeDefined = options.keepNative && $.trim(options.keepNative);
+
+		if( keepNativeDefined && options.keepNative !== options.keepNativeDefault ){
+			return [options.keepNative, options.keepNativeDefault].join(", ");
+		}
+
+		return options.keepNativeDefault;
+	}
+});
+})( jQuery );
+/* 
+* "core" - The base file for jQm
+*/
+
+(function( $, window, undefined ) {
+
+	var nsNormalizeDict = {};
+
+	// jQuery.mobile configurable options
+	$.extend( $.mobile, {
+
+		// Namespace used framework-wide for data-attrs. Default is no namespace
+		ns: "",
+
+		// Define the url parameter used for referencing widget-generated sub-pages.
+		// Translates to to example.html&ui-page=subpageIdentifier
+		// hash segment before &ui-page= is used to make Ajax request
+		subPageUrlKey: "ui-page",
+
+		// Class assigned to page currently in view, and during transitions
+		activePageClass: "ui-page-active",
+
+		// Class used for "active" button state, from CSS framework
+		activeBtnClass: "ui-btn-active",
+
+		// Automatically handle clicks and form submissions through Ajax, when same-domain
+		ajaxEnabled: true,
+
+		// Automatically load and show pages based on location.hash
+		hashListeningEnabled: true,
+
+		// disable to prevent jquery from bothering with links
+		linkBindingEnabled: true,
+
+		// Set default page transition - 'none' for no transitions
+		defaultPageTransition: "slide",
+
+		// Minimum scroll distance that will be remembered when returning to a page
+		minScrollBack: 250,
+
+		// Set default dialog transition - 'none' for no transitions
+		defaultDialogTransition: "pop",
+
+		// Show loading message during Ajax requests
+		// if false, message will not appear, but loading classes will still be toggled on html el
+		loadingMessage: "loading",
+
+		// Error response message - appears when an Ajax page request fails
+		pageLoadErrorMessage: "Error Loading Page",
+
+		//automatically initialize the DOM when it's ready
+		autoInitializePage: true,
+
+		pushStateEnabled: true,
+
+		// turn of binding to the native orientationchange due to android orientation behavior
+		orientationChangeEnabled: true,
+
+		// Support conditions that must be met in order to proceed
+		// default enhanced qualifications are media query support OR IE 7+
+		gradeA: function(){
+			return $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7;
+		},
+
+		// TODO might be useful upstream in jquery itself ?
+		keyCode: {
+			ALT: 18,
+			BACKSPACE: 8,
+			CAPS_LOCK: 20,
+			COMMA: 188,
+			COMMAND: 91,
+			COMMAND_LEFT: 91, // COMMAND
+			COMMAND_RIGHT: 93,
+			CONTROL: 17,
+			DELETE: 46,
+			DOWN: 40,
+			END: 35,
+			ENTER: 13,
+			ESCAPE: 27,
+			HOME: 36,
+			INSERT: 45,
+			LEFT: 37,
+			MENU: 93, // COMMAND_RIGHT
+			NUMPAD_ADD: 107,
+			NUMPAD_DECIMAL: 110,
+			NUMPAD_DIVIDE: 111,
+			NUMPAD_ENTER: 108,
+			NUMPAD_MULTIPLY: 106,
+			NUMPAD_SUBTRACT: 109,
+			PAGE_DOWN: 34,
+			PAGE_UP: 33,
+			PERIOD: 190,
+			RIGHT: 39,
+			SHIFT: 16,
+			SPACE: 32,
+			TAB: 9,
+			UP: 38,
+			WINDOWS: 91 // COMMAND
+		},
+
+		// Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value
+		silentScroll: function( ypos ) {
+			if ( $.type( ypos ) !== "number" ) {
+				ypos = $.mobile.defaultHomeScroll;
+			}
+
+			// prevent scrollstart and scrollstop events
+			$.event.special.scrollstart.enabled = false;
+
+			setTimeout(function() {
+				window.scrollTo( 0, ypos );
+				$( document ).trigger( "silentscroll", { x: 0, y: ypos });
+			}, 20 );
+
+			setTimeout(function() {
+				$.event.special.scrollstart.enabled = true;
+			}, 150 );
+		},
+
+		// Expose our cache for testing purposes.
+		nsNormalizeDict: nsNormalizeDict,
+
+		// Take a data attribute property, prepend the namespace
+		// and then camel case the attribute string. Add the result
+		// to our nsNormalizeDict so we don't have to do this again.
+		nsNormalize: function( prop ) {
+			if ( !prop ) {
+				return;
+			}
+
+			return nsNormalizeDict[ prop ] || ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) );
+		},
+
+		getInheritedTheme: function( el, defaultTheme ) {
+
+			// Find the closest parent with a theme class on it. Note that
+			// we are not using $.fn.closest() on purpose here because this
+			// method gets called quite a bit and we need it to be as fast
+			// as possible.
+
+			var e = el[ 0 ],
+				ltr = "",
+				re = /ui-(bar|body)-([a-z])\b/,
+				c, m;
+
+			while ( e ) {
+				var c = e.className || "";
+				if ( ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) {
+					// We found a parent with a theme class
+					// on it so bail from this loop.
+					break;
+				}
+				e = e.parentNode;
+			}
+			
+			// Return the theme letter we found, if none, return the
+			// specified default.
+
+			return ltr || defaultTheme || "a";
+		}
+	});
+
+	// Mobile version of data and removeData and hasData methods
+	// ensures all data is set and retrieved using jQuery Mobile's data namespace
+	$.fn.jqmData = function( prop, value ) {
+		var result;
+		if ( typeof prop != "undefined" ) {
+			result = this.data( prop ? $.mobile.nsNormalize( prop ) : prop, value );
+		}
+		return result;
+	};
+
+	$.jqmData = function( elem, prop, value ) {
+		var result;
+		if ( typeof prop != "undefined" ) {
+			result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value );
+		}
+		return result;
+	};
+
+	$.fn.jqmRemoveData = function( prop ) {
+		return this.removeData( $.mobile.nsNormalize( prop ) );
+	};
+
+	$.jqmRemoveData = function( elem, prop ) {
+		return $.removeData( elem, $.mobile.nsNormalize( prop ) );
+	};
+
+	$.fn.removeWithDependents = function() {
+		$.removeWithDependents( this );
+	};
+
+	$.removeWithDependents = function( elem ) {
+		var $elem = $( elem );
+
+		( $elem.jqmData('dependents') || $() ).remove();
+		$elem.remove();
+	};
+
+	$.fn.addDependents = function( newDependents ) {
+		$.addDependents( $(this), newDependents );
+	};
+
+	$.addDependents = function( elem, newDependents ) {
+		var dependents = $(elem).jqmData( 'dependents' ) || $();
+
+		$(elem).jqmData( 'dependents', $.merge(dependents, newDependents) );
+	};
+
+	// note that this helper doesn't attempt to handle the callback
+	// or setting of an html elements text, its only purpose is
+	// to return the html encoded version of the text in all cases. (thus the name)
+	$.fn.getEncodedText = function() {
+		return $( "<div/>" ).text( $(this).text() ).html();
+	};
+
+	// Monkey-patching Sizzle to filter the :jqmData selector
+	var oldFind = $.find,
+		jqmDataRE = /:jqmData\(([^)]*)\)/g;
+
+	$.find = function( selector, context, ret, extra ) {
+		selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" );
+
+		return oldFind.call( this, selector, context, ret, extra );
+	};
+
+	$.extend( $.find, oldFind );
+
+	$.find.matches = function( expr, set ) {
+		return $.find( expr, null, null, set );
+	};
+
+	$.find.matchesSelector = function( node, expr ) {
+		return $.find( expr, null, null, [ node ] ).length > 0;
+	};
+})( jQuery, this );
+
+/*
+* core utilities for auto ajax navigation, base tag mgmt,
+*/
+
+( function( $, undefined ) {
+
+	//define vars for interal use
+	var $window = $( window ),
+		$html = $( 'html' ),
+		$head = $( 'head' ),
+
+		//url path helpers for use in relative url management
+		path = {
+
+			// This scary looking regular expression parses an absolute URL or its relative
+			// variants (protocol, site, document, query, and hash), into the various
+			// components (protocol, host, path, query, fragment, etc that make up the
+			// URL as well as some other commonly used sub-parts. When used with RegExp.exec()
+			// or String.match, it parses the URL into a results array that looks like this:
+			//
+			//     [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content
+			//     [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread
+			//     [2]: http://jblas:password@mycompany.com:8080/mail/inbox
+			//     [3]: http://jblas:password@mycompany.com:8080
+			//     [4]: http:
+			//     [5]: //
+			//     [6]: jblas:password@mycompany.com:8080
+			//     [7]: jblas:password
+			//     [8]: jblas
+			//     [9]: password
+			//    [10]: mycompany.com:8080
+			//    [11]: mycompany.com
+			//    [12]: 8080
+			//    [13]: /mail/inbox
+			//    [14]: /mail/
+			//    [15]: inbox
+			//    [16]: ?msg=1234&type=unread
+			//    [17]: #msg-content
+			//
+			urlParseRE: /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
+
+			//Parse a URL into a structure that allows easy access to
+			//all of the URL components by name.
+			parseUrl: function( url ) {
+				// If we're passed an object, we'll assume that it is
+				// a parsed url object and just return it back to the caller.
+				if ( $.type( url ) === "object" ) {
+					return url;
+				}
+
+				var matches = path.urlParseRE.exec( url || "" ) || [];
+
+					// Create an object that allows the caller to access the sub-matches
+					// by name. Note that IE returns an empty string instead of undefined,
+					// like all other browsers do, so we normalize everything so its consistent
+					// no matter what browser we're running on.
+					return {
+						href:         matches[  0 ] || "",
+						hrefNoHash:   matches[  1 ] || "",
+						hrefNoSearch: matches[  2 ] || "",
+						domain:       matches[  3 ] || "",
+						protocol:     matches[  4 ] || "",
+						doubleSlash:  matches[  5 ] || "",
+						authority:    matches[  6 ] || "",
+						username:     matches[  8 ] || "",
+						password:     matches[  9 ] || "",
+						host:         matches[ 10 ] || "",
+						hostname:     matches[ 11 ] || "",
+						port:         matches[ 12 ] || "",
+						pathname:     matches[ 13 ] || "",
+						directory:    matches[ 14 ] || "",
+						filename:     matches[ 15 ] || "",
+						search:       matches[ 16 ] || "",
+						hash:         matches[ 17 ] || ""
+					};
+			},
+
+			//Turn relPath into an asbolute path. absPath is
+			//an optional absolute path which describes what
+			//relPath is relative to.
+			makePathAbsolute: function( relPath, absPath ) {
+				if ( relPath && relPath.charAt( 0 ) === "/" ) {
+					return relPath;
+				}
+
+				relPath = relPath || "";
+				absPath = absPath ? absPath.replace( /^\/|(\/[^\/]*|[^\/]+)$/g, "" ) : "";
+
+				var absStack = absPath ? absPath.split( "/" ) : [],
+					relStack = relPath.split( "/" );
+				for ( var i = 0; i < relStack.length; i++ ) {
+					var d = relStack[ i ];
+					switch ( d ) {
+						case ".":
+							break;
+						case "..":
+							if ( absStack.length ) {
+								absStack.pop();
+							}
+							break;
+						default:
+							absStack.push( d );
+							break;
+					}
+				}
+				return "/" + absStack.join( "/" );
+			},
+
+			//Returns true if both urls have the same domain.
+			isSameDomain: function( absUrl1, absUrl2 ) {
+				return path.parseUrl( absUrl1 ).domain === path.parseUrl( absUrl2 ).domain;
+			},
+
+			//Returns true for any relative variant.
+			isRelativeUrl: function( url ) {
+				// All relative Url variants have one thing in common, no protocol.
+				return path.parseUrl( url ).protocol === "";
+			},
+
+			//Returns true for an absolute url.
+			isAbsoluteUrl: function( url ) {
+				return path.parseUrl( url ).protocol !== "";
+			},
+
+			//Turn the specified realtive URL into an absolute one. This function
+			//can handle all relative variants (protocol, site, document, query, fragment).
+			makeUrlAbsolute: function( relUrl, absUrl ) {
+				if ( !path.isRelativeUrl( relUrl ) ) {
+					return relUrl;
+				}
+
+				var relObj = path.parseUrl( relUrl ),
+					absObj = path.parseUrl( absUrl ),
+					protocol = relObj.protocol || absObj.protocol,
+					doubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ),
+					authority = relObj.authority || absObj.authority,
+					hasPath = relObj.pathname !== "",
+					pathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ),
+					search = relObj.search || ( !hasPath && absObj.search ) || "",
+					hash = relObj.hash;
+
+				return protocol + doubleSlash + authority + pathname + search + hash;
+			},
+
+			//Add search (aka query) params to the specified url.
+			addSearchParams: function( url, params ) {
+				var u = path.parseUrl( url ),
+					p = ( typeof params === "object" ) ? $.param( params ) : params,
+					s = u.search || "?";
+				return u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== "?" ? "&" : "" ) + p + ( u.hash || "" );
+			},
+
+			convertUrlToDataUrl: function( absUrl ) {
+				var u = path.parseUrl( absUrl );
+				if ( path.isEmbeddedPage( u ) ) {
+				    // For embedded pages, remove the dialog hash key as in getFilePath(),
+				    // otherwise the Data Url won't match the id of the embedded Page.
+					return u.hash.split( dialogHashKey )[0].replace( /^#/, "" );
+				} else if ( path.isSameDomain( u, documentBase ) ) {
+					return u.hrefNoHash.replace( documentBase.domain, "" );
+				}
+				return absUrl;
+			},
+
+			//get path from current hash, or from a file path
+			get: function( newPath ) {
+				if( newPath === undefined ) {
+					newPath = location.hash;
+				}
+				return path.stripHash( newPath ).replace( /[^\/]*\.[^\/*]+$/, '' );
+			},
+
+			//return the substring of a filepath before the sub-page key, for making a server request
+			getFilePath: function( path ) {
+				var splitkey = '&' + $.mobile.subPageUrlKey;
+				return path && path.split( splitkey )[0].split( dialogHashKey )[0];
+			},
+
+			//set location hash to path
+			set: function( path ) {
+				location.hash = path;
+			},
+
+			//test if a given url (string) is a path
+			//NOTE might be exceptionally naive
+			isPath: function( url ) {
+				return ( /\// ).test( url );
+			},
+
+			//return a url path with the window's location protocol/hostname/pathname removed
+			clean: function( url ) {
+				return url.replace( documentBase.domain, "" );
+			},
+
+			//just return the url without an initial #
+			stripHash: function( url ) {
+				return url.replace( /^#/, "" );
+			},
+
+			//remove the preceding hash, any query params, and dialog notations
+			cleanHash: function( hash ) {
+				return path.stripHash( hash.replace( /\?.*$/, "" ).replace( dialogHashKey, "" ) );
+			},
+
+			//check whether a url is referencing the same domain, or an external domain or different protocol
+			//could be mailto, etc
+			isExternal: function( url ) {
+				var u = path.parseUrl( url );
+				return u.protocol && u.domain !== documentUrl.domain ? true : false;
+			},
+
+			hasProtocol: function( url ) {
+				return ( /^(:?\w+:)/ ).test( url );
+			},
+
+			//check if the specified url refers to the first page in the main application document.
+			isFirstPageUrl: function( url ) {
+				// We only deal with absolute paths.
+				var u = path.parseUrl( path.makeUrlAbsolute( url, documentBase ) ),
+
+					// Does the url have the same path as the document?
+					samePath = u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ),
+
+					// Get the first page element.
+					fp = $.mobile.firstPage,
+
+					// Get the id of the first page element if it has one.
+					fpId = fp && fp[0] ? fp[0].id : undefined;
+
+					// The url refers to the first page if the path matches the document and
+					// it either has no hash value, or the hash is exactly equal to the id of the
+					// first page element.
+					return samePath && ( !u.hash || u.hash === "#" || ( fpId && u.hash.replace( /^#/, "" ) === fpId ) );
+			},
+
+			isEmbeddedPage: function( url ) {
+				var u = path.parseUrl( url );
+
+				//if the path is absolute, then we need to compare the url against
+				//both the documentUrl and the documentBase. The main reason for this
+				//is that links embedded within external documents will refer to the
+				//application document, whereas links embedded within the application
+				//document will be resolved against the document base.
+				if ( u.protocol !== "" ) {
+					return ( u.hash && ( u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ) ) );
+				}
+				return (/^#/).test( u.href );
+			}
+		},
+
+		//will be defined when a link is clicked and given an active class
+		$activeClickedLink = null,
+
+		//urlHistory is purely here to make guesses at whether the back or forward button was clicked
+		//and provide an appropriate transition
+		urlHistory = {
+			// Array of pages that are visited during a single page load.
+			// Each has a url and optional transition, title, and pageUrl (which represents the file path, in cases where URL is obscured, such as dialogs)
+			stack: [],
+
+			//maintain an index number for the active page in the stack
+			activeIndex: 0,
+
+			//get active
+			getActive: function() {
+				return urlHistory.stack[ urlHistory.activeIndex ];
+			},
+
+			getPrev: function() {
+				return urlHistory.stack[ urlHistory.activeIndex - 1 ];
+			},
+
+			getNext: function() {
+				return urlHistory.stack[ urlHistory.activeIndex + 1 ];
+			},
+
+			// addNew is used whenever a new page is added
+			addNew: function( url, transition, title, pageUrl, role ) {
+				//if there's forward history, wipe it
+				if( urlHistory.getNext() ) {
+					urlHistory.clearForward();
+				}
+
+				urlHistory.stack.push( {url : url, transition: transition, title: title, pageUrl: pageUrl, role: role } );
+
+				urlHistory.activeIndex = urlHistory.stack.length - 1;
+			},
+
+			//wipe urls ahead of active index
+			clearForward: function() {
+				urlHistory.stack = urlHistory.stack.slice( 0, urlHistory.activeIndex + 1 );
+			},
+
+			directHashChange: function( opts ) {
+				var back , forward, newActiveIndex, prev = this.getActive();
+
+				// check if url isp in history and if it's ahead or behind current page
+				$.each( urlHistory.stack, function( i, historyEntry ) {
+
+					//if the url is in the stack, it's a forward or a back
+					if( opts.currentUrl === historyEntry.url ) {
+						//define back and forward by whether url is older or newer than current page
+						back = i < urlHistory.activeIndex;
+						forward = !back;
+						newActiveIndex = i;
+					}
+				});
+
+				// save new page index, null check to prevent falsey 0 result
+				this.activeIndex = newActiveIndex !== undefined ? newActiveIndex : this.activeIndex;
+
+				if( back ) {
+					( opts.either || opts.isBack )( true );
+				} else if( forward ) {
+					( opts.either || opts.isForward )( false );
+				}
+			},
+
+			//disable hashchange event listener internally to ignore one change
+			//toggled internally when location.hash is updated to match the url of a successful page load
+			ignoreNextHashChange: false
+		},
+
+		//define first selector to receive focus when a page is shown
+		focusable = "[tabindex],a,button:visible,select:visible,input",
+
+		//queue to hold simultanious page transitions
+		pageTransitionQueue = [],
+
+		//indicates whether or not page is in process of transitioning
+		isPageTransitioning = false,
+
+		//nonsense hash change key for dialogs, so they create a history entry
+		dialogHashKey = "&ui-state=dialog",
+
+		//existing base tag?
+		$base = $head.children( "base" ),
+
+		//tuck away the original document URL minus any fragment.
+		documentUrl = path.parseUrl( location.href ),
+
+		//if the document has an embedded base tag, documentBase is set to its
+		//initial value. If a base tag does not exist, then we default to the documentUrl.
+		documentBase = $base.length ? path.parseUrl( path.makeUrlAbsolute( $base.attr( "href" ), documentUrl.href ) ) : documentUrl,
+
+		//cache the comparison once.
+		documentBaseDiffers = ( documentUrl.hrefNoHash !== documentBase.hrefNoHash );
+
+		//base element management, defined depending on dynamic base tag support
+		var base = $.support.dynamicBaseTag ? {
+
+			//define base element, for use in routing asset urls that are referenced in Ajax-requested markup
+			element: ( $base.length ? $base : $( "<base>", { href: documentBase.hrefNoHash } ).prependTo( $head ) ),
+
+			//set the generated BASE element's href attribute to a new page's base path
+			set: function( href ) {
+				base.element.attr( "href", path.makeUrlAbsolute( href, documentBase ) );
+			},
+
+			//set the generated BASE element's href attribute to a new page's base path
+			reset: function() {
+				base.element.attr( "href", documentBase.hrefNoHash );
+			}
+
+		} : undefined;
+
+/*
+	internal utility functions
+--------------------------------------*/
+
+
+	//direct focus to the page title, or otherwise first focusable element
+	function reFocus( page ) {
+		var pageTitle = page.find( ".ui-title:eq(0)" );
+
+		if( pageTitle.length ) {
+			pageTitle.focus();
+		}
+		else{
+			page.focus();
+		}
+	}
+
+	//remove active classes after page transition or error
+	function removeActiveLinkClass( forceRemoval ) {
+		if( !!$activeClickedLink && ( !$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval ) ) {
+			$activeClickedLink.removeClass( $.mobile.activeBtnClass );
+		}
+		$activeClickedLink = null;
+	}
+
+	function releasePageTransitionLock() {
+		isPageTransitioning = false;
+		if( pageTransitionQueue.length > 0 ) {
+			$.mobile.changePage.apply( null, pageTransitionQueue.pop() );
+		}
+	}
+
+	// Save the last scroll distance per page, before it is hidden
+	var setLastScrollEnabled = true,
+		firstScrollElem, getScrollElem, setLastScroll, delayedSetLastScroll;
+
+	getScrollElem = function() {
+		var scrollElem = $window, activePage,
+			touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled;
+
+		if( touchOverflow ){
+			activePage = $( ".ui-page-active" );
+			scrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage;
+		}
+
+		return scrollElem;
+	};
+
+	setLastScroll = function( scrollElem ) {
+		// this barrier prevents setting the scroll value based on the browser
+		// scrolling the window based on a hashchange
+		if( !setLastScrollEnabled ) {
+			return;
+		}
+
+		var active = $.mobile.urlHistory.getActive();
+
+		if( active ) {
+			var lastScroll = scrollElem && scrollElem.scrollTop();
+
+			// Set active page's lastScroll prop.
+			// If the location we're scrolling to is less than minScrollBack, let it go.
+			active.lastScroll = lastScroll < $.mobile.minScrollBack ? $.mobile.defaultHomeScroll : lastScroll;
+		}
+	};
+
+	// bind to scrollstop to gather scroll position. The delay allows for the hashchange
+	// event to fire and disable scroll recording in the case where the browser scrolls
+	// to the hash targets location (sometimes the top of the page). once pagechange fires
+	// getLastScroll is again permitted to operate
+	delayedSetLastScroll = function() {
+		setTimeout( setLastScroll, 100, $(this) );
+	};
+
+	// disable an scroll setting when a hashchange has been fired, this only works
+	// because the recording of the scroll position is delayed for 100ms after
+	// the browser might have changed the position because of the hashchange
+	$window.bind( $.support.pushState ? "popstate" : "hashchange", function() {
+	 	setLastScrollEnabled = false;
+	});
+
+	// handle initial hashchange from chrome :(
+	$window.one( $.support.pushState ? "popstate" : "hashchange", function() {
+		setLastScrollEnabled = true;
+	});
+
+	// wait until the mobile page container has been determined to bind to pagechange
+	$window.one( "pagecontainercreate", function(){
+		// once the page has changed, re-enable the scroll recording
+		$.mobile.pageContainer.bind( "pagechange", function() {
+			var scrollElem = getScrollElem();
+
+	 		setLastScrollEnabled = true;
+
+			// remove any binding that previously existed on the get scroll
+			// which may or may not be different than the scroll element determined for
+			// this page previously
+			scrollElem.unbind( "scrollstop", delayedSetLastScroll );
+
+			// determine and bind to the current scoll element which may be the window
+			// or in the case of touch overflow the element with touch overflow
+			scrollElem.bind( "scrollstop", delayedSetLastScroll );
+		});
+	});
+
+	// bind to scrollstop for the first page as "pagechange" won't be fired in that case
+	getScrollElem().bind( "scrollstop", delayedSetLastScroll );
+
+	// Make the iOS clock quick-scroll work again if we're using native overflow scrolling
+	/*
+	if( $.support.touchOverflow ){
+		if( $.mobile.touchOverflowEnabled ){
+			$( window ).bind( "scrollstop", function(){
+				if( $( this ).scrollTop() === 0 ){
+					$.mobile.activePage.scrollTop( 0 );
+				}
+			});
+		}
+	}
+	*/
+
+	//function for transitioning between two existing pages
+	function transitionPages( toPage, fromPage, transition, reverse ) {
+
+		//get current scroll distance
+		var active	= $.mobile.urlHistory.getActive(),
+			touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled,
+			toScroll = active.lastScroll || ( touchOverflow ? 0 : $.mobile.defaultHomeScroll ),
+			screenHeight = getScreenHeight();
+
+		// Scroll to top, hide addr bar
+		window.scrollTo( 0, $.mobile.defaultHomeScroll );
+
+		if( fromPage ) {
+			//trigger before show/hide events
+			fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } );
+		}
+
+		if( !touchOverflow){
+			toPage.height( screenHeight + toScroll );
+		}
+
+		toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } );
+
+		//clear page loader
+		$.mobile.hidePageLoadingMsg();
+
+		if( touchOverflow && toScroll ){
+
+			toPage.addClass( "ui-mobile-pre-transition" );
+			// Send focus to page as it is now display: block
+			reFocus( toPage );
+
+			//set page's scrollTop to remembered distance
+			if( toPage.is( ".ui-native-fixed" ) ){
+				toPage.find( ".ui-content" ).scrollTop( toScroll );
+			}
+			else{
+				toPage.scrollTop( toScroll );
+			}
+		}
+
+		//find the transition handler for the specified transition. If there
+		//isn't one in our transitionHandlers dictionary, use the default one.
+		//call the handler immediately to kick-off the transition.
+		var th = $.mobile.transitionHandlers[transition || "none"] || $.mobile.defaultTransitionHandler,
+			promise = th( transition, reverse, toPage, fromPage );
+
+		promise.done(function() {
+			//reset toPage height back
+			if( !touchOverflow ){
+				toPage.height( "" );
+				// Send focus to the newly shown page
+				reFocus( toPage );
+			}
+
+			// Jump to top or prev scroll, sometimes on iOS the page has not rendered yet.
+			if( !touchOverflow ){
+				$.mobile.silentScroll( toScroll );
+			}
+
+			//trigger show/hide events
+			if( fromPage ) {
+				if( !touchOverflow ){
+					fromPage.height( "" );
+				}
+
+				fromPage.data( "page" )._trigger( "hide", null, { nextPage: toPage } );
+			}
+
+			//trigger pageshow, define prevPage as either fromPage or empty jQuery obj
+			toPage.data( "page" )._trigger( "show", null, { prevPage: fromPage || $( "" ) } );
+		});
+
+		return promise;
+	}
+
+	//simply set the active page's minimum height to screen height, depending on orientation
+	function getScreenHeight(){
+		var orientation 	= $.event.special.orientationchange.orientation(),
+			port			= orientation === "portrait",
+			winMin			= port ? 480 : 320,
+			screenHeight	= port ? screen.availHeight : screen.availWidth,
+			winHeight		= Math.max( winMin, $( window ).height() ),
+			pageMin			= Math.min( screenHeight, winHeight );
+
+		return pageMin;
+	}
+
+	$.mobile.getScreenHeight = getScreenHeight;
+
+	//simply set the active page's minimum height to screen height, depending on orientation
+	function resetActivePageHeight(){
+		// Don't apply this height in touch overflow enabled mode
+		if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){
+			return;
+		}
+		$( "." + $.mobile.activePageClass ).css( "min-height", getScreenHeight() );
+	}
+
+	//shared page enhancements
+	function enhancePage( $page, role ) {
+		// If a role was specified, make sure the data-role attribute
+		// on the page element is in sync.
+		if( role ) {
+			$page.attr( "data-" + $.mobile.ns + "role", role );
+		}
+
+		//run page plugin
+		$page.page();
+	}
+
+/* exposed $.mobile methods	 */
+
+	//animation complete callback
+	$.fn.animationComplete = function( callback ) {
+		if( $.support.cssTransitions ) {
+			return $( this ).one( 'webkitAnimationEnd', callback );
+		}
+		else{
+			// defer execution for consistency between webkit/non webkit
+			setTimeout( callback, 0 );
+			return $( this );
+		}
+	};
+
+	//expose path object on $.mobile
+	$.mobile.path = path;
+
+	//expose base object on $.mobile
+	$.mobile.base = base;
+
+	//history stack
+	$.mobile.urlHistory = urlHistory;
+
+	$.mobile.dialogHashKey = dialogHashKey;
+
+	//default non-animation transition handler
+	$.mobile.noneTransitionHandler = function( name, reverse, $toPage, $fromPage ) {
+		if ( $fromPage ) {
+			$fromPage.removeClass( $.mobile.activePageClass );
+		}
+		$toPage.addClass( $.mobile.activePageClass );
+
+		return $.Deferred().resolve( name, reverse, $toPage, $fromPage ).promise();
+	};
+
+	//default handler for unknown transitions
+	$.mobile.defaultTransitionHandler = $.mobile.noneTransitionHandler;
+
+	//transition handler dictionary for 3rd party transitions
+	$.mobile.transitionHandlers = {
+		none: $.mobile.defaultTransitionHandler
+	};
+
+	//enable cross-domain page support
+	$.mobile.allowCrossDomainPages = false;
+
+	//return the original document url
+	$.mobile.getDocumentUrl = function(asParsedObject) {
+		return asParsedObject ? $.extend( {}, documentUrl ) : documentUrl.href;
+	};
+
+	//return the original document base url
+	$.mobile.getDocumentBase = function(asParsedObject) {
+		return asParsedObject ? $.extend( {}, documentBase ) : documentBase.href;
+	};
+
+	$.mobile._bindPageRemove = function() {
+		var page = $(this);
+
+		// when dom caching is not enabled or the page is embedded bind to remove the page on hide
+		if( !page.data("page").options.domCache
+				&& page.is(":jqmData(external-page='true')") ) {
+
+			page.bind( 'pagehide.remove', function() {
+				var $this = $( this ),
+					prEvent = new $.Event( "pageremove" );
+
+				$this.trigger( prEvent );
+
+				if( !prEvent.isDefaultPrevented() ){
+					$this.removeWithDependents();
+				}
+			});
+		}
+	};
+
+	// Load a page into the DOM.
+	$.mobile.loadPage = function( url, options ) {
+		// This function uses deferred notifications to let callers
+		// know when the page is done loading, or if an error has occurred.
+		var deferred = $.Deferred(),
+
+			// The default loadPage options with overrides specified by
+			// the caller.
+			settings = $.extend( {}, $.mobile.loadPage.defaults, options ),
+
+			// The DOM element for the page after it has been loaded.
+			page = null,
+
+			// If the reloadPage option is true, and the page is already
+			// in the DOM, dupCachedPage will be set to the page element
+			// so that it can be removed after the new version of the
+			// page is loaded off the network.
+			dupCachedPage = null,
+
+			// determine the current base url
+			findBaseWithDefault = function(){
+				var closestBase = ( $.mobile.activePage && getClosestBaseUrl( $.mobile.activePage ) );
+				return closestBase || documentBase.hrefNoHash;
+			},
+
+			// The absolute version of the URL passed into the function. This
+			// version of the URL may contain dialog/subpage params in it.
+			absUrl = path.makeUrlAbsolute( url, findBaseWithDefault() );
+
+
+		// If the caller provided data, and we're using "get" request,
+		// append the data to the URL.
+		if ( settings.data && settings.type === "get" ) {
+			absUrl = path.addSearchParams( absUrl, settings.data );
+			settings.data = undefined;
+		}
+
+		// If the caller is using a "post" request, reloadPage must be true
+		if(  settings.data && settings.type === "post" ){
+			settings.reloadPage = true;
+		}
+
+			// The absolute version of the URL minus any dialog/subpage params.
+			// In otherwords the real URL of the page to be loaded.
+		var fileUrl = path.getFilePath( absUrl ),
+
+			// The version of the Url actually stored in the data-url attribute of
+			// the page. For embedded pages, it is just the id of the page. For pages
+			// within the same domain as the document base, it is the site relative
+			// path. For cross-domain pages (Phone Gap only) the entire absolute Url
+			// used to load the page.
+			dataUrl = path.convertUrlToDataUrl( absUrl );
+
+		// Make sure we have a pageContainer to work with.
+		settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
+
+		// Check to see if the page already exists in the DOM.
+		page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" );
+
+		// If we failed to find the page, check to see if the url is a
+		// reference to an embedded page. If so, it may have been dynamically
+		// injected by a developer, in which case it would be lacking a data-url
+		// attribute and in need of enhancement.
+		if ( page.length === 0 && dataUrl && !path.isPath( dataUrl ) ) {
+			page = settings.pageContainer.children( "#" + dataUrl )
+				.attr( "data-" + $.mobile.ns + "url", dataUrl );
+		}
+
+		// If we failed to find a page in the DOM, check the URL to see if it
+		// refers to the first page in the application. If it isn't a reference
+		// to the first page and refers to non-existent embedded page, error out.
+		if ( page.length === 0 ) {
+			if ( $.mobile.firstPage && path.isFirstPageUrl( fileUrl ) ) {
+				// Check to make sure our cached-first-page is actually
+				// in the DOM. Some user deployed apps are pruning the first
+				// page from the DOM for various reasons, we check for this
+				// case here because we don't want a first-page with an id
+				// falling through to the non-existent embedded page error
+				// case. If the first-page is not in the DOM, then we let
+				// things fall through to the ajax loading code below so
+				// that it gets reloaded.
+				if ( $.mobile.firstPage.parent().length ) {
+					page = $( $.mobile.firstPage );
+				}
+			} else if ( path.isEmbeddedPage( fileUrl )  ) {
+				deferred.reject( absUrl, options );
+				return deferred.promise();
+			}
+		}
+
+		// Reset base to the default document base.
+		if ( base ) {
+			base.reset();
+		}
+
+		// If the page we are interested in is already in the DOM,
+		// and the caller did not indicate that we should force a
+		// reload of the file, we are done. Otherwise, track the
+		// existing page as a duplicated.
+		if ( page.length ) {
+			if ( !settings.reloadPage ) {
+				enhancePage( page, settings.role );
+				deferred.resolve( absUrl, options, page );
+				return deferred.promise();
+			}
+			dupCachedPage = page;
+		}
+
+		var mpc = settings.pageContainer,
+			pblEvent = new $.Event( "pagebeforeload" ),
+			triggerData = { url: url, absUrl: absUrl, dataUrl: dataUrl, deferred: deferred, options: settings };
+
+		// Let listeners know we're about to load a page.
+		mpc.trigger( pblEvent, triggerData );
+
+		// If the default behavior is prevented, stop here!
+		if( pblEvent.isDefaultPrevented() ){
+			return deferred.promise();
+		}
+
+		if ( settings.showLoadMsg ) {
+
+			// This configurable timeout allows cached pages a brief delay to load without showing a message
+			var loadMsgDelay = setTimeout(function(){
+					$.mobile.showPageLoadingMsg();
+				}, settings.loadMsgDelay ),
+
+				// Shared logic for clearing timeout and removing message.
+				hideMsg = function(){
+
+					// Stop message show timer
+					clearTimeout( loadMsgDelay );
+
+					// Hide loading message
+					$.mobile.hidePageLoadingMsg();
+				};
+		}
+
+		if ( !( $.mobile.allowCrossDomainPages || path.isSameDomain( documentUrl, absUrl ) ) ) {
+			deferred.reject( absUrl, options );
+		} else {
+			// Load the new page.
+			$.ajax({
+				url: fileUrl,
+				type: settings.type,
+				data: settings.data,
+				dataType: "html",
+				success: function( html, textStatus, xhr ) {
+					//pre-parse html to check for a data-url,
+					//use it as the new fileUrl, base path, etc
+					var all = $( "<div></div>" ),
+
+						//page title regexp
+						newPageTitle = html.match( /<title[^>]*>([^<]*)/ ) && RegExp.$1,
+
+						// TODO handle dialogs again
+						pageElemRegex = new RegExp( "(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>)" ),
+						dataUrlRegex = new RegExp( "\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?" );
+
+
+					// data-url must be provided for the base tag so resource requests can be directed to the
+					// correct url. loading into a temprorary element makes these requests immediately
+					if( pageElemRegex.test( html )
+							&& RegExp.$1
+							&& dataUrlRegex.test( RegExp.$1 )
+							&& RegExp.$1 ) {
+						url = fileUrl = path.getFilePath( RegExp.$1 );
+					}
+
+					if ( base ) {
+						base.set( fileUrl );
+					}
+
+					//workaround to allow scripts to execute when included in page divs
+					all.get( 0 ).innerHTML = html;
+					page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first();
+
+					//if page elem couldn't be found, create one and insert the body element's contents
+					if( !page.length ){
+						page = $( "<div data-" + $.mobile.ns + "role='page'>" + html.split( /<\/?body[^>]*>/gmi )[1] + "</div>" );
+					}
+
+					if ( newPageTitle && !page.jqmData( "title" ) ) {
+						if ( ~newPageTitle.indexOf( "&" ) ) {
+							newPageTitle = $( "<div>" + newPageTitle + "</div>" ).text();
+						}
+						page.jqmData( "title", newPageTitle );
+					}
+
+					//rewrite src and href attrs to use a base url
+					if( !$.support.dynamicBaseTag ) {
+						var newPath = path.get( fileUrl );
+						page.find( "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]" ).each(function() {
+							var thisAttr = $( this ).is( '[href]' ) ? 'href' :
+									$(this).is('[src]') ? 'src' : 'action',
+								thisUrl = $( this ).attr( thisAttr );
+
+							// XXX_jblas: We need to fix this so that it removes the document
+							//            base URL, and then prepends with the new page URL.
+							//if full path exists and is same, chop it - helps IE out
+							thisUrl = thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' );
+
+							if( !/^(\w+:|#|\/)/.test( thisUrl ) ) {
+								$( this ).attr( thisAttr, newPath + thisUrl );
+							}
+						});
+					}
+
+					//append to page and enhance
+					// TODO taging a page with external to make sure that embedded pages aren't removed
+					//      by the various page handling code is bad. Having page handling code in many
+					//      places is bad. Solutions post 1.0
+					page
+						.attr( "data-" + $.mobile.ns + "url", path.convertUrlToDataUrl( fileUrl ) )
+						.attr( "data-" + $.mobile.ns + "external-page", true )
+						.appendTo( settings.pageContainer );
+
+					// wait for page creation to leverage options defined on widget
+					page.one( 'pagecreate', $.mobile._bindPageRemove );
+
+					enhancePage( page, settings.role );
+
+					// Enhancing the page may result in new dialogs/sub pages being inserted
+					// into the DOM. If the original absUrl refers to a sub-page, that is the
+					// real page we are interested in.
+					if ( absUrl.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ) {
+						page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" );
+					}
+
+					//bind pageHide to removePage after it's hidden, if the page options specify to do so
+
+					// Remove loading message.
+					if ( settings.showLoadMsg ) {
+						hideMsg();
+					}
+
+					// Add the page reference and xhr to our triggerData.
+					triggerData.xhr = xhr;
+					triggerData.textStatus = textStatus;
+					triggerData.page = page;
+
+					// Let listeners know the page loaded successfully.
+					settings.pageContainer.trigger( "pageload", triggerData );
+
+					deferred.resolve( absUrl, options, page, dupCachedPage );
+				},
+				error: function( xhr, textStatus, errorThrown ) {
+					//set base back to current path
+					if( base ) {
+						base.set( path.get() );
+					}
+
+					// Add error info to our triggerData.
+					triggerData.xhr = xhr;
+					triggerData.textStatus = textStatus;
+					triggerData.errorThrown = errorThrown;
+
+					var plfEvent = new $.Event( "pageloadfailed" );
+
+					// Let listeners know the page load failed.
+					settings.pageContainer.trigger( plfEvent, triggerData );
+
+					// If the default behavior is prevented, stop here!
+					// Note that it is the responsibility of the listener/handler
+					// that called preventDefault(), to resolve/reject the
+					// deferred object within the triggerData.
+					if( plfEvent.isDefaultPrevented() ){
+						return;
+					}
+
+					// Remove loading message.
+					if ( settings.showLoadMsg ) {
+
+						// Remove loading message.
+						hideMsg();
+
+						//show error message
+						$( "<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>"+ $.mobile.pageLoadErrorMessage +"</h1></div>" )
+							.css({ "display": "block", "opacity": 0.96, "top": $window.scrollTop() + 100 })
+							.appendTo( settings.pageContainer )
+							.delay( 800 )
+							.fadeOut( 400, function() {
+								$( this ).remove();
+							});
+					}
+
+					deferred.reject( absUrl, options );
+				}
+			});
+		}
+
+		return deferred.promise();
+	};
+
+	$.mobile.loadPage.defaults = {
+		type: "get",
+		data: undefined,
+		reloadPage: false,
+		role: undefined, // By default we rely on the role defined by the @data-role attribute.
+		showLoadMsg: false,
+		pageContainer: undefined,
+		loadMsgDelay: 50 // This delay allows loads that pull from browser cache to occur without showing the loading message.
+	};
+
+	// Show a specific page in the page container.
+	$.mobile.changePage = function( toPage, options ) {
+		// If we are in the midst of a transition, queue the current request.
+		// We'll call changePage() once we're done with the current transition to
+		// service the request.
+		if( isPageTransitioning ) {
+			pageTransitionQueue.unshift( arguments );
+			return;
+		}
+
+		var settings = $.extend( {}, $.mobile.changePage.defaults, options );
+
+		// Make sure we have a pageContainer to work with.
+		settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
+
+		// Make sure we have a fromPage.
+		settings.fromPage = settings.fromPage || $.mobile.activePage;
+
+		var mpc = settings.pageContainer,
+			pbcEvent = new $.Event( "pagebeforechange" ),
+			triggerData = { toPage: toPage, options: settings };
+
+		// Let listeners know we're about to change the current page.
+		mpc.trigger( pbcEvent, triggerData );
+
+		// If the default behavior is prevented, stop here!
+		if( pbcEvent.isDefaultPrevented() ){
+			return;
+		}
+
+		// We allow "pagebeforechange" observers to modify the toPage in the trigger
+		// data to allow for redirects. Make sure our toPage is updated.
+
+		toPage = triggerData.toPage;
+
+		// Set the isPageTransitioning flag to prevent any requests from
+		// entering this method while we are in the midst of loading a page
+		// or transitioning.
+
+		isPageTransitioning = true;
+
+		// If the caller passed us a url, call loadPage()
+		// to make sure it is loaded into the DOM. We'll listen
+		// to the promise object it returns so we know when
+		// it is done loading or if an error ocurred.
+		if ( typeof toPage == "string" ) {
+			$.mobile.loadPage( toPage, settings )
+				.done(function( url, options, newPage, dupCachedPage ) {
+					isPageTransitioning = false;
+					options.duplicateCachedPage = dupCachedPage;
+					$.mobile.changePage( newPage, options );
+				})
+				.fail(function( url, options ) {
+					isPageTransitioning = false;
+
+					//clear out the active button state
+					removeActiveLinkClass( true );
+
+					//release transition lock so navigation is free again
+					releasePageTransitionLock();
+					settings.pageContainer.trigger( "pagechangefailed", triggerData );
+				});
+			return;
+		}
+
+		// If we are going to the first-page of the application, we need to make
+		// sure settings.dataUrl is set to the application document url. This allows
+		// us to avoid generating a document url with an id hash in the case where the
+		// first-page of the document has an id attribute specified.
+		if ( toPage[ 0 ] === $.mobile.firstPage[ 0 ] && !settings.dataUrl ) {
+			settings.dataUrl = documentUrl.hrefNoHash;
+		}
+
+		// The caller passed us a real page DOM element. Update our
+		// internal state and then trigger a transition to the page.
+		var fromPage = settings.fromPage,
+			url = ( settings.dataUrl && path.convertUrlToDataUrl( settings.dataUrl ) ) || toPage.jqmData( "url" ),
+			// The pageUrl var is usually the same as url, except when url is obscured as a dialog url. pageUrl always contains the file path
+			pageUrl = url,
+			fileUrl = path.getFilePath( url ),
+			active = urlHistory.getActive(),
+			activeIsInitialPage = urlHistory.activeIndex === 0,
+			historyDir = 0,
+			pageTitle = document.title,
+			isDialog = settings.role === "dialog" || toPage.jqmData( "role" ) === "dialog";
+
+		// By default, we prevent changePage requests when the fromPage and toPage
+		// are the same element, but folks that generate content manually/dynamically
+		// and reuse pages want to be able to transition to the same page. To allow
+		// this, they will need to change the default value of allowSamePageTransition
+		// to true, *OR*, pass it in as an option when they manually call changePage().
+		// It should be noted that our default transition animations assume that the
+		// formPage and toPage are different elements, so they may behave unexpectedly.
+		// It is up to the developer that turns on the allowSamePageTransitiona option
+		// to either turn off transition animations, or make sure that an appropriate
+		// animation transition is used.
+		if( fromPage && fromPage[0] === toPage[0] && !settings.allowSamePageTransition ) {
+			isPageTransitioning = false;
+			mpc.trigger( "pagechange", triggerData );
+			return;
+		}
+
+		// We need to make sure the page we are given has already been enhanced.
+		enhancePage( toPage, settings.role );
+
+		// If the changePage request was sent from a hashChange event, check to see if the
+		// page is already within the urlHistory stack. If so, we'll assume the user hit
+		// the forward/back button and will try to match the transition accordingly.
+		if( settings.fromHashChange ) {
+			urlHistory.directHashChange({
+				currentUrl:	url,
+				isBack:		function() { historyDir = -1; },
+				isForward:	function() { historyDir = 1; }
+			});
+		}
+
+		// Kill the keyboard.
+		// XXX_jblas: We need to stop crawling the entire document to kill focus. Instead,
+		//            we should be tracking focus with a live() handler so we already have
+		//            the element in hand at this point.
+		// Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement
+		// is undefined when we are in an IFrame.
+		try {
+			if(document.activeElement && document.activeElement.nodeName.toLowerCase() != 'body') {
+				$(document.activeElement).blur();
+			} else {
+				$( "input:focus, textarea:focus, select:focus" ).blur();
+			}
+		} catch(e) {}
+
+		// If we're displaying the page as a dialog, we don't want the url
+		// for the dialog content to be used in the hash. Instead, we want
+		// to append the dialogHashKey to the url of the current page.
+		if ( isDialog && active ) {
+			// on the initial page load active.url is undefined and in that case should
+			// be an empty string. Moving the undefined -> empty string back into
+			// urlHistory.addNew seemed imprudent given undefined better represents
+			// the url state
+			url = ( active.url || "" ) + dialogHashKey;
+		}
+
+		// Set the location hash.
+		if( settings.changeHash !== false && url ) {
+			//disable hash listening temporarily
+			urlHistory.ignoreNextHashChange = true;
+			//update hash and history
+			path.set( url );
+		}
+
+		// if title element wasn't found, try the page div data attr too
+		// If this is a deep-link or a reload ( active === undefined ) then just use pageTitle
+		var newPageTitle = ( !active )? pageTitle : toPage.jqmData( "title" ) || toPage.children(":jqmData(role='header')").find(".ui-title" ).getEncodedText();
+		if( !!newPageTitle && pageTitle == document.title ) {
+			pageTitle = newPageTitle;
+		}
+		if ( !toPage.jqmData( "title" ) ) {
+			toPage.jqmData( "title", pageTitle );
+		}
+
+		// Make sure we have a transition defined.
+		settings.transition = settings.transition
+			|| ( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined )
+			|| ( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition );
+
+		//add page to history stack if it's not back or forward
+		if( !historyDir ) {
+			urlHistory.addNew( url, settings.transition, pageTitle, pageUrl, settings.role );
+		}
+
+		//set page title
+		document.title = urlHistory.getActive().title;
+
+		//set "toPage" as activePage
+		$.mobile.activePage = toPage;
+
+		// If we're navigating back in the URL history, set reverse accordingly.
+		settings.reverse = settings.reverse || historyDir < 0;
+
+		transitionPages( toPage, fromPage, settings.transition, settings.reverse )
+			.done(function() {
+				removeActiveLinkClass();
+
+				//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
+				if ( settings.duplicateCachedPage ) {
+					settings.duplicateCachedPage.remove();
+				}
+
+				//remove initial build class (only present on first pageshow)
+				$html.removeClass( "ui-mobile-rendering" );
+
+				releasePageTransitionLock();
+
+				// Let listeners know we're all done changing the current page.
+				mpc.trigger( "pagechange", triggerData );
+			});
+	};
+
+	$.mobile.changePage.defaults = {
+		transition: undefined,
+		reverse: false,
+		changeHash: true,
+		fromHashChange: false,
+		role: undefined, // By default we rely on the role defined by the @data-role attribute.
+		duplicateCachedPage: undefined,
+		pageContainer: undefined,
+		showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage
+		dataUrl: undefined,
+		fromPage: undefined,
+		allowSamePageTransition: false
+	};
+
+/* Event Bindings - hashchange, submit, and click */
+	function findClosestLink( ele )
+	{
+		while ( ele ) {
+			// Look for the closest element with a nodeName of "a".
+			// Note that we are checking if we have a valid nodeName
+			// before attempting to access it. This is because the
+			// node we get called with could have originated from within
+			// an embedded SVG document where some symbol instance elements
+			// don't have nodeName defined on them, or strings are of type
+			// SVGAnimatedString.
+			if ( ( typeof ele.nodeName === "string" ) && ele.nodeName.toLowerCase() == "a" ) {
+				break;
+			}
+			ele = ele.parentNode;
+		}
+		return ele;
+	}
+
+	// The base URL for any given element depends on the page it resides in.
+	function getClosestBaseUrl( ele )
+	{
+		// Find the closest page and extract out its url.
+		var url = $( ele ).closest( ".ui-page" ).jqmData( "url" ),
+			base = documentBase.hrefNoHash;
+
+		if ( !url || !path.isPath( url ) ) {
+			url = base;
+		}
+
+		return path.makeUrlAbsolute( url, base);
+	}
+
+
+	//The following event bindings should be bound after mobileinit has been triggered
+	//the following function is called in the init file
+	$.mobile._registerInternalEvents = function(){
+
+		//bind to form submit events, handle with Ajax
+		$( "form" ).live('submit', function( event ) {
+			var $this = $( this );
+			if( !$.mobile.ajaxEnabled ||
+				$this.is( ":jqmData(ajax='false')" ) ) {
+					return;
+				}
+
+			var type = $this.attr( "method" ),
+				target = $this.attr( "target" ),
+				url = $this.attr( "action" );
+
+			// If no action is specified, browsers default to using the
+			// URL of the document containing the form. Since we dynamically
+			// pull in pages from external documents, the form should submit
+			// to the URL for the source document of the page containing
+			// the form.
+			if ( !url ) {
+				// Get the @data-url for the page containing the form.
+				url = getClosestBaseUrl( $this );
+				if ( url === documentBase.hrefNoHash ) {
+					// The url we got back matches the document base,
+					// which means the page must be an internal/embedded page,
+					// so default to using the actual document url as a browser
+					// would.
+					url = documentUrl.hrefNoSearch;
+				}
+			}
+
+			url = path.makeUrlAbsolute(  url, getClosestBaseUrl($this) );
+
+			//external submits use regular HTTP
+			if( path.isExternal( url ) || target ) {
+				return;
+			}
+
+			$.mobile.changePage(
+				url,
+				{
+					type:		type && type.length && type.toLowerCase() || "get",
+					data:		$this.serialize(),
+					transition:	$this.jqmData( "transition" ),
+					direction:	$this.jqmData( "direction" ),
+					reloadPage:	true
+				}
+			);
+			event.preventDefault();
+		});
+
+		//add active state on vclick
+		$( document ).bind( "vclick", function( event ) {
+			// if this isn't a left click we don't care. Its important to note
+			// that when the virtual event is generated it will create
+			if ( event.which > 1 || !$.mobile.linkBindingEnabled ){
+				return;
+			}
+
+			var link = findClosestLink( event.target );
+			if ( link ) {
+				if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) {
+					removeActiveLinkClass( true );
+					$activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" );
+					$activeClickedLink.addClass( $.mobile.activeBtnClass );
+					$( "." + $.mobile.activePageClass + " .ui-btn" ).not( link ).blur();
+				}
+			}
+		});
+
+		// click routing - direct to HTTP or Ajax, accordingly
+		$( document ).bind( "click", function( event ) {
+			if( !$.mobile.linkBindingEnabled ){
+				return;
+			}
+
+			var link = findClosestLink( event.target );
+
+			// If there is no link associated with the click or its not a left
+			// click we want to ignore the click
+			if ( !link || event.which > 1) {
+				return;
+			}
+
+			var $link = $( link ),
+				//remove active link class if external (then it won't be there if you come back)
+				httpCleanup = function(){
+					window.setTimeout( function() { removeActiveLinkClass( true ); }, 200 );
+				};
+
+			//if there's a data-rel=back attr, go back in history
+			if( $link.is( ":jqmData(rel='back')" ) ) {
+				window.history.back();
+				return false;
+			}
+
+			var baseUrl = getClosestBaseUrl( $link ),
+
+				//get href, if defined, otherwise default to empty hash
+				href = path.makeUrlAbsolute( $link.attr( "href" ) || "#", baseUrl );
+
+			//if ajax is disabled, exit early
+			if( !$.mobile.ajaxEnabled && !path.isEmbeddedPage( href ) ){
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			// XXX_jblas: Ideally links to application pages should be specified as
+			//            an url to the application document with a hash that is either
+			//            the site relative path or id to the page. But some of the
+			//            internal code that dynamically generates sub-pages for nested
+			//            lists and select dialogs, just write a hash in the link they
+			//            create. This means the actual URL path is based on whatever
+			//            the current value of the base tag is at the time this code
+			//            is called. For now we are just assuming that any url with a
+			//            hash in it is an application page reference.
+			if ( href.search( "#" ) != -1 ) {
+				href = href.replace( /[^#]*#/, "" );
+				if ( !href ) {
+					//link was an empty hash meant purely
+					//for interaction, so we ignore it.
+					event.preventDefault();
+					return;
+				} else if ( path.isPath( href ) ) {
+					//we have apath so make it the href we want to load.
+					href = path.makeUrlAbsolute( href, baseUrl );
+				} else {
+					//we have a simple id so use the documentUrl as its base.
+					href = path.makeUrlAbsolute( "#" + href, documentUrl.hrefNoHash );
+				}
+			}
+
+				// Should we handle this link, or let the browser deal with it?
+			var useDefaultUrlHandling = $link.is( "[rel='external']" ) || $link.is( ":jqmData(ajax='false')" ) || $link.is( "[target]" ),
+
+				// Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR
+				// requests if the document doing the request was loaded via the file:// protocol.
+				// This is usually to allow the application to "phone home" and fetch app specific
+				// data. We normally let the browser handle external/cross-domain urls, but if the
+				// allowCrossDomainPages option is true, we will allow cross-domain http/https
+				// requests to go through our page loading logic.
+				isCrossDomainPageLoad = ( $.mobile.allowCrossDomainPages && documentUrl.protocol === "file:" && href.search( /^https?:/ ) != -1 ),
+
+				//check for protocol or rel and its not an embedded page
+				//TODO overlap in logic from isExternal, rel=external check should be
+				//     moved into more comprehensive isExternalLink
+				isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !isCrossDomainPageLoad );
+
+			if( isExternal ) {
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			//use ajax
+			var transition = $link.jqmData( "transition" ),
+				direction = $link.jqmData( "direction" ),
+				reverse = ( direction && direction === "reverse" ) ||
+							// deprecated - remove by 1.0
+							$link.jqmData( "back" ),
+
+				//this may need to be more specific as we use data-rel more
+				role = $link.attr( "data-" + $.mobile.ns + "rel" ) || undefined;
+
+			$.mobile.changePage( href, { transition: transition, reverse: reverse, role: role } );
+			event.preventDefault();
+		});
+
+		//prefetch pages when anchors with data-prefetch are encountered
+		$( ".ui-page" ).live( "pageshow.prefetch", function() {
+			var urls = [];
+			$( this ).find( "a:jqmData(prefetch)" ).each(function(){
+				var $link = $(this),
+					url = $link.attr( "href" );
+
+				if ( url && $.inArray( url, urls ) === -1 ) {
+					urls.push( url );
+
+					$.mobile.loadPage( url, {role: $link.attr("data-" + $.mobile.ns + "rel")} );
+				}
+			});
+		});
+
+		$.mobile._handleHashChange = function( hash ) {
+			//find first page via hash
+			var to = path.stripHash( hash ),
+				//transition is false if it's the first page, undefined otherwise (and may be overridden by default)
+				transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined,
+
+				// default options for the changPage calls made after examining the current state
+				// of the page and the hash
+				changePageOptions = {
+					transition: transition,
+					changeHash: false,
+					fromHashChange: true
+				};
+
+			//if listening is disabled (either globally or temporarily), or it's a dialog hash
+			if( !$.mobile.hashListeningEnabled || urlHistory.ignoreNextHashChange ) {
+				urlHistory.ignoreNextHashChange = false;
+				return;
+			}
+
+			// special case for dialogs
+			if( urlHistory.stack.length > 1 && to.indexOf( dialogHashKey ) > -1 ) {
+
+				// If current active page is not a dialog skip the dialog and continue
+				// in the same direction
+				if(!$.mobile.activePage.is( ".ui-dialog" )) {
+					//determine if we're heading forward or backward and continue accordingly past
+					//the current dialog
+					urlHistory.directHashChange({
+						currentUrl: to,
+						isBack: function() { window.history.back(); },
+						isForward: function() { window.history.forward(); }
+					});
+
+					// prevent changePage()
+					return;
+				} else {
+					// if the current active page is a dialog and we're navigating
+					// to a dialog use the dialog objected saved in the stack
+					urlHistory.directHashChange({
+						currentUrl: to,
+
+						// regardless of the direction of the history change
+						// do the following
+						either: function( isBack ) {
+							var active = $.mobile.urlHistory.getActive();
+
+							to = active.pageUrl;
+
+							// make sure to set the role, transition and reversal
+							// as most of this is lost by the domCache cleaning
+							$.extend( changePageOptions, {
+								role: active.role,
+								transition:	 active.transition,
+								reverse: isBack
+							});
+						}
+					});
+				}
+			}
+
+			//if to is defined, load it
+			if ( to ) {
+				// At this point, 'to' can be one of 3 things, a cached page element from
+				// a history stack entry, an id, or site-relative/absolute URL. If 'to' is
+				// an id, we need to resolve it against the documentBase, not the location.href,
+				// since the hashchange could've been the result of a forward/backward navigation
+				// that crosses from an external page/dialog to an internal page/dialog.
+				to = ( typeof to === "string" && !path.isPath( to ) ) ? ( path.makeUrlAbsolute( '#' + to, documentBase ) ) : to;
+				$.mobile.changePage( to, changePageOptions );
+			}	else {
+				//there's no hash, go to the first page in the dom
+				$.mobile.changePage( $.mobile.firstPage, changePageOptions );
+			}
+		};
+
+		//hashchange event handler
+		$window.bind( "hashchange", function( e, triggered ) {
+			$.mobile._handleHashChange( location.hash );
+		});
+
+		//set page min-heights to be device specific
+		$( document ).bind( "pageshow", resetActivePageHeight );
+		$( window ).bind( "throttledresize", resetActivePageHeight );
+
+	};//_registerInternalEvents callback
+
+})( jQuery );
+/*
+* history.pushState support, layered on top of hashchange
+*/
+
+( function( $, window ) {
+	// For now, let's Monkeypatch this onto the end of $.mobile._registerInternalEvents
+	// Scope self to pushStateHandler so we can reference it sanely within the
+	// methods handed off as event handlers
+	var	pushStateHandler = {},
+		self = pushStateHandler,
+		$win = $( window ),
+		url = $.mobile.path.parseUrl( location.href );
+
+	$.extend( pushStateHandler, {
+		// TODO move to a path helper, this is rather common functionality
+		initialFilePath: (function() {
+			return url.pathname + url.search;
+		})(),
+
+		initialHref: url.hrefNoHash,
+
+		// Flag for tracking if a Hashchange naturally occurs after each popstate + replace
+		hashchangeFired: false,
+
+		state: function() {
+			return {
+				hash: location.hash || "#" + self.initialFilePath,
+				title: document.title,
+
+				// persist across refresh
+				initialHref: self.initialHref
+			};
+		},
+
+		resetUIKeys: function( url ) {
+			var dialog = $.mobile.dialogHashKey,
+				subkey = "&" + $.mobile.subPageUrlKey,
+				dialogIndex = url.indexOf( dialog );
+
+			if( dialogIndex > -1 ) {
+				url = url.slice( 0, dialogIndex ) + "#" + url.slice( dialogIndex );
+			} else if( url.indexOf( subkey ) > -1 ) {
+				url = url.split( subkey ).join( "#" + subkey );
+			}
+
+			return url;
+		},
+
+		// TODO sort out a single barrier to hashchange functionality
+		nextHashChangePrevented: function( value ) {
+			$.mobile.urlHistory.ignoreNextHashChange = value;
+			self.onHashChangeDisabled = value;
+		},
+
+		// on hash change we want to clean up the url
+		// NOTE this takes place *after* the vanilla navigation hash change
+		// handling has taken place and set the state of the DOM
+		onHashChange: function( e ) {
+			// disable this hash change
+			if( self.onHashChangeDisabled ){
+				return;
+			}
+			
+			var href, state,
+				hash = location.hash,
+				isPath = $.mobile.path.isPath( hash ),
+				resolutionUrl = isPath ? location.href : $.mobile.getDocumentUrl();
+			hash = isPath ? hash.replace( "#", "" ) : hash;
+
+			// propulate the hash when its not available
+			state = self.state();
+
+			// make the hash abolute with the current href
+			href = $.mobile.path.makeUrlAbsolute( hash, resolutionUrl );
+
+			if ( isPath ) {
+				href = self.resetUIKeys( href );
+			}
+
+			// replace the current url with the new href and store the state
+			// Note that in some cases we might be replacing an url with the
+			// same url. We do this anyways because we need to make sure that
+			// all of our history entries have a state object associated with
+			// them. This allows us to work around the case where window.history.back()
+			// is called to transition from an external page to an embedded page.
+			// In that particular case, a hashchange event is *NOT* generated by the browser.
+			// Ensuring each history entry has a state object means that onPopState()
+			// will always trigger our hashchange callback even when a hashchange event
+			// is not fired.
+			history.replaceState( state, document.title, href );
+		},
+
+		// on popstate (ie back or forward) we need to replace the hash that was there previously
+		// cleaned up by the additional hash handling
+		onPopState: function( e ) {
+			var poppedState = e.originalEvent.state, holdnexthashchange = false;
+
+			// if there's no state its not a popstate we care about, ie chrome's initial popstate
+			// or forward popstate
+			if( poppedState ) {
+				// disable any hashchange triggered by the browser
+				self.nextHashChangePrevented( true );
+
+				// defer our manual hashchange until after the browser fired
+				// version has come and gone
+				setTimeout(function() {
+					// make sure that the manual hash handling takes place
+					self.nextHashChangePrevented( false );
+
+					// change the page based on the hash
+					$.mobile._handleHashChange( poppedState.hash );
+				}, 100);
+			}
+		},
+
+		init: function() {
+			$win.bind( "hashchange", self.onHashChange );
+
+			// Handle popstate events the occur through history changes
+			$win.bind( "popstate", self.onPopState );
+
+			// if there's no hash, we need to replacestate for returning to home
+			if ( location.hash === "" ) {
+				history.replaceState( self.state(), document.title, location.href );
+			}
+		}
+	});
+
+	$( function() {
+		if( $.mobile.pushStateEnabled && $.support.pushState ){
+			pushStateHandler.init();
+		}
+	});
+})( jQuery, this );
+/*
+* "transitions" plugin - Page change tranistions
+*/
+
+(function( $, window, undefined ) {
+
+function css3TransitionHandler( name, reverse, $to, $from ) {
+
+	var deferred = new $.Deferred(),
+		reverseClass = reverse ? " reverse" : "",
+		viewportClass = "ui-mobile-viewport-transitioning viewport-" + name,
+		doneFunc = function() {
+
+			$to.add( $from ).removeClass( "out in reverse " + name );
+
+			if ( $from && $from[ 0 ] !== $to[ 0 ] ) {
+				$from.removeClass( $.mobile.activePageClass );
+			}
+
+			$to.parent().removeClass( viewportClass );
+
+			deferred.resolve( name, reverse, $to, $from );
+		};
+
+	$to.animationComplete( doneFunc );
+
+	$to.parent().addClass( viewportClass );
+
+	if ( $from ) {
+		$from.addClass( name + " out" + reverseClass );
+	}
+	$to.addClass( $.mobile.activePageClass + " " + name + " in" + reverseClass );
+
+	return deferred.promise();
+}
+
+// Make our transition handler public.
+$.mobile.css3TransitionHandler = css3TransitionHandler;
+
+// If the default transition handler is the 'none' handler, replace it with our handler.
+if ( $.mobile.defaultTransitionHandler === $.mobile.noneTransitionHandler ) {
+	$.mobile.defaultTransitionHandler = css3TransitionHandler;
+}
+
+})( jQuery, this );
+/*
+* "degradeInputs" plugin - degrades inputs to another type after custom enhancements are made.
+*/
+
+(function( $, undefined ) {
+
+$.mobile.page.prototype.options.degradeInputs = {
+	color: false,
+	date: false,
+	datetime: false,
+	"datetime-local": false,
+	email: false,
+	month: false,
+	number: false,
+	range: "number",
+	search: "text",
+	tel: false,
+	time: false,
+	url: false,
+	week: false
+};
+
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+
+	var page = $(e.target).closest(':jqmData(role="page")').data("page"), options;
+
+	if( !page ) {
+		return;
+	}
+
+	options = page.options;
+
+	// degrade inputs to avoid poorly implemented native functionality
+	$( e.target ).find( "input" ).not( page.keepNativeSelector() ).each(function() {
+		var $this = $( this ),
+			type = this.getAttribute( "type" ),
+			optType = options.degradeInputs[ type ] || "text";
+
+		if ( options.degradeInputs[ type ] ) {
+			var html = $( "<div>" ).html( $this.clone() ).html(),
+				// In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead
+				hasType = html.indexOf( " type=" ) > -1,
+				findstr = hasType ? /\s+type=["']?\w+['"]?/ : /\/?>/,
+				repstr = " type=\"" + optType + "\" data-" + $.mobile.ns + "type=\"" + type + "\"" + ( hasType ? "" : ">" );
+
+			$this.replaceWith( html.replace( findstr, repstr ) );
+		}
+	});
+
+});
+
+})( jQuery );/*
+* "dialog" plugin.
+*/
+
+(function( $, window, undefined ) {
+
+$.widget( "mobile.dialog", $.mobile.widget, {
+	options: {
+		closeBtnText 	: "Close",
+		overlayTheme	: "a",
+		initSelector	: ":jqmData(role='dialog')"
+	},
+	_create: function() {
+		var self = this,
+			$el = this.element,
+			headerCloseButton = $( "<a href='#' data-" + $.mobile.ns + "icon='delete' data-" + $.mobile.ns + "iconpos='notext'>"+ this.options.closeBtnText + "</a>" );
+
+		$el.addClass( "ui-overlay-" + this.options.overlayTheme );
+
+		// Class the markup for dialog styling
+		// Set aria role
+		$el.attr( "role", "dialog" )
+			.addClass( "ui-dialog" )
+			.find( ":jqmData(role='header')" )
+			.addClass( "ui-corner-top ui-overlay-shadow" )
+				.prepend( headerCloseButton )
+			.end()
+			.find( ":jqmData(role='content'),:jqmData(role='footer')" )
+				.addClass( "ui-overlay-shadow" )
+				.last()
+				.addClass( "ui-corner-bottom" );
+
+		// this must be an anonymous function so that select menu dialogs can replace
+		// the close method. This is a change from previously just defining data-rel=back
+		// on the button and letting nav handle it
+		headerCloseButton.bind( "vclick", function() {
+			self.close();
+		});
+
+		/* bind events
+			- clicks and submits should use the closing transition that the dialog opened with
+			  unless a data-transition is specified on the link/form
+			- if the click was on the close button, or the link has a data-rel="back" it'll go back in history naturally
+		*/
+		$el.bind( "vclick submit", function( event ) {
+			var $target = $( event.target ).closest( event.type === "vclick" ? "a" : "form" ),
+				active;
+
+			if ( $target.length && !$target.jqmData( "transition" ) ) {
+
+				active = $.mobile.urlHistory.getActive() || {};
+
+				$target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) )
+					.attr( "data-" + $.mobile.ns + "direction", "reverse" );
+			}
+		})
+		.bind( "pagehide", function() {
+			$( this ).find( "." + $.mobile.activeBtnClass ).removeClass( $.mobile.activeBtnClass );
+		});
+	},
+
+	// Close method goes back in history
+	close: function() {
+		window.history.back();
+	}
+});
+
+//auto self-init widgets
+$( $.mobile.dialog.prototype.options.initSelector ).live( "pagecreate", function(){
+	$( this ).dialog();
+});
+
+})( jQuery, this );
+/*
+* This plugin handles theming and layout of headers, footers, and content areas
+*/
+
+/*
+ * Page can be created using the calendarpicker() method or by adding a
+ * data-role="page" attribute to an element.
+ *
+ * Page has 3 main sub element. Header, Footer, Content
+ * 3 sub element can be created using <div> element
+ *
+ * Attribute:
+ *
+ *    data-back-Btn-Text:	determine which text is displayed in back button
+ *    data-add-Back-Btn:	Defines if header/footer has back button or not (default false)
+ *    data-back-Btn-Theme:	defines back button's theme
+ *    data-header-Theme:	defines header <div>'s theme
+ *    data-footer-Theme:	defines footer <div>'s theme
+ *    data-content-Theme:	defines content <div>'s theme
+ *    data-footer-Exist:	defines to show default footer or not in each page (default true)
+ *    data-footer-User-Control-Theme: defines to show default footer in whole page
+ *				(default false. if true, all document do not has footer)
+ *
+ * Examples:
+ *
+ *     HTML markup for creating Page:
+ *     <div data-role="page">
+ *
+ *     How to show back button
+ *     <div data-role="page" id="no-contents-0" data-add-back-btn="true">
+ *
+ *     How to  remove footer of specific page
+ *     <div data-role="page" id="no-contents-0" data-footer-Exist="false">
+ *
+ *     How to  remove footer of whole page
+ *     <div data-role="page" id="no-contents-0" data-footer-User-Control="true">
+ */
+
+(function( $, undefined ) {
+
+$.mobile.page.prototype.options.backBtnText  = "Back";
+$.mobile.page.prototype.options.addBackBtn   = false;
+$.mobile.page.prototype.options.backBtnTheme = null;
+$.mobile.page.prototype.options.headerTheme  = "a";
+$.mobile.page.prototype.options.footerTheme  = "a";
+$.mobile.page.prototype.options.contentTheme = null;
+$.mobile.page.prototype.options.footerExist = true;
+$.mobile.page.prototype.options.footerUserControl = false;
+
+$( ":jqmData(role='page'), :jqmData(role='dialog')" ).live( "pagecreate", function( e ) {
+	
+	var $page = $( this ),
+		o = $page.data( "page" ).options,
+		pageRole = $page.jqmData( "role" ),
+		pageTheme = o.theme;
+	
+	$( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", this ).each(function() {
+		var $this = $( this ),
+			role = $this.jqmData( "role" ),
+			theme = $this.jqmData( "theme" ),
+			contentTheme = theme || o.contentTheme || pageTheme,
+			$headeranchors,
+			leftbtn,
+			rightbtn,
+			backBtn;
+
+		var normalFooter,
+			footerExist = $this.jqmData("footerexist");
+
+		if ( footerExist != undefined ) {
+			o.footerExist = footerExist;
+		}
+			
+		$this.addClass( "ui-" + role );	
+
+		//apply theming and markup modifications to page,header,content,footer
+		if ( role === "header" || role === "footer" ) {
+			var thisTheme = theme || ( role === "header" ? o.headerTheme : o.footerTheme ) || pageTheme;
+
+			$this
+				//add theme class
+				.addClass( "ui-bar-" + thisTheme )
+				// Add ARIA role
+				.attr( "role", role === "header" ? "banner" : "contentinfo" );
+
+			// Right,left buttons
+			$headeranchors	= $this.children( "a" );
+			leftbtn	= $headeranchors.hasClass( "ui-btn-left" );
+			rightbtn = $headeranchors.hasClass( "ui-btn-right" );
+
+			leftbtn = leftbtn || $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length;
+			rightbtn = rightbtn || $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length;
+
+			// set default userControl value
+			if ( o.footerUserControl ) {
+				$.mobile.page.prototype.options.footerUserControl = "true";
+			}
+			
+			// Auto-add back btn on pages beyond first view
+			// create backbtn in case footer exist
+			if ( o.addBackBtn && 
+				role === "footer" &&
+				o.footerExist &&
+				$this.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) &&
+				!leftbtn ) {
+
+				backBtn = $( "<a href='#' class='ui-btn-back' data-"+ $.mobile.ns +"rel='back' data-"+ $.mobile.ns +"icon='header-back-btn'></a>" )
+					// If theme is provided, override default inheritance
+					.attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme || thisTheme )
+					.prependTo( $this );				
+
+
+				backBtn.bind( "vclick", function( event ) {
+					window.history.back();
+					return false;
+				});
+			}
+
+			// Page title
+			$this.children( "h1, h2, h3, h4, h5, h6" )
+				.addClass( "ui-title" )
+				// Regardless of h element number in src, it becomes h1 for the enhanced page
+				.attr({
+					"tabindex": "0",
+					"role": "heading",
+					"aria-level": "1"
+				});
+
+		} else if ( role === "content" ) {
+			if ( contentTheme ) {
+			    $this.addClass( "ui-body-" + ( contentTheme ) );
+			}
+
+			// Add ARIA role
+			$this.attr( "role", "main" );
+
+			/* Add default footer to add backbtn */
+			thisTheme = "s";
+
+			if ( o.footerExist ) {
+				backBtn = $( "<a href='#' class='ui-btn-back' data-" +
+						$.mobile.ns + "rel='back' data-" +
+						$.mobile.ns + "icon='header-back-btn'></a>" )
+						.attr( "data-" + $.mobile.ns + "theme", o.backBtnTheme || thisTheme );
+				var footer = $page.find("div:jqmData(role='footer')");
+
+				if ( footer.length != 0 ) {
+					if ( !footer.find("jqmData(role='navbar')").is("jqmData(style='tabbar')") ) {
+						backBtn.appendTo( footer );
+					}
+				} else {
+					if ( !$.mobile.page.prototype.options.footerUserControl ) {
+						normalFooter = $( "<div data-role='footer' class='ui-footer ui-bar-s ui-footer-fixed fade ui-fixed-overlay' data-position='fixed'></div>" )
+								.insertAfter( $page.find( ".ui-content" ) );
+						backBtn.appendTo( normalFooter );
+					}
+				}
+
+				if ( backBtn ) {
+					backBtn.bind( "vclick", function( event ) {
+						window.history.back();
+						return false;
+					});
+				}
+			}
+		}
+	});
+});
+
+})( jQuery );
+/*
+* "collapsible" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.collapsible", $.mobile.widget, {
+	options: {
+		expandCueText: " click to expand contents",
+		collapseCueText: " click to collapse contents",
+		collapsed: true,
+		heading: "h1,h2,h3,h4,h5,h6,legend",
+		theme: null,
+		contentTheme: null,
+		iconTheme: "d",
+		initSelector: ":jqmData(role='collapsible')"
+	},
+	_create: function() {
+
+		var $el = this.element,
+			o = this.options,
+			collapsible = $el.addClass( "ui-collapsible" ),
+			collapsibleHeading = $el.children( o.heading ).first(),
+			collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).find( ".ui-collapsible-content" ),
+			collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ),
+			collapsiblesInSet = collapsibleSet.children( ":jqmData(role='collapsible')" );
+
+		// Replace collapsibleHeading if it's a legend
+		if ( collapsibleHeading.is( "legend" ) ) {
+			collapsibleHeading = $( "<div role='heading'>"+ collapsibleHeading.html() +"</div>" ).insertBefore( collapsibleHeading );
+			collapsibleHeading.next().remove();
+		}
+
+		// If we are in a collapsible set
+		if ( collapsibleSet.length ) {
+			// Inherit the theme from collapsible-set
+			if ( !o.theme ) {
+				o.theme = collapsibleSet.jqmData( "theme" );
+			}
+			// Inherit the content-theme from collapsible-set
+			if ( !o.contentTheme ) {
+				o.contentTheme = collapsibleSet.jqmData( "content-theme" );
+			}
+		}
+
+		collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : "");
+
+		collapsibleHeading
+			//drop heading in before content
+			.insertBefore( collapsibleContent )
+			//modify markup & attributes
+			.addClass( "ui-collapsible-heading" )
+			.append( "<span class='ui-collapsible-heading-status'></span>" )
+			.wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" )
+			.find( "a" )
+				.first()
+				.buttonMarkup({
+					shadow: false,
+					corners: false,
+					iconPos: "left",
+					icon: "plus",
+					theme: o.theme
+				});
+
+		if ( !collapsibleSet.length ) {
+			collapsibleHeading
+				.find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) )
+					.addClass( "ui-corner-top ui-corner-bottom" );
+		} else {
+			// If we are in a collapsible set
+
+			// Initialize the collapsible set if it's not already initialized
+			if ( !collapsibleSet.jqmData( "collapsiblebound" ) ) {
+
+				collapsibleSet
+					.jqmData( "collapsiblebound", true )
+					.bind( "expand", function( event ) {
+
+						$( event.target )
+							.closest( ".ui-collapsible" )
+							.siblings( ".ui-collapsible" )
+							.trigger( "collapse" );
+
+					});
+			}
+
+			collapsiblesInSet.first()
+				.find( "a" )
+					.first()
+					.addClass( "ui-corner-top" )
+						.find( ".ui-btn-inner" )
+							.addClass( "ui-corner-top" );
+
+			collapsiblesInSet.last()
+				.jqmData( "collapsible-last", true )
+				.find( "a" )
+					.first()
+					.addClass( "ui-corner-bottom" )
+						.find( ".ui-btn-inner" )
+							.addClass( "ui-corner-bottom" );
+
+
+			if ( collapsible.jqmData( "collapsible-last" ) ) {
+				collapsibleHeading
+					.find( "a" ).first().add ( collapsibleHeading.find( ".ui-btn-inner" ) )
+						.addClass( "ui-corner-bottom" );
+			}
+		}
+
+		//events
+		collapsible
+			.bind( "expand collapse", function( event ) {
+				if ( !event.isDefaultPrevented() ) {
+
+					event.preventDefault();
+
+					var $this = $( this ),
+						isCollapse = ( event.type === "collapse" ),
+					    contentTheme = o.contentTheme;
+
+					collapsibleHeading
+						.toggleClass( "ui-collapsible-heading-collapsed", isCollapse)
+						.find( ".ui-collapsible-heading-status" )
+							.text( isCollapse ? o.expandCueText : o.collapseCueText )
+						.end()
+						.find( ".ui-icon" )
+							.toggleClass( "ui-icon-minus", !isCollapse )
+							.toggleClass( "ui-icon-plus", isCollapse );
+
+					$this.toggleClass( "ui-collapsible-collapsed", isCollapse );
+					collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse );
+
+					if ( contentTheme && ( !collapsibleSet.length || collapsible.jqmData( "collapsible-last" ) ) ) {
+						collapsibleHeading
+							.find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) )
+							.toggleClass( "ui-corner-bottom", isCollapse );
+						collapsibleContent.toggleClass( "ui-corner-bottom", !isCollapse );
+					}
+					collapsibleContent.trigger( "updatelayout" );
+				}
+			})
+			.trigger( o.collapsed ? "collapse" : "expand" );
+
+		collapsibleHeading
+			.bind( "click", function( event ) {
+
+				var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ?
+										"expand" : "collapse";
+
+				collapsible.trigger( type );
+
+				event.preventDefault();
+			});
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( $.mobile.collapsible.prototype.options.initSelector, e.target ).collapsible();
+});
+
+})( jQuery );
+/*
+* "fieldcontain" plugin - simple class additions to make form row separators
+*/
+
+(function( $, undefined ) {
+
+$.fn.fieldcontain = function( options ) {
+	return this.addClass( "ui-field-contain ui-body ui-br" );
+};
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( ":jqmData(role='fieldcontain')", e.target ).fieldcontain();
+});
+
+})( jQuery );/*
+* plugin for creating CSS grids
+*/
+
+(function( $, undefined ) {
+
+$.fn.grid = function( options ) {
+	return this.each(function() {
+
+		var $this = $( this ),
+			o = $.extend({
+				grid: null
+			},options),
+			$kids = $this.children(),
+			gridCols = {solo:1, a:2, b:3, c:4, d:5},
+			grid = o.grid,
+			iterator;
+
+			if ( !grid ) {
+				if ( $kids.length <= 5 ) {
+					for ( var letter in gridCols ) {
+						if ( gridCols[ letter ] === $kids.length ) {
+							grid = letter;
+						}
+					}
+				} else {
+					grid = "a";
+				}
+			}
+			iterator = gridCols[grid];
+
+		$this.addClass( "ui-grid-" + grid );
+
+		$kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" );
+
+		if ( iterator > 1 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" );
+		}
+		if ( iterator > 2 ) {
+			$kids.filter( ":nth-child(3n+3)" ).addClass( "ui-block-c" );
+		}
+		if ( iterator > 3 ) {
+			$kids.filter( ":nth-child(4n+4)" ).addClass( "ui-block-d" );
+		}
+		if ( iterator > 4 ) {
+			$kids.filter( ":nth-child(5n+5)" ).addClass( "ui-block-e" );
+		}
+	});
+};
+})( jQuery );/*
+* "navbar" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.navbar", $.mobile.widget, {
+	options: {
+		iconpos: "top",
+		grid: null,
+		initSelector: ":jqmData(role='navbar')"
+	},
+
+	_create: function(){
+
+		var $navbar = this.element,
+			$navbtns = $navbar.find( "a" ),
+			iconpos = $navbtns.filter( ":jqmData(icon)" ).length ?
+									this.options.iconpos : undefined;
+
+		$navbar.addClass( "ui-navbar" )
+			.attr( "role","navigation" )
+			.find( "ul" )
+				.grid({ grid: this.options.grid });
+
+		if ( !iconpos ) {
+			$navbar.addClass( "ui-navbar-noicons" );
+		}
+
+		$navbtns.buttonMarkup({
+			corners:	false,
+			shadow:		false,
+			iconpos:	iconpos
+		});
+
+		$navbar.delegate( "a", "vclick", function( event ) {
+			$navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass );
+			$( this ).addClass( $.mobile.activeBtnClass );
+		});
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( $.mobile.navbar.prototype.options.initSelector, e.target ).navbar();
+});
+
+})( jQuery );
+/*
+* "listview" plugin
+*/
+
+(function( $, undefined ) {
+
+//Keeps track of the number of lists per page UID
+//This allows support for multiple nested list in the same page
+//https://github.com/jquery/jquery-mobile/issues/1617
+var listCountPerPage = {};
+
+$.widget( "mobile.listview", $.mobile.widget, {
+	options: {
+		theme: null,
+		countTheme: "c",
+		headerTheme: "b",
+		dividerTheme: "b",
+		splitIcon: "arrow-r",
+		splitTheme: "b",
+		inset: false,
+		initSelector: ":jqmData(role='listview')"
+	},
+
+	_create: function() {
+		var t = this;
+
+		// create listview markup
+		t.element.addClass(function( i, orig ) {
+			return orig + " ui-listview " + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
+		});
+
+		t.refresh( true );
+	},
+
+	_removeCorners: function( li, which ) {
+		var top = "ui-corner-top ui-corner-tr ui-corner-tl",
+			bot = "ui-corner-bottom ui-corner-br ui-corner-bl";
+
+		li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) );
+
+		if ( which === "top" ) {
+			li.removeClass( top );
+		} else if ( which === "bottom" ) {
+			li.removeClass( bot );
+		} else {
+			li.removeClass( top + " " + bot );
+		}
+	},
+
+	_refreshCorners: function( create ) {
+		var $li,
+			$visibleli,
+			$topli,
+			$bottomli;
+
+		if ( this.options.inset ) {
+			$li = this.element.children( "li" );
+			// at create time the li are not visible yet so we need to rely on .ui-screen-hidden
+			$visibleli = create?$li.not( ".ui-screen-hidden" ):$li.filter( ":visible" );
+
+			this._removeCorners( $li );
+
+			// Select the first visible li element
+			$topli = $visibleli.first()
+				.addClass( "ui-corner-top" );
+
+			$topli.add( $topli.find( ".ui-btn-inner" )
+					.not( ".ui-li-link-alt span:first-child" ) )
+                                .addClass( "ui-corner-top" )
+                                .end()
+				.find( ".ui-li-link-alt, .ui-li-link-alt span:first-child" )
+					.addClass( "ui-corner-tr" )
+				.end()
+				.find( ".ui-li-thumb" )
+					.not(".ui-li-icon")
+					.addClass( "ui-corner-tl" );
+
+			// Select the last visible li element
+			$bottomli = $visibleli.last()
+				.addClass( "ui-corner-bottom" );
+
+			$bottomli.add( $bottomli.find( ".ui-btn-inner" ) )
+				.find( ".ui-li-link-alt" )
+					.addClass( "ui-corner-br" )
+				.end()
+				.find( ".ui-li-thumb" )
+					.not(".ui-li-icon")
+					.addClass( "ui-corner-bl" );
+		}
+		if ( !create ) {
+			this.element.trigger( "updatelayout" );
+		}
+	},
+
+	// This is a generic utility method for finding the first
+	// node with a given nodeName. It uses basic DOM traversal
+	// to be fast and is meant to be a substitute for simple
+	// $.fn.closest() and $.fn.children() calls on a single
+	// element. Note that callers must pass both the lowerCase
+	// and upperCase version of the nodeName they are looking for.
+	// The main reason for this is that this function will be
+	// called many times and we want to avoid having to lowercase
+	// the nodeName from the element every time to ensure we have
+	// a match. Note that this function lives here for now, but may
+	// be moved into $.mobile if other components need a similar method.
+	_findFirstElementByTagName: function( ele, nextProp, lcName, ucName )
+	{
+		var dict = {};
+		dict[ lcName ] = dict[ ucName ] = true;
+		while ( ele ) {
+			if ( dict[ ele.nodeName ] ) {
+				return ele;
+			}
+			ele = ele[ nextProp ];
+		}
+		return null;
+	},
+	_getChildrenByTagName: function( ele, lcName, ucName )
+	{
+		var results = [],
+			dict = {};
+		dict[ lcName ] = dict[ ucName ] = true;
+		ele = ele.firstChild;
+		while ( ele ) {
+			if ( dict[ ele.nodeName ] ) {
+				results.push( ele );
+			}
+			ele = ele.nextSibling;
+		}
+		return $( results );
+	},
+
+	_addThumbClasses: function( containers )
+	{
+		var i, img, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			img = $( this._findFirstElementByTagName( containers[ i ].firstChild, "nextSibling", "img", "IMG" ) );
+			if ( img.length ) {
+				img.addClass( "ui-li-thumb" );
+				$( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+			}
+		}
+	},
+
+	refresh: function( create ) {
+		this.parentPage = this.element.closest( ".ui-page" );
+		this._createSubPages();
+
+		var o = this.options,
+			$list = this.element,
+			self = this,
+			dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,
+			listsplittheme = $list.jqmData( "splittheme" ),
+			listspliticon = $list.jqmData( "spliticon" ),
+			li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ),
+			counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,
+			itemClassDict = {},
+			item, itemClass, itemTheme,
+			a, last, splittheme, countParent, icon, imgParents, img;
+
+		if ( counter ) {
+			$list.find( ".ui-li-dec" ).remove();
+		}
+		
+		if ( !o.theme ) {
+			o.theme = $.mobile.getInheritedTheme( this.element, "c" );
+		}
+
+		for ( var pos = 0, numli = li.length; pos < numli; pos++ ) {
+			item = li.eq( pos );
+			itemClass = "ui-li";
+
+			// If we're creating the element, we update it regardless
+			if ( create || !item.hasClass( "ui-li" ) ) {
+				itemTheme = item.jqmData("theme") || o.theme;
+				a = this._getChildrenByTagName( item[ 0 ], "a", "A" );
+
+				if ( a.length ) {
+					icon = item.jqmData("icon");
+
+					icon = false;
+					item.buttonMarkup({
+						wrapperEls: "div",
+						shadow: false,
+						corners: false,
+						iconpos: "right",
+						icon: a.length > 1 || icon === false ? false : icon || "arrow-r",
+						theme: itemTheme
+					});
+
+					if ( ( icon != false ) && ( a.length == 1 ) ) {
+						item.addClass( "ui-li-has-arrow" );
+					}
+
+					a.first().addClass( "ui-link-inherit" );
+
+					if ( a.length > 1 ) {
+						itemClass += " ui-li-has-alt";
+
+						last = a.last();
+						splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;
+
+						last.appendTo(item)
+							.attr( "title", last.getEncodedText() )
+							.addClass( "ui-li-link-alt" )
+							.empty()
+							.buttonMarkup({
+								shadow: false,
+								corners: false,
+								theme: itemTheme,
+								icon: false,
+								iconpos: false
+							})
+							.find( ".ui-btn-inner" )
+								.append(
+									$( document.createElement( "span" ) ).buttonMarkup({
+										shadow: true,
+										corners: true,
+										theme: splittheme,
+										iconpos: "notext",
+										icon: listspliticon || last.jqmData( "icon" ) || o.splitIcon
+									})
+								);
+					}
+				} else if ( item.jqmData( "role" ) === "list-divider" ) {
+
+					itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;
+					item.attr( "role", "heading" );
+
+					//reset counter when a divider heading is encountered
+					if ( counter ) {
+						counter = 1;
+					}
+
+				} else {
+					itemClass += " ui-li-static ui-body-" + itemTheme;
+				}
+			}
+
+			if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+				countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );
+
+				countParent.addClass( "ui-li-jsnumbering" )
+					.prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );
+			}
+
+			// Instead of setting item class directly on the list item and its
+			// btn-inner at this point in time, push the item into a dictionary
+			// that tells us what class to set on it so we can do this after this
+			// processing loop is finished.
+
+			if ( !itemClassDict[ itemClass ] ) {
+				itemClassDict[ itemClass ] = [];
+			}
+
+			itemClassDict[ itemClass ].push( item[ 0 ] );
+		}
+
+		// Set the appropriate listview item classes on each list item
+		// and their btn-inner elements. The main reason we didn't do this
+		// in the for-loop above is because we can eliminate per-item function overhead
+		// by calling addClass() and children() once or twice afterwards. This
+		// can give us a significant boost on platforms like WP7.5.
+
+		for ( itemClass in itemClassDict ) {
+			$( itemClassDict[ itemClass ] ).addClass( itemClass ).children( ".ui-btn-inner" ).addClass( itemClass );
+		}
+
+		$list.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" )
+			.end()
+
+			.find( "p, dl" ).addClass( "ui-li-desc" )
+			.end()
+
+			.find( ".ui-li-aside" ).each(function() {
+					var $this = $(this);
+					$this.prependTo( $this.parent() ); //shift aside to front for css float
+				})
+			.end()
+
+			.find( ".ui-li-count" ).each( function() {
+					$( this ).closest( "li" ).addClass( "ui-li-has-count" );
+				}).addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" );
+
+		// The idea here is to look at the first image in the list item
+		// itself, and any .ui-link-inherit element it may contain, so we
+		// can place the appropriate classes on the image and list item.
+		// Note that we used to use something like:
+		//
+		//    li.find(">img:eq(0), .ui-link-inherit>img:eq(0)").each( ... );
+		//
+		// But executing a find() like that on Windows Phone 7.5 took a
+		// really long time. Walking things manually with the code below
+		// allows the 400 listview item page to load in about 3 seconds as
+		// opposed to 30 seconds.
+
+		this._addThumbClasses( li );
+		this._addThumbClasses( $list.find( ".ui-link-inherit" ) );
+
+		this._refreshCorners( create );
+	},
+
+	//create a string for ID/subpage url creation
+	_idStringEscape: function( str ) {
+		return str.replace(/[^a-zA-Z0-9]/g, '-');
+	},
+
+	_createSubPages: function() {
+		var parentList = this.element,
+			parentPage = parentList.closest( ".ui-page" ),
+			parentUrl = parentPage.jqmData( "url" ),
+			parentId = parentUrl || parentPage[ 0 ][ $.expando ],
+			parentListId = parentList.attr( "id" ),
+			o = this.options,
+			dns = "data-" + $.mobile.ns,
+			self = this,
+			persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),
+			hasSubPages;
+
+		if ( typeof listCountPerPage[ parentId ] === "undefined" ) {
+			listCountPerPage[ parentId ] = -1;
+		}
+
+		parentListId = parentListId || ++listCountPerPage[ parentId ];
+
+		$( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) {
+			var self = this,
+				list = $( this ),
+				listId = list.attr( "id" ) || parentListId + "-" + i,
+				parent = list.parent(),
+				nodeEls = $( list.prevAll().toArray().reverse() ),
+				nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim(parent.contents()[ 0 ].nodeValue) + "</span>" ),
+				title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text
+				id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,
+				theme = list.jqmData( "theme" ) || o.theme,
+				countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,
+				newPage, anchor;
+
+			//define hasSubPages for use in later removal
+			hasSubPages = true;
+
+			newPage = list.detach()
+						.wrap( "<div " + dns + "role='page' " +	dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )
+						.parent()
+							.before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )
+							.after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='"+ persistentFooterID +"'>") : "" )
+							.parent()
+								.appendTo( $.mobile.pageContainer );
+
+			newPage.page();
+
+			anchor = parent.find('a:first');
+
+			if ( !anchor.length ) {
+				anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );
+			}
+
+			anchor.attr( "href", "#" + id );
+
+		}).listview();
+
+		// on pagehide, remove any nested pages along with the parent page, as long as they aren't active
+		// and aren't embedded
+		if( hasSubPages &&
+			parentPage.is( ":jqmData(external-page='true')" ) &&
+			parentPage.data("page").options.domCache === false ) {
+
+			var newRemove = function( e, ui ){
+				var nextPage = ui.nextPage, npURL;
+
+				if( ui.nextPage ){
+					npURL = nextPage.jqmData( "url" );
+					if( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ){
+						self.childPages().remove();
+						parentPage.remove();
+					}
+				}
+			};
+
+			// unbind the original page remove and replace with our specialized version
+			parentPage
+				.unbind( "pagehide.remove" )
+				.bind( "pagehide.remove", newRemove);
+		}
+	},
+
+	// TODO sort out a better way to track sub pages of the listview this is brittle
+	childPages: function(){
+		var parentUrl = this.parentPage.jqmData( "url" );
+
+		return $( ":jqmData(url^='"+  parentUrl + "&" + $.mobile.subPageUrlKey +"')");
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( $.mobile.listview.prototype.options.initSelector, e.target ).listview();
+});
+
+})( jQuery );
+/*
+* "listview" filter extension
+*/
+
+(function( $, undefined ) {
+
+$.mobile.listview.prototype.options.filter = false;
+$.mobile.listview.prototype.options.filterPlaceholder = "Filter items...";
+$.mobile.listview.prototype.options.filterTheme = "c";
+$.mobile.listview.prototype.options.filterCallback = function( text, searchValue ){
+	return text.toLowerCase().indexOf( searchValue ) === -1;
+};
+
+$( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
+
+	var list = $( this ),
+		listview = list.data( "listview" );
+
+	if ( !listview.options.filter ) {
+		return;
+	}
+
+	var wrapper = $( "<form>", {
+			"class": "ui-listview-filter ui-bar-" + listview.options.filterTheme,
+			"role": "search"
+		}),
+		search = $( "<input>", {
+			placeholder: listview.options.filterPlaceholder
+		})
+		.attr( "data-" + $.mobile.ns + "type", "search" )
+		.jqmData( "lastval", "" )
+		.bind( "keyup change", function() {
+
+			var $this = $(this),
+				val = this.value.toLowerCase(),
+				listItems = null,
+				lastval = $this.jqmData( "lastval" ) + "",
+				childItems = false,
+				itemtext = "",
+				item, change;
+
+			// Change val as lastval for next execution
+			$this.jqmData( "lastval" , val );
+			change = val.substr( 0 , lastval.length - 1 ).replace( lastval , "" );
+
+			if ( val.length < lastval.length || change.length != ( val.length - lastval.length ) ) {
+
+				// Removed chars or pasted something totally different, check all items
+				listItems = list.children();
+			} else {
+
+				// Only chars added, not removed, only use visible subset
+				listItems = list.children( ":not(.ui-screen-hidden)" );
+			}
+
+			if ( val ) {
+
+				// This handles hiding regular rows without the text we search for
+				// and any list dividers without regular rows shown under it
+
+				for ( var i = listItems.length - 1; i >= 0; i-- ) {
+					item = $( listItems[ i ] );
+					itemtext = item.jqmData( "filtertext" ) || item.text();
+
+					if ( item.is( "li:jqmData(role=list-divider)" ) ) {
+
+						item.toggleClass( "ui-filter-hidequeue" , !childItems );
+
+						// New bucket!
+						childItems = false;
+
+					} else if ( listview.options.filterCallback( itemtext, val ) ) {
+
+						//mark to be hidden
+						item.toggleClass( "ui-filter-hidequeue" , true );
+					} else {
+
+						// There's a shown item in the bucket
+						childItems = true;
+					}
+				}
+
+				// Show items, not marked to be hidden
+				listItems
+					.filter( ":not(.ui-filter-hidequeue)" )
+					.toggleClass( "ui-screen-hidden", false );
+
+				// Hide items, marked to be hidden
+				listItems
+					.filter( ".ui-filter-hidequeue" )
+					.toggleClass( "ui-screen-hidden", true )
+					.toggleClass( "ui-filter-hidequeue", false );
+
+			} else {
+
+				//filtervalue is empty => show all
+				listItems.toggleClass( "ui-screen-hidden", false );
+			}
+			listview._refreshCorners();
+		})
+		.appendTo( wrapper )
+		.textinput();
+
+	if ( $( this ).jqmData( "inset" ) ) {
+		wrapper.addClass( "ui-listview-filter-inset" );
+	}
+
+	wrapper.bind( "submit", function() {
+		return false;
+	})
+	.insertBefore( list );
+});
+
+})( jQuery );/*
+* "nojs" plugin - class to make elements hidden to A grade browsers
+*/
+
+(function( $, undefined ) {
+
+$( document ).bind( "pagecreate create", function( e ){
+	$( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" );
+	
+});
+
+})( jQuery );/*
+* "checkboxradio" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.checkboxradio", $.mobile.widget, {
+	options: {
+		theme: null,
+		initSelector: "input[type='checkbox'],input[type='radio']"
+	},
+	_create: function() {
+		var self = this,
+			input = this.element,
+			// NOTE: Windows Phone could not find the label through a selector
+			// filter works though.
+			label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label[for='" + input[ 0 ].id + "']"),
+			inputtype = input.attr( "type" ),
+			checkedState = inputtype + "-on",
+			uncheckedState = inputtype + "-off",
+			icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState,
+			activeBtn = icon ? "" : " " + $.mobile.activeBtnClass,
+			checkedClass = "ui-" + checkedState + activeBtn,
+			uncheckedClass = "ui-" + uncheckedState,
+			checkedicon = "ui-icon-" + checkedState,
+			uncheckedicon = "ui-icon-" + uncheckedState;
+
+		var checkedpressedicon = checkedicon + "-press",
+			uncheckedpressedicon = uncheckedicon + "-press";
+
+		if ( inputtype !== "checkbox" && inputtype !== "radio" ) {
+			return;
+		}
+
+		// Support fake label
+		if ( label.length == 0 ) {
+			label = $( "<label for='" + input[ 0 ].id  +
+				"' style='display:block;width:1px;height:1px;'></label>" );
+		}
+
+		// Wrap the input + label in a div
+		input.add( label )
+			.wrapAll( "<div class='ui-" + inputtype + "'></div>" );
+
+		// Expose for other methods
+		$.extend( this, {
+			label: label,
+			inputtype: inputtype,
+			checkedClass: checkedClass,
+			uncheckedClass: uncheckedClass,
+			checkedicon: checkedicon,
+			checkedpressedicon: checkedpressedicon,
+			uncheckedpressedicon: uncheckedpressedicon,
+			uncheckedicon: uncheckedicon
+		});
+
+		// If there's no selected theme...
+		if( !this.options.theme ) {
+			this.options.theme = this.element.jqmData( "theme" );
+		}
+
+		label.buttonMarkup({
+			theme: this.options.theme,
+			icon: icon,
+			shadow: false
+		});
+
+		if ( input.hasClass( "favorite" ) ) {
+			input.parent().addClass( "favorite" ).end();
+		}
+
+		label.bind({
+			vmousedown: function() {
+				self.press();
+			},
+			vmouseup: function() {
+				self.unpress();
+			},
+
+
+			vmouseover: function( event ) {
+				if ( $( this ).parent().is( ".ui-disabled" ) ) {
+					event.stopPropagation();
+				}
+			},
+
+			vclick: function( event ) {
+				if ( input.is( ":disabled" ) ) {
+					event.preventDefault();
+					return;
+				}
+
+				self._cacheVals();
+
+				input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) );
+
+				// trigger click handler's bound directly to the input as a substitute for
+				// how label clicks behave normally in the browsers
+				// TODO: it would be nice to let the browser's handle the clicks and pass them
+				//       through to the associate input. we can swallow that click at the parent
+				//       wrapper element level
+				input.triggerHandler( 'click' );
+
+				// Input set for common radio buttons will contain all the radio
+				// buttons, but will not for checkboxes. clearing the checked status
+				// of other radios ensures the active button state is applied properly
+				self._getInputSet().not( input ).prop( "checked", false );
+
+				self._updateAll();
+				return false;
+			}
+
+		});
+
+		input
+			.bind({
+				vmousedown: function() {
+					self._cacheVals();
+				},
+
+				vclick: function() {
+					var $this = $(this);
+
+					// Adds checked attribute to checked input when keyboard is used
+					if ( $this.is( ":checked" ) ) {
+
+						$this.prop( "checked", true);
+						self._getInputSet().not($this).prop( "checked", false );
+					} else {
+
+						$this.prop( "checked", false );
+					}
+
+					self._updateAll();
+				},
+
+				focus: function() {
+					label.addClass( "ui-focus" );
+				},
+
+				blur: function() {
+					label.removeClass( "ui-focus" );
+				}
+			});
+
+		this.refresh();
+	},
+
+	_cacheVals: function() {
+		this._getInputSet().each(function() {
+			var $this = $(this);
+
+			$this.jqmData( "cacheVal", $this.is( ":checked" ) );
+		});
+	},
+
+	//returns either a set of radios with the same name attribute, or a single checkbox
+	_getInputSet: function(){
+		if(this.inputtype == "checkbox") {
+			return this.element;
+		}
+
+		return this.element.closest( "form,fieldset,:jqmData(role='page')" )
+			.find( "input[name='"+ this.element.attr( "name" ) +"'][type='"+ this.inputtype +"']" );
+	},
+
+	_updateAll: function() {
+		var self = this;
+
+		this._getInputSet().each(function() {
+			var $this = $(this);
+
+			if ( $this.is( ":checked" ) || self.inputtype === "checkbox" ) {
+				$this.trigger( "change" );
+			}
+		})
+		.checkboxradio( "refresh" );
+	},
+
+	press: function() {
+		var input = this.element,
+			label = this.label,
+			icon = label.find( ".ui-icon" );
+
+		if ( !$( input[ 0 ] ).is( ":disabled" ) ) {
+			if ( $( input[ 0 ] ).prop( "checked" ) ) {
+				icon.addClass( this.uncheckedpressedicon ).removeClass( this.checkedicon );
+			} else {
+				icon.removeClass( this.uncheckedicon ).addClass( this.checkedpressedicon );
+			}
+		}
+	},
+
+	unpress: function() {
+		var input = this.element,
+			label = this.label,
+			icon = label.find( ".ui-icon" );
+
+		if ( !$( input[ 0 ] ).is( ":disabled" ) ) {
+			if ( $( input[ 0 ] ).prop( "checked" ) ) {
+				icon.removeClass( this.uncheckedpressedicon ).addClass( this.uncheckedicon );
+			} else {
+				icon.addClass( this.checkedicon ).removeClass( this.checkedpressedicon );
+			}
+		}
+	},
+
+	refresh: function() {
+		var input = this.element,
+			label = this.label,
+			icon = label.find( ".ui-icon" );
+
+		// input[0].checked expando doesn't always report the proper value
+		// for checked='checked'
+		if ( $( input[ 0 ] ).prop( "checked" ) ) {
+
+			label.addClass( this.checkedClass ).removeClass( this.uncheckedClass );
+			icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon );
+
+		} else {
+
+			label.removeClass( this.checkedClass ).addClass( this.uncheckedClass );
+			icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon );
+		}
+
+		if ( input.is( ":disabled" ) ) {
+			this.disable();
+		} else {
+			this.enable();
+		}
+	},
+
+	disable: function() {
+		this.element.prop( "disabled", true ).parent().addClass( "ui-disabled" );
+	},
+
+	enable: function() {
+		this.element.prop( "disabled", false ).parent().removeClass( "ui-disabled" );
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.checkboxradio.prototype.enhanceWithin( e.target );
+});
+
+})( jQuery );
+/*
+* "button" plugin - links that proxy to native input/buttons
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.button", $.mobile.widget, {
+	options: {
+		theme: null,
+		icon: null,
+		iconpos: null,
+		inline: null,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		initSelector: "button, [type='button'], [type='submit'], [type='reset'], [type='image']"
+	},
+	_create: function() {
+		var $el = this.element,
+			o = this.options,
+			type,
+			name,
+			$buttonPlaceholder;
+
+		// Add ARIA role
+		this.button = $( "<div></div>" )
+			.text( $el.text() || $el.val() )
+			.insertBefore( $el )
+			.buttonMarkup({
+				theme: o.theme,
+				icon: o.icon,
+				iconpos: o.iconpos,
+				inline: o.inline,
+				corners: o.corners,
+				shadow: o.shadow,
+				iconshadow: o.iconshadow
+			})
+			.append( $el.addClass( "ui-btn-hidden" ) );
+
+		type = $el.attr( "type" );
+		name = $el.attr( "name" );
+
+		// Add hidden input during submit if input type="submit" has a name.
+		if ( type !== "button" && type !== "reset" && name ) {
+				$el.bind( "vclick", function() {
+					// Add hidden input if it doesn’t already exist.
+					if( $buttonPlaceholder === undefined ) {
+						$buttonPlaceholder = $( "<input>", {
+							type: "hidden",
+							name: $el.attr( "name" ),
+							value: $el.attr( "value" )
+						}).insertBefore( $el );
+
+						// Bind to doc to remove after submit handling
+						$( document ).one("submit", function(){
+							$buttonPlaceholder.remove();
+
+							// reset the local var so that the hidden input
+							// will be re-added on subsequent clicks
+							$buttonPlaceholder = undefined;
+						});
+					}
+				});
+		}
+
+		this.refresh();
+	},
+
+	enable: function() {
+		this.element.attr( "disabled", false );
+		this.button.removeClass( "ui-disabled" ).attr( "aria-disabled", false );
+		return this._setOption( "disabled", false );
+	},
+
+	disable: function() {
+		this.element.attr( "disabled", true );
+		this.button.addClass( "ui-disabled" ).attr( "aria-disabled", true );
+		return this._setOption( "disabled", true );
+	},
+
+	refresh: function() {
+		var $el = this.element;
+
+		if ( $el.prop("disabled") ) {
+			this.disable();
+		} else {
+			this.enable();
+		}
+
+		// the textWrapper is stored as a data element on the button object
+		// to prevent referencing by it's implementation details (eg 'class')
+		this.button.data( 'textWrapper' ).text( $el.text() || $el.val() );
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.button.prototype.enhanceWithin( e.target );
+});
+
+})( jQuery );/*
+* "slider" plugin
+*/
+
+( function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.widget, {
+	options: {
+		theme: null,
+		trackTheme: null,
+		disabled: false,
+		initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')"
+	},
+
+	_create: function() {
+
+		// TODO: Each of these should have comments explain what they're for
+		var self = this,
+
+			control = this.element,
+
+			parentTheme = $.mobile.getInheritedTheme( control, "c" ),
+
+			theme = this.options.theme || parentTheme,
+
+			trackTheme = this.options.trackTheme || parentTheme,
+
+			cType = control[ 0 ].nodeName.toLowerCase(),
+
+			selectClass = ( cType == "select" ) ? "ui-slider-switch" : "",
+
+			controlID = control.attr( "id" ),
+
+			labelID = controlID + "-label",
+
+			label = $( "[for='"+ controlID +"']" ).attr( "id", labelID ),
+
+			val = function() {
+				return  cType == "input"  ? parseFloat( control.val() ) : control[0].selectedIndex;
+			},
+
+			min =  cType == "input" ? parseFloat( control.attr( "min" ) ) : 0,
+
+			max =  cType == "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length-1,
+
+			step = window.parseFloat( control.attr( "step" ) || 1 ),
+
+			slider = $( "<div class='ui-slider " + selectClass + " ui-btn-down-" + trackTheme +
+									" ui-btn-corner-all' role='application'></div>" ),
+
+			handle = $( "<a href='#' class='ui-slider-handle'></a>" )
+				.appendTo( slider )
+				.buttonMarkup({ corners: true, theme: theme, shadow: true })
+				.attr({
+					"role": "slider",
+					"aria-valuemin": min,
+					"aria-valuemax": max,
+					"aria-valuenow": val(),
+					"aria-valuetext": val(),
+					"title": val(),
+					"aria-labelledby": labelID
+				}),
+			options;
+
+		$.extend( this, {
+			slider: slider,
+			handle: handle,
+			dragging: false,
+			beforeStart: null,
+			userModified: false,
+			mouseMoved: false
+		});
+
+		if ( cType == "select" ) {
+
+			slider.wrapInner( "<div class='ui-slider-inneroffset'></div>" );
+			
+			// make the handle move with a smooth transition
+			handle.addClass( "ui-slider-handle-snapping" );
+
+			options = control.find( "option" );
+
+			control.find( "option" ).each(function( i ) {
+
+				var side = !i ? "b":"a",
+					corners = !i ? "right" :"left",
+					theme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass );
+
+				$( "<div class='ui-slider-labelbg ui-slider-labelbg-" + side + theme + " ui-btn-corner-" + corners + "'></div>" )
+					.prependTo( slider );
+
+				$( "<span class='ui-slider-label ui-slider-label-" + side + theme + " ui-btn-corner-" + corners + "' role='img'>" + $( this ).getEncodedText() + "</span>" )
+					.prependTo( handle );
+			});
+
+		}
+
+		label.addClass( "ui-slider" );
+
+		// monitor the input for updated values
+		control.addClass( cType === "input" ? "ui-slider-input" : "ui-slider-switch" )
+			.change( function() {
+				// if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again
+				if (!self.mouseMoved) {
+					self.refresh( val(), true );
+				}
+			})
+			.keyup( function() { // necessary?
+				self.refresh( val(), true, true );
+			})
+			.blur( function() {
+				self.refresh( val(), true );
+			});
+
+		// prevent screen drag when slider activated
+		$( document ).bind( "vmousemove", function( event ) {
+			if ( self.dragging ) {
+				// self.mouseMoved must be updated before refresh() because it will be used in the control "change" event
+				self.mouseMoved = true;
+				
+				if ( cType === "select" ) {
+					// make the handle move in sync with the mouse
+					handle.removeClass( "ui-slider-handle-snapping" );
+				}
+				
+				self.refresh( event );
+				
+				// only after refresh() you can calculate self.userModified
+				self.userModified = self.beforeStart !== control[0].selectedIndex;
+				return false;
+			}
+		});
+
+		slider.bind( "vmousedown", function( event ) {
+			self.dragging = true;
+			self.userModified = false;
+			self.mouseMoved = false;
+
+			if ( cType === "select" ) {
+				self.beforeStart = control[0].selectedIndex;
+			}
+			
+			self.refresh( event );
+			return false;
+		});
+
+		slider.add( document )
+			.bind( "vmouseup", function() {
+				if ( self.dragging ) {
+
+					self.dragging = false;
+
+					if ( cType === "select") {
+					
+						// make the handle move with a smooth transition
+						handle.addClass( "ui-slider-handle-snapping" );
+					
+						if ( self.mouseMoved ) {
+						
+							// this is a drag, change the value only if user dragged enough
+							if ( self.userModified ) {
+								self.refresh( self.beforeStart == 0 ? 1 : 0 );
+							}
+							else {
+								self.refresh( self.beforeStart );
+							}
+							
+						}
+						else {
+							// this is just a click, change the value
+							self.refresh( self.beforeStart == 0 ? 1 : 0 );
+						}
+						
+					}
+					
+					self.mouseMoved = false;
+					
+					return false;
+				}
+			});
+
+		slider.insertAfter( control );
+
+		// NOTE force focus on handle
+		this.handle
+			.bind( "vmousedown", function() {
+				$( this ).focus();
+			})
+			.bind( "vclick", false );
+
+		this.handle
+			.bind( "keydown", function( event ) {
+				var index = val();
+
+				if ( self.options.disabled ) {
+					return;
+				}
+
+				// In all cases prevent the default and mark the handle as active
+				switch ( event.keyCode ) {
+				 case $.mobile.keyCode.HOME:
+				 case $.mobile.keyCode.END:
+				 case $.mobile.keyCode.PAGE_UP:
+				 case $.mobile.keyCode.PAGE_DOWN:
+				 case $.mobile.keyCode.UP:
+				 case $.mobile.keyCode.RIGHT:
+				 case $.mobile.keyCode.DOWN:
+				 case $.mobile.keyCode.LEFT:
+					event.preventDefault();
+
+					if ( !self._keySliding ) {
+						self._keySliding = true;
+						$( this ).addClass( "ui-state-active" );
+					}
+					break;
+				}
+
+				// move the slider according to the keypress
+				switch ( event.keyCode ) {
+				 case $.mobile.keyCode.HOME:
+					self.refresh( min );
+					break;
+				 case $.mobile.keyCode.END:
+					self.refresh( max );
+					break;
+				 case $.mobile.keyCode.PAGE_UP:
+				 case $.mobile.keyCode.UP:
+				 case $.mobile.keyCode.RIGHT:
+					self.refresh( index + step );
+					break;
+				 case $.mobile.keyCode.PAGE_DOWN:
+				 case $.mobile.keyCode.DOWN:
+				 case $.mobile.keyCode.LEFT:
+					self.refresh( index - step );
+					break;
+				}
+			}) // remove active mark
+			.keyup( function( event ) {
+				if ( self._keySliding ) {
+					self._keySliding = false;
+					$( this ).removeClass( "ui-state-active" );
+				}
+			});
+
+		this.refresh(undefined, undefined, true);
+	},
+
+	refresh: function( val, isfromControl, preventInputUpdate ) {
+
+		if ( this.options.disabled || this.element.attr('disabled')) { 
+			this.disable();
+		}
+
+		var control = this.element, percent,
+			cType = control[0].nodeName.toLowerCase(),
+			min = cType === "input" ? parseFloat( control.attr( "min" ) ) : 0,
+			max = cType === "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length - 1;
+
+		if ( typeof val === "object" ) {
+			var data = val,
+				// a slight tolerance helped get to the ends of the slider
+				tol = 8;
+			if ( !this.dragging ||
+					data.pageX < this.slider.offset().left - tol ||
+					data.pageX > this.slider.offset().left + this.slider.width() + tol ) {
+				return;
+			}
+			percent = Math.round( ( ( data.pageX - this.slider.offset().left ) / this.slider.width() ) * 100 );
+		} else {
+			if ( val == null ) {
+				val = cType === "input" ? parseFloat( control.val() ) : control[0].selectedIndex;
+			}
+			percent = ( parseFloat( val ) - min ) / ( max - min ) * 100;
+		}
+
+		if ( isNaN( percent ) ) {
+			return;
+		}
+
+		if ( percent < 0 ) {
+			percent = 0;
+		}
+
+		if ( percent > 100 ) {
+			percent = 100;
+		}
+
+		var newval = Math.round( ( percent / 100 ) * ( max - min ) ) + min;
+
+		if ( newval < min ) {
+			newval = min;
+		}
+
+		if ( newval > max ) {
+			newval = max;
+		}
+
+		// Flip the stack of the bg colors
+		if ( percent > 60 && cType === "select" ) {
+			// TODO: Dead path?
+		}
+		this.handle.css( "left", percent + "%" );
+		this.handle.attr( {
+				"aria-valuenow": cType === "input" ? newval : control.find( "option" ).eq( newval ).attr( "value" ),
+				"aria-valuetext": cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText(),
+				title: newval
+			});
+
+		// add/remove classes for flip toggle switch
+		if ( cType === "select" ) {
+			if ( newval === 0 ) {
+				this.slider.addClass( "ui-slider-switch-a" )
+					.removeClass( "ui-slider-switch-b" );
+			} else {
+				this.slider.addClass( "ui-slider-switch-b" )
+					.removeClass( "ui-slider-switch-a" );
+			}
+		}
+
+		if ( !preventInputUpdate ) {
+			var valueChanged = false;
+
+			// update control"s value
+			if ( cType === "input" ) {
+				valueChanged = control.val() !== newval;
+				control.val( newval );
+			} else {
+				valueChanged = control[ 0 ].selectedIndex !== newval;
+				control[ 0 ].selectedIndex = newval;
+			}
+			if ( !isfromControl && valueChanged ) {
+				control.trigger( "change" );
+			}
+		}
+	},
+
+	enable: function() {
+		this.element.attr( "disabled", false );
+		this.slider.removeClass( "ui-disabled" ).attr( "aria-disabled", false );
+		return this._setOption( "disabled", false );
+	},
+
+	disable: function() {
+		this.element.attr( "disabled", true );
+		this.slider.addClass( "ui-disabled" ).attr( "aria-disabled", true );
+		return this._setOption( "disabled", true );
+	}
+
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.slider.prototype.enhanceWithin( e.target );
+});
+
+})( jQuery );
+/*
+* "textinput" plugin for text inputs, textareas
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.textinput", $.mobile.widget, {
+	options: {
+		theme: null,
+		initSelector: "input[type='text'], input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])"
+	},
+
+	_create: function() {
+
+		var input = this.element,
+			o = this.options,
+			theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
+			themeclass  = " ui-body-" + theme,
+			focusedEl, clearbtn;
+
+		$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+		focusedEl = input.addClass("ui-input-text ui-body-"+ theme );
+
+		// XXX: Temporary workaround for issue 785 (Apple bug 8910589).
+		//      Turn off autocorrect and autocomplete on non-iOS 5 devices
+		//      since the popup they use can't be dismissed by the user. Note
+		//      that we test for the presence of the feature by looking for
+		//      the autocorrect property on the input element. We currently
+		//      have no test for iOS 5 or newer so we're temporarily using
+		//      the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas
+		if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) {
+			// Set the attribute instead of the property just in case there
+			// is code that attempts to make modifications via HTML.
+			input[0].setAttribute( "autocorrect", "off" );
+			input[0].setAttribute( "autocomplete", "off" );
+		}
+
+
+		input.addClass( "ui-corner-all ui-shadow-inset" + themeclass );
+
+		input.focus(function() {
+				focusedEl.addClass( "ui-focus" );
+			})
+			.blur(function(){
+				focusedEl.removeClass( "ui-focus" );
+			});
+
+		// Autogrow
+		if ( input.is( "textarea" ) ) {
+			var extraLineHeight = 15,
+				keyupTimeoutBuffer = 100,
+				keyup = function() {
+					var scrollHeight = input[ 0 ].scrollHeight,
+						clientHeight = input[ 0 ].clientHeight;
+
+					if ( clientHeight < scrollHeight ) {
+						input.height(scrollHeight + extraLineHeight);
+					}
+				},
+				keyupTimeout;
+
+			input.keyup(function() {
+				clearTimeout( keyupTimeout );
+				keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer );
+			});
+
+			// Issue 509: the browser is not providing scrollHeight properly until the styles load
+			if ( $.trim( input.val() ) ) {
+				// bind to the window load to make sure the height is calculated based on BOTH
+				// the DOM and CSS
+				$( window ).load( keyup );
+
+				// binding to pagechange here ensures that for pages loaded via
+				// ajax the height is recalculated without user input
+				$( document ).one( "pagechange", keyup );
+			}
+		}
+	},
+
+	disable: function(){
+		this.element.attr( "disabled", true ).addClass( "ui-disabled" );
+	},
+
+	enable: function(){
+		this.element.attr( "disabled", false).removeClass( "ui-disabled" );
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.textinput.prototype.enhanceWithin( e.target );
+});
+
+})( jQuery );
+/*
+* custom "selectmenu" plugin
+*/
+
+(function( $, undefined ) {
+	var extendSelect = function( widget ){
+
+		var select = widget.select,
+			selectID  = widget.selectID,
+			label = widget.label,
+			thisPage = widget.select.closest( ".ui-page" ),
+			screen = $( "<div>", {"class": "ui-selectmenu-screen ui-screen-hidden"} ).appendTo( thisPage ),
+			selectOptions = widget._selectOptions(),
+			isMultiple = widget.isMultiple = widget.select[ 0 ].multiple,
+			buttonId = selectID + "-button",
+			menuId = selectID + "-menu",
+			menuPage = $( "<div data-" + $.mobile.ns + "role='dialog' data-" +$.mobile.ns + "theme='"+ widget.options.theme +"' data-" +$.mobile.ns + "overlay-theme='"+ widget.options.overlayTheme +"'>" +
+				"<div data-" + $.mobile.ns + "role='header'>" +
+				"<div class='ui-title'>" + label.getEncodedText() + "</div>"+
+				"</div>"+
+				"<div data-" + $.mobile.ns + "role='content'></div>"+
+				"</div>" ).appendTo( $.mobile.pageContainer ).page(),
+
+			listbox =  $("<div>", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-" + widget.options.overlayTheme + " " + $.mobile.defaultDialogTransition } ).insertAfter(screen),
+
+			list = $( "<ul>", {
+				"class": "ui-selectmenu-list",
+				"id": menuId,
+				"role": "listbox",
+				"aria-labelledby": buttonId
+			}).attr( "data-" + $.mobile.ns + "theme", widget.options.theme ).appendTo( listbox ),
+
+			header = $( "<div>", {
+				"class": "ui-header ui-bar-" + widget.options.theme
+			}).prependTo( listbox ),
+
+			headerTitle = $( "<h1>", {
+				"class": "ui-title"
+			}).appendTo( header ),
+
+			headerClose = $( "<a>", {
+				"text": widget.options.closeText,
+				"href": "#",
+				"class": "ui-btn-left"
+			}).attr( "data-" + $.mobile.ns + "iconpos", "notext" ).attr( "data-" + $.mobile.ns + "icon", "delete" ).appendTo( header ).buttonMarkup(),
+
+			menuPageContent = menuPage.find( ".ui-content" ),
+
+			menuPageClose = menuPage.find( ".ui-header a" );
+
+
+		$.extend( widget, {
+			select: widget.select,
+			selectID: selectID,
+			buttonId: buttonId,
+			menuId: menuId,
+			thisPage: thisPage,
+			menuPage: menuPage,
+			label: label,
+			screen: screen,
+			selectOptions: selectOptions,
+			isMultiple: isMultiple,
+			theme: widget.options.theme,
+			listbox: listbox,
+			list: list,
+			header: header,
+			headerTitle: headerTitle,
+			headerClose: headerClose,
+			menuPageContent: menuPageContent,
+			menuPageClose: menuPageClose,
+			placeholder: "",
+
+			build: function() {
+				var self = this;
+
+				// Create list from select, update state
+				self.refresh();
+
+				self.select.attr( "tabindex", "-1" ).focus(function() {
+					$( this ).blur();
+					self.button.focus();
+				});
+
+				// Button events
+				self.button.bind( "vclick keydown" , function( event ) {
+					if ( event.type == "vclick" ||
+							 event.keyCode && ( event.keyCode === $.mobile.keyCode.ENTER ||
+																	event.keyCode === $.mobile.keyCode.SPACE ) ) {
+
+						self.open();
+						event.preventDefault();
+					}
+				});
+
+				// Events for list items
+				self.list.attr( "role", "listbox" )
+					.delegate( ".ui-li>a", "focusin", function() {
+						$( this ).attr( "tabindex", "0" );
+					})
+					.delegate( ".ui-li>a", "focusout", function() {
+						$( this ).attr( "tabindex", "-1" );
+					})
+					.delegate( "li:not(.ui-disabled, .ui-li-divider)", "click", function( event ) {
+
+						// index of option tag to be selected
+						var oldIndex = self.select[ 0 ].selectedIndex,
+							newIndex = self.list.find( "li:not(.ui-li-divider)" ).index( this ),
+							option = self._selectOptions().eq( newIndex )[ 0 ];
+
+						// toggle selected status on the tag for multi selects
+						option.selected = self.isMultiple ? !option.selected : true;
+
+						// toggle checkbox class for multiple selects
+						if ( self.isMultiple ) {
+							$( this ).find( ".ui-icon" )
+								.toggleClass( "ui-icon-checkbox-on", option.selected )
+								.toggleClass( "ui-icon-checkbox-off", !option.selected );
+						}
+
+						// trigger change if value changed
+						if ( self.isMultiple || oldIndex !== newIndex ) {
+							self.select.trigger( "change" );
+						}
+
+						//hide custom select for single selects only
+						if ( !self.isMultiple ) {
+							self.close();
+						}
+
+						event.preventDefault();
+					})
+					.keydown(function( event ) {  //keyboard events for menu items
+						var target = $( event.target ),
+							li = target.closest( "li" ),
+							prev, next;
+
+						// switch logic based on which key was pressed
+						switch ( event.keyCode ) {
+							// up or left arrow keys
+						 case 38:
+							prev = li.prev();
+
+							// if there's a previous option, focus it
+							if ( prev.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								prev.find( "a" ).first().focus();
+							}
+
+							return false;
+							break;
+
+							// down or right arrow keys
+						 case 40:
+							next = li.next();
+
+							// if there's a next option, focus it
+							if ( next.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								next.find( "a" ).first().focus();
+							}
+
+							return false;
+							break;
+
+							// If enter or space is pressed, trigger click
+						 case 13:
+						 case 32:
+							target.trigger( "click" );
+
+							return false;
+							break;
+						}
+					});
+
+				// button refocus ensures proper height calculation
+				// by removing the inline style and ensuring page inclusion
+				self.menuPage.bind( "pagehide", function() {
+					self.list.appendTo( self.listbox );
+					self._focusButton();
+
+					// TODO centralize page removal binding / handling in the page plugin.
+					// Suggestion from @jblas to do refcounting
+					//
+					// TODO extremely confusing dependency on the open method where the pagehide.remove
+					// bindings are stripped to prevent the parent page from disappearing. The way
+					// we're keeping pages in the DOM right now sucks
+					//
+					// rebind the page remove that was unbound in the open function
+					// to allow for the parent page removal from actions other than the use
+					// of a dialog sized custom select
+					//
+					// doing this here provides for the back button on the custom select dialog
+					$.mobile._bindPageRemove.call( self.thisPage );
+				});
+
+				// Events on "screen" overlay
+				self.screen.bind( "vclick", function( event ) {
+					self.close();
+				});
+
+				// Close button on small overlays
+				self.headerClose.click( function() {
+					if ( self.menuType == "overlay" ) {
+						self.close();
+						return false;
+					}
+				});
+
+				// track this dependency so that when the parent page
+				// is removed on pagehide it will also remove the menupage
+				self.thisPage.addDependents( this.menuPage );
+			},
+
+			_isRebuildRequired: function() {
+				var list = this.list.find( "li" ),
+					options = this._selectOptions();
+
+				// TODO exceedingly naive method to determine difference
+				// ignores value changes etc in favor of a forcedRebuild
+				// from the user in the refresh method
+				return options.text() !== list.text();
+			},
+
+			refresh: function( forceRebuild , foo ){
+				var self = this,
+				select = this.element,
+				isMultiple = this.isMultiple,
+				options = this._selectOptions(),
+				selected = this.selected(),
+				// return an array of all selected index's
+				indicies = this.selectedIndices();
+
+				if (  forceRebuild || this._isRebuildRequired() ) {
+					self._buildList();
+				}
+
+				self.setButtonText();
+				self.setButtonCount();
+
+				self.list.find( "li:not(.ui-li-divider)" )
+					.removeClass( $.mobile.activeBtnClass )
+					.attr( "aria-selected", false )
+					.each(function( i ) {
+
+						if ( $.inArray( i, indicies ) > -1 ) {
+							var item = $( this );
+
+							// Aria selected attr
+							item.attr( "aria-selected", true );
+
+							// Multiple selects: add the "on" checkbox state to the icon
+							if ( self.isMultiple ) {
+								item.find( ".ui-icon" ).removeClass( "ui-icon-checkbox-off" ).addClass( "ui-icon-checkbox-on" );
+							} else {
+								item.addClass( $.mobile.activeBtnClass );
+							}
+						}
+					});
+			},
+
+			close: function() {
+				if ( this.options.disabled || !this.isOpen ) {
+					return;
+				}
+
+				var self = this;
+
+				if ( self.menuType == "page" ) {
+					// doesn't solve the possible issue with calling change page
+					// where the objects don't define data urls which prevents dialog key
+					// stripping - changePage has incoming refactor
+					window.history.back();
+				} else {
+					self.screen.addClass( "ui-screen-hidden" );
+					self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass( "in" );
+					self.list.appendTo( self.listbox );
+					self._focusButton();
+				}
+
+				// allow the dialog to be closed again
+				self.isOpen = false;
+			},
+
+			open: function() {
+				if ( this.options.disabled ) {
+					return;
+				}
+
+				var self = this,
+					menuHeight = self.list.parent().outerHeight(),
+					menuWidth = self.list.parent().outerWidth(),
+					activePage = $( ".ui-page-active" ),
+					tOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled,
+					tScrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage;
+					scrollTop = tOverflow ? tScrollElem.scrollTop() : $( window ).scrollTop(),
+					btnOffset = self.button.offset().top,
+					screenHeight = window.innerHeight,
+					screenWidth = window.innerWidth;
+
+				//add active class to button
+				self.button.addClass( $.mobile.activeBtnClass );
+
+				//remove after delay
+				setTimeout( function() {
+					self.button.removeClass( $.mobile.activeBtnClass );
+				}, 300);
+
+				function focusMenuItem() {
+					self.list.find( $.mobile.activeBtnClass ).focus();
+				}
+
+				if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
+					// prevent the parent page from being removed from the DOM,
+					// otherwise the results of selecting a list item in the dialog
+					// fall into a black hole
+					self.thisPage.unbind( "pagehide.remove" );
+
+					//for WebOS/Opera Mini (set lastscroll using button offset)
+					if ( scrollTop == 0 && btnOffset > screenHeight ) {
+						self.thisPage.one( "pagehide", function() {
+							$( this ).jqmData( "lastScroll", btnOffset );
+						});
+					}
+
+					self.menuPage.one( "pageshow", function() {
+						// silentScroll() is called whenever a page is shown to restore
+						// any previous scroll position the page may have had. We need to
+						// wait for the "silentscroll" event before setting focus to avoid
+						// the browser"s "feature" which offsets rendering to make sure
+						// whatever has focus is in view.
+						$( window ).one( "silentscroll", function() {
+							focusMenuItem();
+						});
+
+						self.isOpen = true;
+					});
+
+					self.menuType = "page";
+					self.menuPageContent.append( self.list );
+					self.menuPage.find("div .ui-title").text(self.label.text());
+					$.mobile.changePage( self.menuPage, {
+						transition: $.mobile.defaultDialogTransition
+					});
+				} else {
+					self.menuType = "overlay";
+
+					self.screen.height( $(document).height() )
+						.removeClass( "ui-screen-hidden" );
+
+					// Try and center the overlay over the button
+					var roomtop = btnOffset - scrollTop,
+						roombot = scrollTop + screenHeight - btnOffset,
+						halfheight = menuHeight / 2,
+						maxwidth = parseFloat( self.list.parent().css( "max-width" ) ),
+						newtop, newleft;
+
+					if ( roomtop > menuHeight / 2 && roombot > menuHeight / 2 ) {
+						newtop = btnOffset + ( self.button.outerHeight() / 2 ) - halfheight;
+					} else {
+						// 30px tolerance off the edges
+						newtop = roomtop > roombot ? scrollTop + screenHeight - menuHeight - 30 : scrollTop + 30;
+					}
+
+					// If the menuwidth is smaller than the screen center is
+					if ( menuWidth < maxwidth ) {
+						newleft = ( screenWidth - menuWidth ) / 2;
+					} else {
+
+						//otherwise insure a >= 30px offset from the left
+						newleft = self.button.offset().left + self.button.outerWidth() / 2 - menuWidth / 2;
+
+						// 30px tolerance off the edges
+						if ( newleft < 30 ) {
+							newleft = 30;
+						} else if ( (newleft + menuWidth) > screenWidth ) {
+							newleft = screenWidth - menuWidth - 30;
+						}
+					}
+
+					self.listbox.append( self.list )
+						.removeClass( "ui-selectmenu-hidden" )
+						.css({
+							top: newtop,
+							left: newleft
+						})
+						.addClass( "in" );
+
+					focusMenuItem();
+
+					// duplicate with value set in page show for dialog sized selects
+					self.isOpen = true;
+				}
+			},
+
+			_buildList: function() {
+				var self = this,
+					o = this.options,
+					placeholder = this.placeholder,
+					optgroups = [],
+					lis = [],
+					dataIcon = self.isMultiple ? "checkbox-off" : "false";
+
+				self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
+
+				// Populate menu with options from select element
+				self.select.find( "option" ).each( function( i ) {
+					var $this = $( this ),
+						$parent = $this.parent(),
+						text = $this.getEncodedText(),
+						anchor = "<a href='#'>"+ text +"</a>",
+						classes = [],
+						extraAttrs = [];
+
+					// Are we inside an optgroup?
+					if ( $parent.is( "optgroup" ) ) {
+						var optLabel = $parent.attr( "label" );
+
+						// has this optgroup already been built yet?
+						if ( $.inArray( optLabel, optgroups ) === -1 ) {
+							lis.push( "<li data-" + $.mobile.ns + "role='list-divider'>"+ optLabel +"</li>" );
+							optgroups.push( optLabel );
+						}
+					}
+
+					// Find placeholder text
+					// TODO: Are you sure you want to use getAttribute? ^RW
+					if ( !this.getAttribute( "value" ) || text.length == 0 || $this.jqmData( "placeholder" ) ) {
+						if ( o.hidePlaceholderMenuItems ) {
+							classes.push( "ui-selectmenu-placeholder" );
+						}
+						placeholder = self.placeholder = text;
+					}
+
+					// support disabled option tags
+					if ( this.disabled ) {
+						classes.push( "ui-disabled" );
+						extraAttrs.push( "aria-disabled='true'" );
+					}
+
+					lis.push( "<li data-" + $.mobile.ns + "option-index='" + i + "' data-" + $.mobile.ns + "icon='"+ dataIcon +"' class='"+ classes.join(" ") + "' " + extraAttrs.join(" ") +">"+ anchor +"</li>" );
+				});
+
+				self.list.html( lis.join(" ") );
+
+				self.list.find( "li" )
+					.attr({ "role": "option", "tabindex": "-1" })
+					.first().attr( "tabindex", "0" );
+
+				// Hide header close link for single selects
+				if ( !this.isMultiple ) {
+					this.headerClose.hide();
+				}
+
+				// Hide header if it's not a multiselect and there's no placeholder
+				if ( !this.isMultiple && !placeholder.length ) {
+					this.header.hide();
+				} else {
+					this.headerTitle.text( this.placeholder );
+				}
+
+				// Now populated, create listview
+				self.list.listview();
+			},
+
+			_button: function(){
+				return $( "<a>", {
+					"href": "#",
+					"role": "button",
+					// TODO value is undefined at creation
+					"id": this.buttonId,
+					"aria-haspopup": "true",
+
+					// TODO value is undefined at creation
+					"aria-owns": this.menuId
+				});
+			}
+		});
+	};
+
+	$( "select" ).live( "selectmenubeforecreate", function(){
+		var selectmenuWidget = $( this ).data( "selectmenu" );
+
+		if( !selectmenuWidget.options.nativeMenu ){
+			extendSelect( selectmenuWidget );
+		}
+	});
+})( jQuery );
+/*
+* "selectmenu" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.selectmenu", $.mobile.widget, {
+	options: {
+		theme: null,
+		disabled: false,
+		icon: "arrow-d",
+		iconpos: "right",
+		inline: null,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		menuPageTheme: "b",
+		overlayTheme: "a",
+		hidePlaceholderMenuItems: true,
+		closeText: "Close",
+		nativeMenu: true,
+		initSelector: "select:not(:jqmData(role='slider'))"
+	},
+
+	_button: function(){
+		return $( "<div/>" );
+	},
+
+	_setDisabled: function( value ) {
+		this.element.attr( "disabled", value );
+		this.button.attr( "aria-disabled", value );
+		return this._setOption( "disabled", value );
+	},
+
+	_focusButton : function() {
+		var self = this;
+
+		setTimeout( function() {
+			self.button.focus();
+		}, 40);
+	},
+
+  _selectOptions: function() {
+    return this.select.find( "option" );
+  },
+
+	// setup items that are generally necessary for select menu extension
+	_preExtension: function(){
+		this.select = this.element.wrap( "<div class='ui-select'>" );
+		this.selectID  = this.select.attr( "id" );
+		this.label = $( "label[for='"+ this.selectID +"']" ).addClass( "ui-select" );
+		this.isMultiple = this.select[ 0 ].multiple;
+		if ( !this.options.theme ) {
+			this.options.theme = $.mobile.getInheritedTheme( this.select, "c" );
+		}
+	},
+
+	_create: function() {
+		this._preExtension();
+
+ 		// Allows for extension of the native select for custom selects and other plugins
+		// see select.custom for example extension
+		// TODO explore plugin registration
+		this._trigger( "beforeCreate" );
+
+		this.button = this._button();
+
+		var self = this,
+
+			options = this.options,
+
+			// IE throws an exception at options.item() function when
+			// there is no selected item
+			// select first in this case
+			selectedIndex = this.select[ 0 ].selectedIndex == -1 ? 0 : this.select[ 0 ].selectedIndex,
+
+			// TODO values buttonId and menuId are undefined here
+			button = this.button
+				.text( $( this.select[ 0 ].options.item( selectedIndex ) ).text() )
+				.insertBefore( this.select )
+				.buttonMarkup( {
+					theme: options.theme,
+					icon: options.icon,
+					iconpos: options.iconpos,
+					inline: options.inline,
+					corners: options.corners,
+					shadow: options.shadow,
+					iconshadow: options.iconshadow
+				});
+
+		// Opera does not properly support opacity on select elements
+		// In Mini, it hides the element, but not its text
+		// On the desktop,it seems to do the opposite
+		// for these reasons, using the nativeMenu option results in a full native select in Opera
+		if ( options.nativeMenu && window.opera && window.opera.version ) {
+			this.select.addClass( "ui-select-nativeonly" );
+		}
+
+		// Add counter for multi selects
+		if ( this.isMultiple ) {
+			this.buttonCount = $( "<span>" )
+				.addClass( "ui-li-count ui-btn-up-c ui-btn-corner-all" )
+				.hide()
+				.appendTo( button.addClass('ui-li-has-count') );
+		}
+
+		// Disable if specified
+		if ( options.disabled || this.element.attr('disabled')) {
+			this.disable();
+		}
+
+		// Events on native select
+		this.select.change( function() {
+			self.refresh();
+		});
+
+		this.build();
+	},
+
+	build: function() {
+		var self = this;
+
+		this.select
+			.appendTo( self.button )
+			.bind( "vmousedown", function() {
+				// Add active class to button
+				self.button.addClass( $.mobile.activeBtnClass );
+			})
+			.bind( "focus vmouseover", function() {
+				self.button.trigger( "vmouseover" );
+			})
+			.bind( "vmousemove", function() {
+				// Remove active class on scroll/touchmove
+				self.button.removeClass( $.mobile.activeBtnClass );
+			})
+			.bind( "change blur vmouseout", function() {
+				self.button.trigger( "vmouseout" )
+					.removeClass( $.mobile.activeBtnClass );
+			})
+			.bind( "change blur", function() {
+				self.button.removeClass( "ui-btn-down-" + self.options.theme );
+			});
+	},
+
+	selected: function() {
+		return this._selectOptions().filter( ":selected" );
+	},
+
+	selectedIndices: function() {
+		var self = this;
+
+		return this.selected().map( function() {
+			return self._selectOptions().index( this );
+		}).get();
+	},
+
+	setButtonText: function() {
+		var self = this, selected = this.selected();
+
+		this.button.find( ".ui-btn-text" ).text( function() {
+			if ( !self.isMultiple ) {
+				return selected.text();
+			}
+
+			return selected.length ? selected.map( function() {
+				return $( this ).text();
+			}).get().join( ", " ) : self.placeholder;
+		});
+	},
+
+	setButtonCount: function() {
+		var selected = this.selected();
+
+		// multiple count inside button
+		if ( this.isMultiple ) {
+			this.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length );
+		}
+	},
+
+	refresh: function() {
+		this.setButtonText();
+		this.setButtonCount();
+	},
+
+	// open and close preserved in native selects
+	// to simplify users code when looping over selects
+	open: $.noop,
+	close: $.noop,
+
+	disable: function() {
+		this._setDisabled( true );
+		this.button.addClass( "ui-disabled" );
+	},
+
+	enable: function() {
+		this._setDisabled( false );
+		this.button.removeClass( "ui-disabled" );
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.selectmenu.prototype.enhanceWithin( e.target );
+});
+})( jQuery );
+/*
+* "buttons" plugin - for making button-like links
+*/
+
+/*
+ * Button Markup modified for TIZEN style.
+ *
+ * HTML Attributes:
+ *
+ *		data-role: button
+ *		data-style: circle, nobg, edit
+ *
+ * Examples:
+ *
+ *  	<div data-role="button" data-inline="true" data-icon="send" data-style="circle"></div>
+ *  	<div data-role="button" data-inline="true" data-icon="favorite" data-style="nobg">
+ *  	<div data-role="button" data-inline="true" data-icon="editminus" data-style="edit"></div>
+ */
+
+( function( $, undefined ) {
+
+$.fn.buttonMarkup = function( options ) {
+	options = options || {};
+
+	for ( var i = 0; i < this.length; i++ ) {
+		var el = this.eq( i ),
+			e = el[ 0 ],
+			o = $.extend( {}, $.fn.buttonMarkup.defaults, {
+				icon:       options.icon       !== undefined ? options.icon       : el.jqmData( "icon" ),
+				iconpos:    options.iconpos    !== undefined ? options.iconpos    : el.jqmData( "iconpos" ),
+				theme:      options.theme      !== undefined ? options.theme      : el.jqmData( "theme" ),
+				inline:     options.inline     !== undefined ? options.inline     : el.jqmData( "inline" ),
+				shadow:     options.shadow     !== undefined ? options.shadow     : el.jqmData( "shadow" ),
+				corners:    options.corners    !== undefined ? options.corners    : el.jqmData( "corners" ),
+				iconshadow: options.iconshadow !== undefined ? options.iconshadow : el.jqmData( "iconshadow" )
+			}, options ),
+
+			// Classes Defined
+			innerClass = "ui-btn-inner",
+			textClass = "ui-btn-text",
+			buttonClass, iconClass,
+
+			// Button inner markup
+			buttonInner = document.createElement( o.wrapperEls ),
+			buttonText = document.createElement( o.wrapperEls ),
+			buttonIcon = o.icon ? document.createElement( "span" ) : null;
+
+		if ( attachEvents ) {
+			attachEvents();
+		}
+
+		// if not, try to find closest theme container
+		if ( !o.theme ) {
+			o.theme = $.mobile.getInheritedTheme( el, "c" );
+		}
+
+		buttonClass = "ui-btn ui-btn-up-" + o.theme;
+
+		if ( o.inline ) {
+			buttonClass += " ui-btn-inline";
+		}
+
+		if ( o.icon ) {
+			o.icon = "ui-icon-" + o.icon;
+			o.iconpos = o.iconpos || "left";
+
+			iconClass = "ui-icon " + o.icon;
+
+			if ( o.iconshadow ) {
+				iconClass += " ui-icon-shadow";
+			}
+		}
+
+		if ( o.iconpos ) {
+			buttonClass += " ui-btn-icon-" + o.iconpos;
+
+			if ( o.iconpos == "notext" && !el.attr( "title" ) ) {
+				el.attr( "title", el.getEncodedText() );
+			}
+		}
+
+		if ( o.corners ) {
+			buttonClass += " ui-btn-corner-all";
+			innerClass += " ui-btn-corner-all";
+		}
+
+		if ( o.shadow ) {
+			buttonClass += " ui-shadow";
+		}
+
+		/* TIZEN style markup */
+		buttonStyle = el.jqmData("style");
+
+		if ( buttonStyle == "circle" ) {
+			/* style : no text, Icon only */
+			buttonClass += " ui-btn-corner-circle";
+			buttonClass += " ui-btn-icon_only";
+		} else if ( buttonStyle == "nobg" ) {
+			/* style : no text, Icon only, no bg */
+			buttonClass += " ui-btn-icon-nobg";
+			buttonClass += " ui-btn-icon_only";
+		} else if ( buttonStyle == "edit" ) {
+			buttonClass += " ui-btn-edit";
+		}
+
+		if ( o.icon ) {
+			if ( $(el).text().length > 0 ) {
+				o.iconpos == "right" ?
+					textClass += " ui-btn-text-padding-right" :
+					textClass += " ui-btn-text-padding-left";
+
+				innerClass += " ui-btn-hastxt";
+			} else {
+				if ( buttonStyle == "circle" ) {
+					/* style : no text, Icon only */
+					innerClass += " ui-btn-corner-circle";
+				} else if ( buttonStyle == "nobg" ) {
+					/* style : no text, Icon only, no bg */
+					innerClass += " ui-btn-icon-nobg";
+				}
+
+				buttonClass += " ui-btn-icon_only";
+				innerClass += " ui-btn-icon-only";
+			}
+		} else {
+			if ( $(el).text().length > 0 ) {
+				innerClass += " ui-btn-hastxt";
+			}
+		}
+
+		el.attr( "data-" + $.mobile.ns + "theme", o.theme )
+			.addClass( buttonClass );
+
+		buttonInner.className = innerClass;
+		buttonInner.setAttribute("aria-hidden", "true");
+
+		buttonText.className = textClass;
+		buttonInner.appendChild( buttonText );
+
+		if ( buttonIcon ) {
+			buttonIcon.className = iconClass;
+			buttonInner.appendChild( buttonIcon );
+		}
+
+		while ( e.firstChild ) {
+			buttonText.appendChild( e.firstChild );
+		}
+
+		e.appendChild( buttonInner );
+		
+		// TODO obviously it would be nice to pull this element out instead of
+		// retrieving it from the DOM again, but this change is much less obtrusive
+		// and 1.0 draws nigh
+		el.data( 'textWrapper', $( buttonText ) );
+	}
+
+	return this;
+};
+
+$.fn.buttonMarkup.defaults = {
+	corners: true,
+	shadow: true,
+	iconshadow: true,
+	inline: false,
+	wrapperEls: "span"
+};
+
+function closestEnabledButton( element ) {
+    var cname;
+
+    while ( element ) {
+		// Note that we check for typeof className below because the element we
+		// handed could be in an SVG DOM where className on SVG elements is defined to
+		// be of a different type (SVGAnimatedString). We only operate on HTML DOM
+		// elements, so we look for plain "string".
+
+        cname = ( typeof element.className === 'string' ) && element.className.split(' ');
+
+        if ( cname && $.inArray( "ui-btn", cname ) > -1 && $.inArray( "ui-disabled", cname ) < 0 ) {
+            break;
+        }
+        element = element.parentNode;
+    }
+
+    return element;
+}
+
+// Bug fix: When moving finger out of button after touching down button, button color MUST be returned.
+// button click event comes this order : vmouseover -> vmousedown -> vmouseup -> vmouseout
+
+var selectedButton = null;
+var useScrollview = false;
+
+var attachEvents = function() {
+	$( document ).bind( {
+		"vmouseover focus": function( event ) {
+			var $btn, theme;
+
+			// check if there is selected button... if so, make it to "btn-up" state.
+			if ( selectedButton ) {
+				$btn = $( selectedButton );
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+				$btn.removeClass( "ui-btn-down-" + theme ).removeClass( "ui-btn-hover-" + theme )
+					.addClass( "ui-btn-up-" + theme );
+			}
+
+			selectedButton = closestEnabledButton( event.target );
+			if ( selectedButton ) {
+				$btn = $( selectedButton );
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+				$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );
+			}
+		},
+		"vmouseout blur": function( event ) {
+			var $btn, theme;
+
+			if ( selectedButton ) {
+				$btn = $( selectedButton );
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+				$btn.removeClass( "ui-btn-hover-" + theme ).removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+			}
+		},
+		"vmousedown": function( event ) {
+			var $btn, theme;
+
+			if ( !selectedButton ) {
+				selectedButton = closestEnabledButton( event.target );
+			}
+
+			$btn = $( selectedButton );
+			theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+			$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
+		},
+		"vmousecancel vmouseup": function( event ) {
+			var $btn, theme;
+
+			if ( selectedButton ) {
+				$btn = $( selectedButton );
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+				$btn.removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+
+				if ( event.type === "vmousecancel" && useScrollview ) {
+					event.preventDefault();
+				}
+				selectedButton = null;
+			}
+		},
+		"scrollstart scrollview_scroll": function( event ) {
+			if ( event.type === "scrollview_scroll" ) {
+				useScrollview = true;
+			}
+			$( this ).trigger("vmousecancel");
+		}
+	});
+
+	attachEvents = null;
+};
+
+//links in bars, or those with  data-role become buttons
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+
+	$( ":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a", e.target )
+		.not( ".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.buttonMarkup();
+});
+
+})( jQuery );
+/* 
+* "controlgroup" plugin - corner-rounding for groups of buttons, checks, radios, etc
+*/
+
+(function( $, undefined ) {
+
+$.fn.controlgroup = function( options ) {
+
+	return this.each(function() {
+
+		var $el = $( this ),
+			o = $.extend({
+						direction: $el.jqmData( "type" ) || "vertical",
+						shadow: false,
+						excludeInvisible: true
+					}, options ),
+			groupheading = $el.children( "legend" ),
+			flCorners = o.direction == "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ],
+			type = $el.find( "input" ).first().attr( "type" );
+
+		// Replace legend with more stylable replacement div
+		if ( groupheading.length ) {
+			$el.wrapInner( "<div class='ui-controlgroup-controls'></div>" );
+			$( "<div role='heading' class='ui-controlgroup-label'>" + groupheading.html() + "</div>" ).insertBefore( $el.children(0) );
+			groupheading.remove();
+		}
+
+		$el.addClass( "ui-corner-all ui-controlgroup ui-controlgroup-" + o.direction );
+
+		// TODO: This should be moved out to the closure
+		// otherwise it is redefined each time controlgroup() is called
+		function flipClasses( els ) {
+			els.removeClass( "ui-btn-corner-all ui-shadow" )
+				.eq( 0 ).addClass( flCorners[ 0 ] )
+				.end()
+				.last().addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" );
+		}
+
+		flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ) );
+		flipClasses( $el.find( ".ui-btn-inner" ) );
+
+		if ( o.shadow ) {
+			$el.addClass( "ui-shadow" );
+		}
+	});
+};
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( ":jqmData(role='controlgroup')", e.target ).controlgroup({ excludeInvisible: false });
+});
+
+})(jQuery);/*
+* "links" plugin - simple class additions for links
+*/
+
+(function( $, undefined ) {
+
+$( document ).bind( "pagecreate create", function( e ){
+	
+	//links within content areas
+	$( e.target )
+		.find( "a" )
+		.not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.addClass( "ui-link" );
+
+});
+
+})( jQuery );/*
+* "fixHeaderFooter" plugin - on-demand positioning for headers,footers
+*/
+
+/*
+ * Header/Footer can be created using the
+ * data-role="header", data-role="footer" attribute to an element.
+ *
+ * Every page in SLP theme have Header&Footer and default footer contains back button
+ * Framework automatically generate footer even though web developer does not define footer
+ * For more detail footer usage, refer Page(page.section.js) guideline
+ *
+ * Attribute:
+ *    data-position : default value is fixed, automatically generated footer has fixed position,
+ *                   in header, web dev. defines header fix or not.
+ *
+ * Examples:
+ *
+ *     HTML markup for creating header :
+ *         <div data-role="header" data-position="fixed">
+ *             <h1>NBeat UI</h1>
+ *         </div>
+ *
+ *     HTML markup for creating 1 button title ( button is available 1~3 )
+ *         <div data-role="header" data-position="fixed">
+ *             <a>Text1</a>
+ *             <h1>Title Area</h1>
+ *         </div>
+ *
+ *     HTML markup for creating 2 button and groupControl title ( Groupcontrol is available 2~4 )
+ *     <div data-role="header" data-position="fixed">
+ *         <a>Text</a>
+ *         <h1>Title Extend 2 Button </h1>
+ *         <a>Text</a>
+ *         <div data-role="fieldcontain">
+ *             <fieldset data-role="controlgroup" data-type="horizontal">
+ *                 <input type="radio" name="radio-view-8" data-icon="segment-titlestyle-segonly" id="segment1" value="on" checked="checked" />
+ *                 <label for="segment1">All</label>
+ *                 <input type="radio" name="radio-view-8" data-icon="segment-titlestyle-segonly" id="segment2" value="off" />
+ *                 <label for="segment2">Call</label>
+ *             </fieldset>
+ *         </div>
+ *     </div>
+ *
+ *     HTML markup for creating footer
+ *         <div data-role="footer" data-position="fixed">
+ *         </div>
+ */
+
+(function( $, undefined ) {
+
+var slideDownClass = "ui-header-fixed ui-fixed-inline fade",
+	slideUpClass = "ui-footer-fixed ui-fixed-inline fade",
+
+	slideDownSelector = ".ui-header:jqmData(position='fixed')",
+	slideUpSelector = ".ui-footer:jqmData(position='fixed')";
+
+$.fn.fixHeaderFooter = function( options ) {
+
+	if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) {
+		return this;
+	}
+
+	return this.each(function() {
+		var $this = $( this );
+
+		if ( $this.jqmData( "fullscreen" ) ) {
+			$this.addClass( "ui-page-fullscreen" );
+		}
+
+		// Should be slidedown
+		$this.find( slideDownSelector ).addClass( slideDownClass );
+
+		// Should be slideup
+		$this.find( slideUpSelector ).addClass( slideUpClass );
+	});
+};
+
+// single controller for all showing,hiding,toggling
+$.mobile.fixedToolbars = (function() {
+
+	if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) {
+		return;
+	}
+
+	var stickyFooter, delayTimer,
+		currentstate = "inline",
+		autoHideMode = false,
+		showDelay = 100,
+		ignoreTargets = "a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed",
+		toolbarSelector = ".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last",
+		// for storing quick references to duplicate footers
+		supportTouch = $.support.touch,
+		touchStartEvent = supportTouch ? "touchstart" : "mousedown",
+		touchStopEvent = supportTouch ? "touchend" : "mouseup",
+		stateBefore = null,
+		scrollTriggered = false,
+//		defaultFooterHeight = 114,
+		touchToggleEnabled = true;
+
+	function showEventCallback( event ) {
+		// An event that affects the dimensions of the visual viewport has
+		// been triggered. If the header and/or footer for the current page are in overlay
+		// mode, we want to hide them, and then fire off a timer to show them at a later
+		// point. Events like a resize can be triggered continuously during a scroll, on
+		// some platforms, so the timer is used to delay the actual positioning until the
+		// flood of events have subsided.
+		//
+		// If we are in autoHideMode, we don't do anything because we know the scroll
+		// callbacks for the plugin will fire off a show when the scrolling has stopped.
+
+		var footer_filter;
+
+		if ( $( document ).find( ".ui-page-active" ).length ) {
+			footer_filter = $( document ).find( ".ui-page-active" ).find( ":jqmData(role='footer')" );
+		} else {
+			footer_filter = $( document ).find( ":jqmData(role='footer')" ).eq( 0 );
+		}
+
+//		if ( footer_filter.height() < defaultFooterHeight ) {
+//			footer_filter.css("height", defaultFooterHeight);
+//		}
+
+		footer_filter
+			.css( "top", $(window).height() - footer_filter.height() )
+			.show();
+
+		var footerNavbar = footer_filter.find(".ui-navbar");
+
+		if ( footerNavbar.jqmData("style") == "toolbar" ) {
+			footerNavbar
+				.css( "width", $(window).width() - footerNavbar.siblings(".ui-btn").width() );
+		}
+
+		// divide content mode scrollview and non-scrollview
+		// recalculate content area when resize callback occur
+		if ( event.type == "resize" ) {
+			var s_theme_header =
+				$( document ).find( ".ui-page-active" ).find( ":jqmData(role='header')" );
+			var s_theme_content =
+				$( document ).find( ".ui-page-active" ).find( ":jqmData(role='content')" );
+
+			if ( $.support.scrollview ) {
+				if ( s_theme_header.css("position") != "fixed" ) {
+					s_theme_header.css( "position", "fixed" );
+				}
+
+				s_theme_content.css( "top", s_theme_header.height() );
+				s_theme_content.css( "height",
+						document.documentElement.clientHeight -
+						footer_filter.height() - s_theme_header.height() );
+			} else {
+				if ( s_theme_header.css("position") != "fixed" ) {
+					s_theme_header.css( "position", "relative" );
+					s_theme_content
+						.css( "top", "0" )
+						.css( "height", "" );
+				}
+			}
+		}
+
+		if ( !autoHideMode && currentstate === "overlay" ) {
+			if ( !delayTimer ) {
+				$.mobile.fixedToolbars.hide( true );
+			}
+
+			$.mobile.fixedToolbars.startShowTimer();
+		}
+	}
+
+	$(function() {
+		var $document = $( document ),
+			$window = $( window );
+
+		$document
+			.bind( "vmousedown", function( event ) {
+				if ( touchToggleEnabled ) {
+					stateBefore = currentstate;
+				}
+			})
+			.bind( "vclick", function( event ) {
+				if ( touchToggleEnabled ) {
+
+					if ( $(event.target).closest( ignoreTargets ).length ) {
+						return;
+					}
+
+					if ( !scrollTriggered ) {
+						$.mobile.fixedToolbars.toggle( stateBefore );
+						stateBefore = null;
+					}
+				}
+			})
+			.bind( "silentscroll", showEventCallback );
+
+
+		// The below checks first for a $(document).scrollTop() value, and if zero, binds scroll events to $(window) instead.
+		// If the scrollTop value is actually zero, both will return zero anyway.
+		//
+		// Works with $(document), not $(window) : Opera Mobile (WinMO phone; kinda broken anyway)
+		// Works with $(window), not $(document) : IE 7/8
+		// Works with either $(window) or $(document) : Chrome, FF 3.6/4, Android 1.6/2.1, iOS
+		// Needs work either way : BB5, Opera Mobile (iOS)
+
+		( ( $document.scrollTop() === 0 ) ? $window : $document )
+			.bind( "scrollstart", function( event ) {
+				if ( $( event.target ).find(":jqmData(role='header')").is(":jqmData(position='fixed')") ) {
+					return;
+				}
+
+				scrollTriggered = true;
+
+				if ( stateBefore === null ) {
+					stateBefore = currentstate;
+				}
+
+				// We only enter autoHideMode if the headers/footers are in
+				// an overlay state or the show timer was started. If the
+				// show timer is set, clear it so the headers/footers don't
+				// show up until after we're done scrolling.
+				var isOverlayState = stateBefore == "overlay";
+
+				autoHideMode = isOverlayState || !!delayTimer;
+
+				if ( autoHideMode ) {
+					$.mobile.fixedToolbars.clearShowTimer();
+
+					if ( isOverlayState ) {
+						$.mobile.fixedToolbars.hide( true );
+					}
+				}
+			})
+			.bind( "scrollstop", function( event ) {
+				if ( $( event.target ).closest( ignoreTargets ).length ) {
+					return;
+				}
+
+				scrollTriggered = false;
+
+				if ( autoHideMode ) {
+					$.mobile.fixedToolbars.startShowTimer();
+					autoHideMode = false;
+				}
+				stateBefore = null;
+			});
+
+			$window.bind( "resize", showEventCallback );
+	});
+
+	// 1. Before page is shown, check for duplicate footer
+	// 2. After page is shown, append footer to new page
+	$( ".ui-page" )
+		.live( "pagebeforeshow", function( event, ui ) {
+			/* Fixed header modify for theme-s */
+			var s_theme_header = $( event.target ).find(":jqmData(role='header')");
+			var s_theme_fieldcontain = s_theme_header.find(":jqmData(role='fieldcontain')");
+			var s_theme_content = $( event.target ).find(".ui-content");
+			var title_style = "normal";
+
+			if ( s_theme_fieldcontain.length != 0 ) {
+				title_style = "extended";
+			}
+
+			if ( s_theme_header.jqmData("position") == "fixed" || window.S.frameworkData.theme.match(/tizen/).length ||
+				s_theme_header.css("position") == "fixed" ) {
+				s_theme_header
+					.css( "position", "fixed" )
+					.css( "top", "0px" );
+
+				if ( s_theme_header.children().is(".ui-navbar") ) {
+					s_theme_header.addClass("ui-title-controlbar-height");
+					$( event.target ).find( ".ui-content" )
+						.addClass("ui-title-content-controlbar-height");
+				} else {
+					$( event.target ).find( ".ui-content" )
+						.addClass("ui-title-content-" + title_style + "-height");
+				}
+			}
+
+			if ( s_theme_header.children().is(".ui-option-header") ) {
+				s_theme_content.removeClass("ui-title-content-" + title_style + "-height");
+
+				if ( s_theme_header.children().is(".input-search-bar") ) {
+					s_theme_content.addClass("ui-title-content-optionheader-search");
+				} else {
+					if ( $.tizen.optionheader.prototype.options.collapseOnInit == true ) {
+						s_theme_content
+							.addClass("ui-title-content-option-header-collapsed-1line-height");
+					} else {
+						s_theme_content
+							.addClass("ui-title-content-option-header-expanded-1line-height");
+					}
+				}
+			} else if( s_theme_header.find("input").attr("type") === "search" || s_theme_header.find("input").attr("type") === "tizen-search" ) {
+				s_theme_content
+					.removeClass("ui-title-content-" + title_style + "-height")
+					.addClass("ui-title-content-search");
+			}
+
+			if ( s_theme_header.children().is("a") ||
+				s_theme_header.children().find(".ui-radio").length != 0 ) {
+				if ( title_style == "normal" ) {
+					if ( s_theme_header.children("a").length == 3 ) {
+						s_theme_header.find( "a" ).eq( 1 )
+							.removeClass("ui-btn-right")
+							.addClass("ui-title-normal-3btn");
+
+						s_theme_header.find( "a" ).eq( 2 )
+							.addClass("ui-btn-right");
+					}
+				} else {
+					var group_length = s_theme_fieldcontain.find(".ui-radio").length;
+
+					s_theme_header
+						.addClass("ui-title-extended-height");
+
+					s_theme_fieldcontain
+						.find(".ui-controlgroup")
+						.addClass("ui-title-extended-controlgroup");
+
+					s_theme_fieldcontain
+						.find(".ui-controlgroup")
+						.addClass("ui-extended-controlgroup");
+
+					s_theme_fieldcontain
+						.addClass("ui-title-extended-segment-style");
+
+					if ( group_length == 2 || group_length == 3 || group_length == 4 ) {
+						s_theme_fieldcontain
+							.addClass("ui-title-extended-controlgroup-" + group_length + "btn");
+					}
+				}
+				s_theme_content.addClass("ui-title-content-" + title_style + "-height");
+			}
+
+			// divide content mode scrollview and non-scrollview
+			// recalculate content area when resize callback occur
+			if ( event.type == "resize" ) {
+				if ( $.support.scrollview ) {
+					if ( s_theme_header.css("position") != "fixed" ) {
+						s_theme_header.css( "position", "fixed" );
+					}
+
+					s_theme_content.css( "top", s_theme_header.height() );
+				} else {
+					if ( s_theme_header.css("position") != "fixed" ) {
+						s_theme_header.css( "position", "relative" );
+						s_theme_content.css( "top", "0" );
+					}
+				}
+			}
+
+			var footer_filter = $( document ).find(":jqmData(role='footer')");
+
+			if ( footer_filter.find(".ui-navbar").is(".ui-controlbar-s") ){
+				footer_filter
+					.css( "top", $(window).height() - footer_filter.height() )
+					.show();
+			}
+
+			if ( footer_filter.children().find(".ui-radio").length != 0 ) {
+				var footerGroup = footer_filter.find(":jqmData(role='fieldcontain')");
+				var groupLength = footerGroup.find(".ui-radio").length;
+
+				footerGroup.find(".ui-controlgroup")
+					.addClass("ui-extended-controlgroup")
+					.addClass("ui-footer-extended-controlgroup")
+					.css( "display", "inline" );
+
+					/* Groupcontrol cannot initialize inline property at first page */
+				footerGroup.addClass("ui-title-extended-controlgroup-" + groupLength + "btn");
+
+				footerButton = footer_filter.children("a");
+				footerButton.each(function( i ) {
+					if ( footerButton.eq( i ).is(".ui-btn") && !footerButton.eq( i ).is(".ui-btn-back") ){
+						footerButton.eq( i )
+							.removeClass("ui-btn-left")
+							.addClass("ui-btn-footer-right");
+					}
+				});
+			}
+
+			var page = $( event.target ),
+				footer = page.find( ":jqmData(role='footer')" ),
+				id = footer.data( "id" ),
+				prevPage = ui.prevPage,
+				prevFooter = prevPage && prevPage.find( ":jqmData(role='footer')" ),
+				prevFooterMatches = prevFooter.length && prevFooter.jqmData( "id" ) === id;
+
+			if ( id && prevFooterMatches ) {
+				stickyFooter = footer;
+				stickyFooter.removeClass( "fade in out" ).appendTo( $.mobile.pageContainer );
+				stickyFooter
+					.css("position", "fixed")
+					.css("top", $(".ui-page").find(":jqmData(role='footer')").eq( 0 ).css("top"));
+
+			}
+
+			if ( footer.is(".ui-footer-fixed") ) {
+				footer.css( "top", $(window).height() - footer.height() );
+			}
+
+			/* Increase Content size with dummy <div> because of footer height */
+			if ( footer.length != 0 && $( event.target ).find(".dummy-div").length == 0 ) {
+				$( event.target ).find( ":jqmData(role='content')" ).append( '<div class="dummy-div"></div>' );
+				$( ".dummy-div" )
+					.css( "width", footer.width() )
+					.css( "height", footer.height() );
+
+//				if ( $(".dummy-div").height() < defaultFooterHeight ) {
+//					$( ".dummy-div" ).css( "height", defaultFooterHeight );
+//				}
+			}
+
+			/* Header position fix(remove transition) */
+			var next_id = $( event.target ).attr( "id" );
+
+			$( "#"+next_id ).find( ":jqmData(role='header')" )
+				.removeClass( "fade in out" )
+				.appendTo( $.mobile.pageContainer );
+		})
+		.live( "pageshow", function( event, ui ) {
+			/* Fixed header modify for theme-s */
+			var s_theme_header = $( event.target ).find( ":jqmData(role='header')" );
+			if ( s_theme_header.is(".ui-header-fixed") && s_theme_header.is(".ui-bar-s") ) {
+				$( event.target ).find(":jqmData(role='header')")
+					.css( "position", "fixed" )
+					.css( "top", "0px" );
+
+				 ( $( document ).scrollTop() === 0 ? $( window ) : $( document ) )
+					.unbind("scrollstart")
+					.unbind("silentscroll")
+					.unbind("scrollstop");
+			}
+
+			var $this = $( this );
+
+			if ( stickyFooter && stickyFooter.length ) {
+				setTimeout(function() {
+					setTop( stickyFooter.appendTo( $this ).addClass( "fade" ) );
+					stickyFooter = null;
+				}, 500);
+			}
+
+			$.mobile.fixedToolbars.show( true, this );
+
+			/* Header position fix(remove transition) */
+			$("body").children(":jqmData(role='header')")
+				.insertBefore( $(event.target).find(":jqmData(role='content')").eq( 0 ) );
+		});
+
+
+	// When a collapsiable is hidden or shown we need to trigger the fixed toolbar to reposition itself (#1635)
+	$( ".ui-collapsible-contain" ).live( "collapse expand", showEventCallback );
+
+	// element.getBoundingClientRect() is broken in iOS 3.2.1 on the iPad. The
+	// coordinates inside of the rect it returns don't have the page scroll position
+	// factored out of it like the other platforms do. To get around this,
+	// we'll just calculate the top offset the old fashioned way until core has
+	// a chance to figure out how to handle this situation.
+	//
+	// TODO: We'll need to get rid of getOffsetTop() once a fix gets folded into core.
+
+	function getOffsetTop( ele ) {
+		var top = 0,
+			op, body;
+
+		if ( ele ) {
+			body = document.body;
+			op = ele.offsetParent;
+			top = ele.offsetTop;
+
+			while ( ele && ele != body ) {
+				top += ele.scrollTop || 0;
+
+				if ( ele == op ) {
+					top += op.offsetTop;
+					op = ele.offsetParent;
+				}
+
+				ele = ele.parentNode;
+			}
+		}
+		return top;
+	}
+
+	function setTop( el ) {
+		if ( el.parents(".ui-page").find(":jqmData(role='header')").is(".ui-header-fixed") &&
+			el.parents(".ui-page").find(":jqmData(role='header')").is(".ui-bar-s") ) {
+			return;
+		}
+
+		var fromTop = $(window).scrollTop(),
+			thisTop = getOffsetTop( el[ 0 ] ), // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead.
+			thisCSStop = el.css( "top" ) == "auto" ? 0 : parseFloat(el.css( "top" )),
+			screenHeight = $(window).height(),
+			thisHeight = el.outerHeight(),
+			useRelative = el.parents( ".ui-page:not(.ui-page-fullscreen)" ).length,
+			relval;
+
+		if ( el.is( ".ui-header-fixed" ) ) {
+
+			relval = fromTop - thisTop + thisCSStop;
+
+			if ( relval < thisTop ) {
+				relval = 0;
+			}
+
+			return el.css( "top", useRelative ? relval : fromTop );
+		} else {
+			// relval = -1 * (thisTop - (fromTop + screenHeight) + thisCSStop + thisHeight);
+			// if ( relval > thisTop ) { relval = 0; }
+			relval = fromTop + screenHeight - thisHeight - (thisTop - thisCSStop );
+
+			return el.css( "top", useRelative ? relval : fromTop + screenHeight - thisHeight );
+		}
+	}
+
+	// Exposed methods
+	return {
+
+		show: function( immediately, page ) {
+
+			$.mobile.fixedToolbars.clearShowTimer();
+
+			currentstate = "overlay";
+
+			var $ap = page ? $( page ) :
+					( $.mobile.activePage ? $.mobile.activePage :
+						$( ".ui-page-active" ) );
+
+			return $ap.children( toolbarSelector ).each(function() {
+
+				var el = $( this ),
+					fromTop = $( window ).scrollTop(),
+					// el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead.
+					thisTop = getOffsetTop( el[ 0 ] ),
+					screenHeight = $(window).height(),
+					thisHeight = el.outerHeight(),
+					alreadyVisible = ( el.is( ".ui-header-fixed" ) && fromTop <= thisTop + thisHeight ) ||
+														( el.is( ".ui-footer-fixed" ) && thisTop <= fromTop + screenHeight );
+			});
+		},
+
+		hide: function( immediately ) {
+
+			currentstate = "inline";
+
+			var $ap = $.mobile.activePage ? $.mobile.activePage :
+									$( ".ui-page-active" );
+
+			return $ap.children( toolbarSelector ).each(function() {
+
+				var el = $(this),
+					thisCSStop = el.css( "top" ),
+					classes;
+
+				thisCSStop = thisCSStop == "auto" ? 0 :
+											parseFloat(thisCSStop);
+
+				// Add state class
+				el.addClass( "ui-fixed-inline" ).removeClass( "ui-fixed-overlay" );
+
+				if ( thisCSStop < 0 || ( el.is( ".ui-header-fixed" ) && thisCSStop !== 0 ) ) {
+
+					if ( immediately ) {
+						el.css( "top", 0);
+					} else {
+
+						if ( el.css( "top" ) !== "auto" && parseFloat( el.css( "top" ) ) !== 0 ) {
+
+							classes = "out reverse";
+
+							el.animationComplete(function() {
+								el.removeClass( classes ).css( "top", 0 );
+							}).addClass( classes );
+						}
+					}
+				}
+			});
+		},
+
+		startShowTimer: function() {
+
+			$.mobile.fixedToolbars.clearShowTimer();
+
+			var args = [].slice.call( arguments );
+
+			delayTimer = setTimeout(function() {
+				delayTimer = undefined;
+				$.mobile.fixedToolbars.show.apply( null, args );
+			}, showDelay);
+		},
+
+		clearShowTimer: function() {
+			if ( delayTimer ) {
+				clearTimeout( delayTimer );
+			}
+			delayTimer = undefined;
+		},
+
+		toggle: function( from ) {
+			if ( from ) {
+				currentstate = from;
+			}
+			return ( currentstate === "overlay" ) ? $.mobile.fixedToolbars.hide() :
+								$.mobile.fixedToolbars.show();
+		},
+
+		setTouchToggleEnabled: function( enabled ) {
+			touchToggleEnabled = enabled;
+		}
+	};
+})();
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( event ) {
+
+	if ( $( ":jqmData(position='fixed')", event.target ).length ) {
+
+		$( event.target ).each(function() {
+
+			if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) {
+				return this;
+			}
+
+			var $this = $( this );
+
+			if ( $this.jqmData( "fullscreen" ) ) {
+				$this.addClass( "ui-page-fullscreen" );
+			}
+
+			// Should be slidedown
+			$this.find( slideDownSelector ).addClass( slideDownClass );
+
+			// Should be slideup
+			$this.find( slideUpSelector ).addClass( slideUpClass );
+
+		})
+
+	}
+});
+
+})( jQuery );
+/*
+* "fixHeaderFooter" native plugin - Behavior for "fixed" headers,footers, and scrolling inner content
+*/
+
+(function( $, undefined ) {
+
+// Enable touch overflow scrolling when it's natively supported
+$.mobile.touchOverflowEnabled = false;
+
+// Enabled zoom when touch overflow is enabled. Can cause usability issues, unfortunately
+$.mobile.touchOverflowZoomEnabled = false;
+
+$( document ).bind( "pagecreate", function( event ) {
+	if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){
+		
+		var $target = $( event.target ),
+			scrollStartY = 0;
+			
+		if( $target.is( ":jqmData(role='page')" ) ){
+			
+			$target.each(function() {
+				var $page = $( this ),
+					$fixies = $page.find( ":jqmData(role='header'), :jqmData(role='footer')" ).filter( ":jqmData(position='fixed')" ),
+					fullScreen = $page.jqmData( "fullscreen" ),
+					$scrollElem = $fixies.length ? $page.find( ".ui-content" ) : $page;
+				
+				$page.addClass( "ui-mobile-touch-overflow" );
+				
+				$scrollElem.bind( "scrollstop", function(){
+					if( $scrollElem.scrollTop() > 0 ){
+						window.scrollTo( 0, $.mobile.defaultHomeScroll );
+					}
+				});	
+				
+				if( $fixies.length ){
+					
+					$page.addClass( "ui-native-fixed" );
+					
+					if( fullScreen ){
+
+						$page.addClass( "ui-native-fullscreen" );
+
+						$fixies.addClass( "fade in" );
+
+						$( document ).bind( "vclick", function(){
+							$fixies
+								.removeClass( "ui-native-bars-hidden" )
+								.toggleClass( "in out" )
+								.animationComplete(function(){
+									$(this).not( ".in" ).addClass( "ui-native-bars-hidden" );
+								});
+						});
+					}
+				}
+			});
+		}
+	}
+});
+
+})( jQuery );
+/*
+* "init" - Initialize the framework
+*/
+
+(function( $, window, undefined ) {
+	var	$html = $( "html" ),
+			$head = $( "head" ),
+			$window = $( window );
+
+ 	// trigger mobileinit event - useful hook for configuring $.mobile settings before they're used
+	$( window.document ).trigger( "mobileinit" );
+
+	// support conditions
+	// if device support condition(s) aren't met, leave things as they are -> a basic, usable experience,
+	// otherwise, proceed with the enhancements
+	if ( !$.mobile.gradeA() ) {
+		return;
+	}
+
+	// override ajaxEnabled on platforms that have known conflicts with hash history updates
+	// or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini)
+	if ( $.mobile.ajaxBlacklist ) {
+		$.mobile.ajaxEnabled = false;
+	}
+
+	// add mobile, initial load "rendering" classes to docEl
+	$html.addClass( "ui-mobile ui-mobile-rendering" );
+
+	// loading div which appears during Ajax requests
+	// will not appear if $.mobile.loadingMessage is false
+	var $loader = $( "<div class='ui-loader ui-body-a ui-corner-all'><span class='ui-icon ui-icon-loading spin'></span><h1></h1></div>" );
+
+	$.extend($.mobile, {
+		// turn on/off page loading message.
+		showPageLoadingMsg: function() {
+			if ( $.mobile.loadingMessage ) {
+				var activeBtn = $( "." + $.mobile.activeBtnClass ).first();
+
+				$loader
+					.find( "h1" )
+						.text( $.mobile.loadingMessage )
+						.end()
+					.appendTo( $.mobile.pageContainer )
+					// position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
+					.css({
+						top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 ||
+						activeBtn.length && activeBtn.offset().top || 100
+					});
+			}
+
+			$html.addClass( "ui-loading" );
+		},
+
+		hidePageLoadingMsg: function() {
+			$html.removeClass( "ui-loading" );
+		},
+
+		// find and enhance the pages in the dom and transition to the first page.
+		initializePage: function() {
+			// find present pages
+			var $pages = $( ":jqmData(role='page')" );
+
+			// if no pages are found, create one with body's inner html
+			if ( !$pages.length ) {
+				$pages = $( "body" ).wrapInner( "<div data-" + $.mobile.ns + "role='page'></div>" ).children( 0 );
+			}
+
+			// add dialogs, set data-url attrs
+			$pages.add( ":jqmData(role='dialog')" ).each(function() {
+				var $this = $(this);
+
+				// unless the data url is already set set it to the pathname
+				if ( !$this.jqmData("url") ) {
+					$this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search );
+				}
+			});
+
+			// define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback)
+			$.mobile.firstPage = $pages.first();
+
+			// define page container
+			$.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" );
+
+			// alert listeners that the pagecontainer has been determined for binding
+			// to events triggered on it
+			$window.trigger( "pagecontainercreate" );
+
+			// cue page loading message
+			$.mobile.showPageLoadingMsg();
+
+			// if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM
+			if ( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ) {
+				$.mobile.changePage( $.mobile.firstPage, { transition: "none", reverse: true, changeHash: false, fromHashChange: true } );
+			}
+			// otherwise, trigger a hashchange to load a deeplink
+			else {
+				$window.trigger( "hashchange", [ true ] );
+			}
+		}
+	});
+	
+	// This function injects a meta viewport tag to prevent scaling. Off by default, on by default when touchOverflow scrolling is enabled
+	function disableZoom() {
+		var cont = "user-scalable=no",
+			meta = $( "meta[name='viewport']" );
+			
+		if( meta.length ){
+			meta.attr( "content", meta.attr( "content" ) + ", " + cont );
+		}
+		else{
+			$( "head" ).prepend( "<meta>", { "name": "viewport", "content": cont } );
+		}
+	}
+	
+	// if touch-overflow is enabled, disable user scaling, as it creates usability issues
+	if( $.support.touchOverflow && $.mobile.touchOverflowEnabled && !$.mobile.touchOverflowZoomEnabled ){
+		disableZoom();
+	}
+
+	// initialize events now, after mobileinit has occurred
+	$.mobile._registerInternalEvents();
+
+	// check which scrollTop value should be used by scrolling to 1 immediately at domready
+	// then check what the scroll top is. Android will report 0... others 1
+	// note that this initial scroll won't hide the address bar. It's just for the check.
+	$(function() {
+		window.scrollTo( 0, 1 );
+
+		// if defaultHomeScroll hasn't been set yet, see if scrollTop is 1
+		// it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar)
+		// so if it's 1, use 0 from now on
+		$.mobile.defaultHomeScroll = ( !$.support.scrollTop || $(window).scrollTop() === 1 ) ? 0 : 1;
+
+		//dom-ready inits
+		if( $.mobile.autoInitializePage ){
+			$.mobile.initializePage();
+		}
+
+		// window load event
+		// hide iOS browser chrome on load
+		$window.load( $.mobile.silentScroll );
+	});
+})( jQuery, this );
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw.js
new file mode 100644
index 0000000..c69fa5e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw.js
@@ -0,0 +1,16145 @@
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Base class for widgets that need the following features:
+//
+// I. HTML prototype loading
+//
+// This class provides HTML prototype loading for widgets. That is, the widget implementation specifies its HTML portions
+// in one continuous HTML snippet, and it optionally provides an object containing selectors into the various parts of the
+// HTML snippet. This widget loads the HTML snippet into a jQuery object, and optionally assigns jQuery objects to each of
+// the selectors in the optionally provided object.
+//
+// To use this functionality you can either derive from this class, or you can call its prototype's gtype method.
+//
+// 1. Widgets deriving from this class should define _htmlProto as part of their prototype declaration. _htmlProto looks like
+// this:
+//
+// _htmlProto: {
+//     source: string|jQuery object (optional) default: string - The name of the widget
+//     ui: {
+//         uiElement1: "#ui-element-1-selector",
+//         uiElement2: "#ui-element-2-selector",
+//         ...
+//         subElement: {
+//             subElement1: "#sub-element-1-selector",
+//             subElement2: "#sub-element-2-selector",
+//             ...
+//         }
+//         ...
+//     }
+// }
+//
+// If neither 'source' nor 'ui' are defined, you must still include an empty _htmlProto key (_htmlProto: {}) to indicate
+// that you wish to make use of this feature. This will cause a prototype HTML file named after your widget to be loaded.
+// The loaded prototype will be placed into your widget's prototype's _protoHtml.source key.
+//
+// If 'source' is defined as a string, it is the name of the widget (including namespace). This is the default. If your
+// widget's HTML prototype is loaded via AJAX and the name of the AJAX file is different from the name of your widget
+// (that is, it is not "<widgetName>.prototype.html", then you should explicitly define 'source' as:
+//
+// If you wish to load HTML prototypes via AJAX, modify the getProtoPath() function defined below to reflect the directory
+// structure holding your widget HTML prototypes.
+//
+// source: "alternateWidgetName"
+//
+// If AJAX loading fails, source is set to a jQuery object containing a div with an error message. You can check whether
+// loading failed via the jQuery object's jqmData( "tizen.widgetex.ajax.fail" ) data item. If false, then the jQuery object
+// is the actual prototype loaded via AJAX or present inline. Otherwise, the jQuery object is the error message div.
+//
+// If 'source' is defined as a jQuery object, it is considered already loaded.
+//
+// if 'ui' is defined inside _htmlProto, It is assumed to be an object such that every one of its keys is either a string,
+// or another object with the same properties as itself.
+//
+// When a widget is instantiated, the HTML prototype is loaded if not already present in the prototype. If 'ui' is present
+// inside _htmlProto, the prototype is cloned. Then, a new structure is created based on 'ui' with each selector replaced
+// by a jQuery object containing the results of performing .find() on the prototype's clone with the filter set to the
+// value of the string. In the special case where the selector starts with a '#', the ID is removed from the element after
+// it is assigned into the structure being created. This structure is then made accessible from the widget instance via
+// the '_ui' key (i.e., this._ui).
+//
+// 2. Use the loadPrototype method when your widget does not derive from $.tizen.widgetex:
+// Add _htmlProto to your widget's prototype as described above. Then, in your widget's _create() method, call
+// loadPrototype in the following manner:
+//
+// $.tizen.widgetex.loadPrototype.call(this, "namespace.widgetName" );
+//
+// Thereafter, you may use the HTML prototype from your widget's prototype or, if you have specified a 'ui' key in your
+// _htmlProto key, you may use this._ui from your widget instance.
+//
+// II. realize method
+//
+// When a widget is created, some of its properties cannot be set immediately, because they depend on the widths/heights
+// of its constituent elements. They can only be calculated when the page containing the widget is made visible via the
+// "pageshow" event, because widths/heights always evaluate to 0 when retrieved from a widget that is not visible. When
+// you inherit from widgetex, you can add a "_realize" function to your prototype. This function will be called once right
+// after _create() if the element that anchors your widget is on a visible page. Otherwise, it will be called when the
+// page to which the widget belongs emits the "pageshow" event.
+//
+// NB: If your widget is inside a container which is itself not visible, such as an expandable or a collapsible, your
+// widget will remain hidden even though "pageshow" is fired and therefore _realize is called. In this case, widths and
+// heights will be unreliable even during _realize.
+//
+// III. systematic option handling
+//
+// If a widget has lots of options, the _setOption function can become a long switch for setting each recognized option.
+// It is also tempting to allow options to determine the way a widget is created, by basing decisions on various options
+// during _create(). Often, the actions based on option values in _create() are the same as those in _setOption. To avoid
+// such code duplication, this class calls _setOption once for each option after _create() has completed.
+//
+// Furthermore, to avoid writing long switches in a widget's _setOption method, this class implements _setOption in such
+// a way that, for any given option (e.g. "myOption" ), _setOption looks for a method _setMyOption in the widget's
+// implementation, and if found, calls the method with the value of the option.
+//
+// If your widget does not inherit from widgetex, you can still use widgetex' systematic option handling:
+// 1. define the _setOption method for your widget as follows:
+//      _setOption: $.tizen.widgetex.prototype._setOption
+// 2. Call this._setOptions(this.options) from your widget's _create() function.
+// 3. As with widgetex-derived widgets, implement a corresponding _setMyOptionName function for each option myOptionName
+// you wish to handle.
+//
+// IV. systematic value handling for input elements
+//
+// If your widget happens to be constructed from an <input> element, you have to handle the "value" attribute specially,
+// and you have to emit the "change" signal whenever it changes, in addition to your widget's normal signals and option
+// changes. With widgetex, you can assign one of your widget's "data-*" properties to be synchronized to the "value"
+// property whenever your widget is constructed onto an <input> element. To do this, define, in your prototype:
+//
+// _value: {
+//      attr: "data-my-attribute",
+//      signal: "signal-to-emit"
+// }
+//
+// Then, call this._setValue(newValue) whenever you wish to set the value for your widget. This will set the data-*
+// attribute, emit the custom signal (if set) with the new value as its parameter, and, if the widget is based on an
+// <input> element, it will also set the "value" attribute and emit the "change" signal.
+//
+// "attr" is required if you choose to define "_value", and identifies the data-attribute to set in addition to "value",
+// if your widget's element is an input.
+// "signal" is optional, and will be emitted when setting the data-attribute via this._setValue(newValue).
+//
+// If your widget does not derive from widgetex, you can still define "_value" as described above and call
+// $.tizen.widgetex.setValue(widget, newValue).
+//
+// V. Systematic enabled/disabled handling for input elements
+//
+// widgetex implements _setDisabled which will disable the input associated with this widget, if any. Thus, if you derive
+// from widgetex and you plan on implementing the disabled state, you should chain up to
+// $.tizen.widgetex.prototype._setDisabled(value), rather than $.Widget.prototype._setOption( "disabled", value).
+
+(function ($, undefined) {
+
+// Framework-specific HTML prototype path for AJAX loads
+	function getProtoPath() {
+		var theScriptTag = $( "script[data-framework-version][data-framework-root][data-framework-theme]" );
+
+		return (theScriptTag.attr( "data-framework-root" ) + "/" +
+				theScriptTag.attr( "data-framework-version" ) + "/themes/" +
+				theScriptTag.attr( "data-framework-theme" ) + "/proto-html" );
+	}
+
+	$.widget( "tizen.widgetex", $.mobile.widget, {
+		_createWidget: function () {
+			$.tizen.widgetex.loadPrototype.call( this, this.namespace + "." + this.widgetName );
+			$.mobile.widget.prototype._createWidget.apply( this, arguments );
+		},
+
+		_init: function () {
+			// TODO THIS IS TEMPORARY PATCH TO AVOID CTXPOPUP PAGE CRASH
+			if ( this.element === undefined ) {
+				return;
+			}
+
+			var page = this.element.closest( ".ui-page" ),
+				self = this,
+				myOptions = {};
+
+			if ( page.is( ":visible" ) ) {
+				this._realize();
+			} else {
+				page.bind( "pageshow", function () { self._realize(); } );
+			}
+
+			$.extend( myOptions, this.options );
+
+			this.options = {};
+
+			this._setOptions( myOptions );
+		},
+
+		_getCreateOptions: function () {
+			// if we're dealing with an <input> element, value takes precedence over corresponding data-* attribute, if a
+			// mapping has been established via this._value. So, assign the value to the data-* attribute, so that it may
+			// then be assigned to this.options in the superclass' _getCreateOptions
+
+			if (this.element.is( "input" ) && this._value !== undefined) {
+				var theValue =
+					( ( this.element.attr( "type" ) === "checkbox" || this.element.attr( "type" ) === "radio" )
+							? this.element.is( ":checked" )
+									: this.element.is( "[value]" )
+									? this.element.attr( "value" )
+											: undefined);
+
+				if ( theValue != undefined ) {
+					this.element.attr( this._value.attr, theValue );
+				}
+			}
+
+			return $.mobile.widget.prototype._getCreateOptions.apply( this, arguments );
+		},
+
+		_setOption: function ( key, value ) {
+			var setter = "_set" + key.replace(/^[a-z]/, function (c) { return c.toUpperCase(); } );
+
+			if ( this[setter] !== undefined ) {
+				this[setter]( value );
+			} else {
+				$.mobile.widget.prototype._setOption.apply( this, arguments );
+			}
+		},
+
+		_setDisabled: function ( value ) {
+			$.Widget.prototype._setOption.call( this, "disabled", value );
+			if ( this.element.is( "input" ) ) {
+				this.element.attr( "disabled", value );
+			}
+		},
+
+		_setValue: function ( newValue ) {
+			$.tizen.widgetex.setValue( this, newValue );
+		},
+
+		_realize: function () {}
+	} );
+
+	$.tizen.widgetex.setValue = function ( widget, newValue ) {
+		if ( widget._value !== undefined ) {
+			var valueString = ( widget._value.makeString ? widget._value.makeString(newValue) : newValue ),
+				inputType;
+
+			widget.element.attr( widget._value.attr, valueString );
+			if ( widget._value.signal !== undefined ) {
+				widget.element.triggerHandler( widget._value.signal, newValue );
+			}
+
+			if ( widget.element.is( "input" ) ) {
+				inputType = widget.element.attr( "type" );
+
+				// Special handling for checkboxes and radio buttons, where the presence of the "checked" attribute is really
+				// the value
+				if ( inputType === "checkbox" || inputType === "radio" ) {
+					if ( newValue ) {
+						widget.element.attr( "checked", true );
+					} else {
+						widget.element.removeAttr( "checked" );
+					}
+				} else {
+					widget.element.attr( "value", valueString );
+				}
+
+				widget.element.trigger( "change" );
+			}
+		}
+	};
+
+	$.tizen.widgetex.assignElements = function (proto, obj) {
+		var ret = {},
+			key;
+
+		for ( key in obj ) {
+			if ( ( typeof obj[key] ) === "string" ) {
+				ret[key] = proto.find( obj[key] );
+				if ( obj[key].match(/^#/) ) {
+					ret[key].removeAttr( "id" );
+				}
+			} else {
+				if ( (typeof obj[key]) === "object" ) {
+					ret[key] = $.tizen.widgetex.assignElements( proto, obj[key] );
+				}
+			}
+		}
+
+		return ret;
+	};
+
+	$.tizen.widgetex.loadPrototype = function ( widget, ui ) {
+		var ar = widget.split( "." ),
+			namespace,
+			widgetName,
+			htmlProto,
+			protoPath;
+
+		if ( ar.length == 2 ) {
+			namespace = ar[0];
+			widgetName = ar[1];
+			htmlProto = $( "<div></div>" )
+						.text( "Failed to load proto for widget " + namespace + "." + widgetName + "!" )
+						.css( {background: "red", color: "blue", border: "1px solid black"} )
+						.jqmData( "tizen.widgetex.ajax.fail", true );
+
+			// If htmlProto is defined
+			if ( $[namespace][widgetName].prototype._htmlProto !== undefined ) {
+				// If no source is defined, use the widget name
+				if ( $[namespace][widgetName].prototype._htmlProto.source === undefined ) {
+					$[namespace][widgetName].prototype._htmlProto.source = widgetName;
+				}
+
+				// Load the HTML prototype via AJAX if not defined inline
+				if ( typeof $[namespace][widgetName].prototype._htmlProto.source === "string" ) {
+					// Establish the path for the proto file
+					widget = $[namespace][widgetName].prototype._htmlProto.source;
+					protoPath = getProtoPath();
+
+					// Make the AJAX call
+					$.ajax( {
+						url: protoPath + "/" + widget + ".prototype.html",
+						async: false,
+						dataType: "html"
+					}).success( function (data, textStatus, jqXHR ) {
+						htmlProto = $( "<div></div>" ).html(data).jqmData( "tizen.widgetex.ajax.fail", false );
+					} );
+
+					// Assign the HTML proto to the widget prototype
+					$[namespace][widgetName].prototype._htmlProto.source = htmlProto;
+				} else { // Otherwise, use the inline definition
+					// AJAX loading has trivially succeeded, since there was no AJAX loading at all
+					$[namespace][widgetName].prototype._htmlProto.source.jqmData( "tizen.widgetex.ajax.fail", false );
+					htmlProto = $[namespace][widgetName].prototype._htmlProto.source;
+				}
+
+				// If there's a "ui" portion in the HTML proto, copy it over to this instance, and
+				// replace the selectors with the selected elements from a copy of the HTML prototype
+				if ( $[namespace][widgetName].prototype._htmlProto.ui !== undefined ) {
+					// Assign the relevant parts of the proto
+					$.extend( this, {
+						_ui: $.tizen.widgetex.assignElements( htmlProto.clone(), $[namespace][widgetName].prototype._htmlProto.ui )
+					});
+				}
+			}
+		}
+	};
+
+}( jQuery ) );
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.colorwidget", $.tizen.widgetex, {
+		options: {
+			color: "#ff0972"
+		},
+
+		_value: {
+			attr: "data-" + ( $.mobile.ns || "" ) + "color",
+			signal: "colorchanged"
+		},
+
+		_getElementColor: function ( el, cssProp ) {
+			return el.jqmData( "clr" );
+		},
+
+		_setElementColor: function ( el, hsl, cssProp ) {
+			var clrlib = $.tizen.colorwidget.clrlib,
+				clr = clrlib.RGBToHTML( clrlib.HSLToRGB( hsl ) ),
+				dclr = clrlib.RGBToHTML( clrlib.HSLToGray( hsl ) );
+
+			el.jqmData( "clr", clr );
+			el.jqmData( "dclr", dclr );
+			el.jqmData( "cssProp", cssProp );
+			el.attr( "data-" + ( $.mobile.ns || "" ) + "has-dclr", true );
+			el.css( cssProp, this.options.disabled ? dclr : clr );
+
+			return { clr: clr, dclr: dclr };
+		},
+
+		_displayDisabledState: function ( toplevel ) {
+			var self = this,
+				sel = ":jqmData(has-dclr='true')",
+				dst = toplevel.is( sel ) ? toplevel : $([]),
+				el;
+
+			dst.add( toplevel.find( sel ) )
+				.each( function () {
+					el = $( this );
+					el.css( el.jqmData( "cssProp" ), el.jqmData( self.options.disabled ? "dclr" : "clr" ) );
+				} );
+		},
+
+		_setColor: function ( value ) {
+			var currentValue = ( this.options.color );
+
+			value = value.match(/#[0-9A-Fa-f]{6}/)
+				? value
+					: currentValue.match(/#[0-9A-Fa-f]{6}/)
+					? currentValue
+							: $.tizen.colorwidget.prototype.options.color;
+
+			if ( this.options.color !== value ) {
+				this.options.color = value;
+				this._setValue( value );
+				return true;
+			}
+			return false;
+		}
+	} );
+
+	$.tizen.colorwidget.clrlib = {
+		nearestInt: function ( val ) {
+			var theFloor = Math.floor( val );
+
+			return ( ( ( val - theFloor ) > 0.5 ) ? ( theFloor + 1 ) : theFloor );
+		},
+
+		// Converts html color string to rgb array.
+		//
+		// Input: string clr_str, where
+		// clr_str is of the form "#aabbcc"
+		//
+		// Returns: [ r, g, b ], where
+		// r is in [0, 1]
+		// g is in [0, 1]
+		// b is in [0, 1]
+		HTMLToRGB: function ( clr_str ) {
+			clr_str = ( ( '#' == clr_str.charAt( 0 ) ) ? clr_str.substring( 1 ) : clr_str );
+
+			return [ parseInt(clr_str.substring(0, 2), 16) / 255.0,
+					parseInt(clr_str.substring(2, 4), 16) / 255.0,
+					parseInt(clr_str.substring(4, 6), 16) / 255.0 ];
+		},
+
+		// Converts rgb array to html color string.
+		//
+		// Input: [ r, g, b ], where
+		// r is in [0, 1]
+		// g is in [0, 1]
+		// b is in [0, 1]
+		//
+		// Returns: string of the form "#aabbcc"
+		RGBToHTML: function ( rgb ) {
+			var ret = "#", val, theFloor,
+				Nix;
+			for ( Nix in rgb ) {
+				val = rgb[Nix] * 255;
+				theFloor = Math.floor( val );
+				val = ( ( val - theFloor > 0.5 ) ? ( theFloor + 1 ) : theFloor );
+				ret = ret + ( ( ( val < 16 ) ? "0" : "" ) + ( val & 0xff ).toString( 16 ) );
+			}
+
+			return ret;
+		},
+
+		// Converts hsl to rgb.
+		//
+		// From http://130.113.54.154/~monger/hsl-rgb.html
+		//
+		// Input: [ h, s, l ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// l is in [0,   1]
+		//
+		// Returns: [ r, g, b ], where
+		// r is in [0, 1]
+		// g is in [0, 1]
+		// b is in [0, 1]
+		HSLToRGB: function ( hsl ) {
+			var h = hsl[0] / 360.0, s = hsl[1], l = hsl[2],
+				temp1,
+				temp2,
+				temp3,
+				ret;
+
+			if ( 0 === s ) {
+				return [ l, l, l ];
+			}
+
+			temp2 = ( ( l < 0.5 )
+					? l * ( 1.0 + s )
+					: l + s - l * s);
+
+			temp1 = 2.0 * l - temp2;
+			temp3 = {
+				r: h + 1.0 / 3.0,
+				g: h,
+				b: h - 1.0 / 3.0
+			};
+
+			temp3.r = ( ( temp3.r < 0 ) ? ( temp3.r + 1.0 ) : ( ( temp3.r > 1 ) ? ( temp3.r - 1.0 ) : temp3.r ) );
+			temp3.g = ( ( temp3.g < 0 ) ? ( temp3.g + 1.0 ) : ( ( temp3.g > 1 ) ? ( temp3.g - 1.0 ) : temp3.g ) );
+			temp3.b = ( ( temp3.b < 0 ) ? ( temp3.b + 1.0 ) : ( ( temp3.b > 1 ) ? ( temp3.b - 1.0 ) : temp3.b ) );
+
+			ret = [( ( ( 6.0 * temp3.r ) < 1 ) ? ( temp1 + ( temp2 - temp1 ) * 6.0 * temp3.r ) :
+					( ( ( 2.0 * temp3.r ) < 1 ) ? temp2 :
+							( ( ( 3.0 * temp3.r ) < 2 ) ? ( temp1 + ( temp2 - temp1 ) * ( ( 2.0 / 3.0 ) - temp3.r ) * 6.0 ) :
+									temp1) ) ),
+						( ( ( 6.0 * temp3.g ) < 1) ? ( temp1 + ( temp2 - temp1 ) * 6.0 * temp3.g ) :
+							( ( ( 2.0 * temp3.g ) < 1 ) ? temp2 :
+								( ( ( 3.0 * temp3.g ) < 2 ) ? ( temp1 + ( temp2 - temp1 ) * ( ( 2.0 / 3.0 ) - temp3.g ) * 6.0 ) :
+										temp1 ) ) ),
+									( ( ( 6.0 * temp3.b ) < 1 ) ? ( temp1 + ( temp2 - temp1 ) * 6.0 * temp3.b ) :
+										( ( ( 2.0 * temp3.b ) < 1 ) ? temp2 :
+											( ( ( 3.0 * temp3.b ) < 2 ) ? ( temp1 + ( temp2 - temp1 ) * ( ( 2.0 / 3.0 ) - temp3.b ) * 6.0 ) :
+												temp1 ) ) )];
+
+			return ret;
+		},
+
+		// Converts hsv to rgb.
+		//
+		// Input: [ h, s, v ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// v is in [0,   1]
+		//
+		// Returns: [ r, g, b ], where
+		// r is in [0, 1]
+		// g is in [0, 1]
+		// b is in [0, 1]
+		HSVToRGB: function ( hsv ) {
+			return $.tizen.colorwidget.clrlib.HSLToRGB( $.tizen.colorwidget.clrlib.HSVToHSL( hsv ) );
+		},
+
+		// Converts rgb to hsv.
+		//
+		// from http://coecsl.ece.illinois.edu/ge423/spring05/group8/FinalProject/HSV_writeup.pdf
+		//
+		// Input: [ r, g, b ], where
+		// r is in [0,   1]
+		// g is in [0,   1]
+		// b is in [0,   1]
+		//
+		// Returns: [ h, s, v ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// v is in [0,   1]
+		RGBToHSV: function ( rgb ) {
+			var min, max, delta, h, s, v, r = rgb[0], g = rgb[1], b = rgb[2];
+
+			min = Math.min( r, Math.min( g, b ) );
+			max = Math.max( r, Math.max( g, b ) );
+			delta = max - min;
+
+			h = 0;
+			s = 0;
+			v = max;
+
+			if ( delta > 0.00001 ) {
+				s = delta / max;
+
+				if ( r === max ) {
+					h = ( g - b ) / delta;
+				} else {
+					if ( g === max ) {
+						h = 2 + ( b - r ) / delta;
+					} else {
+						h = 4 + ( r - g ) / delta;
+					}
+				}
+				h *= 60;
+
+				if ( h < 0 ) {
+					h += 360;
+				}
+			}
+
+			return [h, s, v];
+		},
+
+		// Converts hsv to hsl.
+		//
+		// Input: [ h, s, v ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// v is in [0,   1]
+		//
+		// Returns: [ h, s, l ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// l is in [0,   1]
+		HSVToHSL: function ( hsv ) {
+			var max = hsv[2],
+				delta = hsv[1] * max,
+				min = max - delta,
+				sum = max + min,
+				half_sum = sum / 2,
+				s_divisor = ( ( half_sum < 0.5 ) ? sum : ( 2 - max - min ) );
+
+			return [ hsv[0], ( ( 0 == s_divisor ) ? 0 : ( delta / s_divisor ) ), half_sum ];
+		},
+
+		// Converts rgb to hsl
+		//
+		// Input: [ r, g, b ], where
+		// r is in [0,   1]
+		// g is in [0,   1]
+		// b is in [0,   1]
+		//
+		// Returns: [ h, s, l ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// l is in [0,   1]
+		RGBToHSL: function ( rgb ) {
+			return $.tizen.colorwidget.clrlib.HSVToHSL( $.tizen.colorwidget.clrlib.RGBToHSV( rgb ) );
+		},
+
+		// Converts hsl to grayscale
+		// Full-saturation magic grayscale values were taken from the Gimp
+		//
+		// Input: [ h, s, l ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// l is in [0,   1]
+		//
+		// Returns: [ r, g, b ], where
+		// r is in [0,   1]
+		// g is in [0,   1]
+		// b is in [0,   1]
+		HSLToGray: function ( hsl ) {
+			var intrinsic_vals = [0.211764706, 0.929411765, 0.71372549, 0.788235294, 0.070588235, 0.28627451, 0.211764706],
+				idx = Math.floor(hsl[0] / 60),
+				lowerHalfPercent,
+				upperHalfPercent,
+				begVal,
+				endVal,
+				val;
+
+			// Find hue interval
+			begVal = intrinsic_vals[idx];
+			endVal = intrinsic_vals[idx + 1];
+
+			// Adjust for lum
+			if ( hsl[2] < 0.5 ) {
+				lowerHalfPercent = hsl[2] * 2;
+				begVal *= lowerHalfPercent;
+				endVal *= lowerHalfPercent;
+			} else {
+				upperHalfPercent = ( hsl[2] - 0.5 ) * 2;
+				begVal += ( 1.0 - begVal ) * upperHalfPercent;
+				endVal += ( 1.0 - endVal ) * upperHalfPercent;
+			}
+
+			// This is the gray value at full sat, whereas hsl[2] is the gray value at 0 sat.
+			val = begVal + ( ( endVal - begVal ) * ( hsl[0] - ( idx * 60 ) ) ) / 60;
+
+			// Get value at hsl[1]
+			val = val + ( hsl[2] - val ) * ( 1.0 - hsl[1] );
+
+			return [val, val, val];
+		}
+	};
+
+}( jQuery ));
+(function ( $, undefined ) {
+
+	$.widget( "tizen.huegradient", $.tizen.widgetex, {
+		_create: function () {
+			this.element.addClass( "tizen-huegradient" );
+		},
+
+		// Crutches for IE: it is incapable of multi-stop gradients, so add multiple divs inside the given div, each with a
+		// two-point gradient
+		_IEGradient: function ( div, disabled ) {
+			var rainbow = disabled
+				? ["#363636", "#ededed", "#b6b6b6", "#c9c9c9", "#121212", "#494949", "#363636"]
+				: ["#ff0000", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff", "#ff0000"],
+				Nix;
+
+			for (Nix = 0 ; Nix < 6 ; Nix++ ) {
+				$( "<div></div>" )
+					.css( {
+						position: "absolute",
+						width: ( 100 / 6 ) + "%",
+						height: "100%",
+						left: ( Nix * 100 / 6 ) + "%",
+						top: "0px",
+						filter: "progid:DXImageTransform.Microsoft.gradient (startColorstr='" + rainbow[Nix] + "', endColorstr='" + rainbow[Nix + 1] + "', GradientType = 1)"
+					} )
+					.appendTo( div );
+			}
+		},
+
+		_setDisabled: function ( value ) {
+			$.Widget.prototype._setOption.call( this, "disabled", value );
+			if ( $.mobile.browser.ie ) {
+				this._IEGradient( this.element.empty(), value );
+			}
+		}
+	} );
+}( jQuery ) );
+( function ( $, undefined ) {
+
+	$.widget( "todons.colorwidget", $.mobile.widget, {
+		options: {
+			color: "#ff0972"
+		},
+
+		_create: function () {
+			$.extend ( this, {
+				isInput: this.element.is( "input" )
+			} );
+
+			/* "value", if present, takes precedence over "data-color" */
+			if ( this.isInput ) {
+				if ( this.element.attr( "value" ).match(/#[0-9A-Fa-f]{6}/) ) {
+					this.element.attr( "data-color", this.element.attr( "value" ) );
+				}
+			}
+
+			$.mobile.todons.parseOptions( this, true );
+		},
+
+		_setOption: function ( key, value, unconditional ) {
+			if ( undefined === unconditional ) {
+				unconditional = false;
+			}
+
+			if ( key === "color" ) {
+				this._setColor(value, unconditional);
+			}
+		},
+
+		_setColor: function ( value, unconditional ) {
+			if ( value.match(/#[0-9A-Fa-f]{6}/) && ( value != this.options.color || unconditional ) ) {
+				this.options.color = value;
+				this.element.attr( "data-color", value );
+
+				if ( this.isInput ) {
+					this.element.attr( "value", value );
+				}
+
+				this.element.triggerHandler( "colorchanged", value );
+				return true;
+			}
+			return false;
+		}
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION - listview autodividers
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Applies dividers automatically to a listview, using link text
+// (for link lists) or text (for readonly lists) as the basis for the
+// divider text.
+//
+// Apply using autodividers({type: 'X'}) on a <ul> with
+// data-role="listview", or with data-autodividers="true", where X
+// is the type of divider to create. The default divider type is 'alpha',
+// meaning first characters of list item text, upper-cased.
+//
+// The element used to derive the text for the auto dividers defaults
+// to the first link inside the li; failing that, the text directly inside
+// the li element is used. This can be overridden with the
+// data-autodividers-selector attribute or via options; the selector
+// will use each li element as its context.
+//
+// Any time a new li element is added to the list, or an li element is
+// removed, this extension will update the dividers in the listview
+// accordingly.
+//
+// Note that if a listview already has dividers, applying this
+// extension will remove all the existing dividers and replace them
+// with new, generated ones.
+//
+// Also note that this extension doesn't sort the list: it only creates
+// dividers based on text inside list items. So if your list isn't
+// alphabetically-sorted, you may get duplicate dividers.
+//
+// So, for example, this markup:
+//
+// <ul id="has-no-dividers" data-role="listview" data-autodividers="alpha">
+//		<li>Barry</li>
+//		<li>Carrie</li>
+//		<li>Betty</li>
+//		<li>Harry</li>
+//		<li>Carly</li>
+//		<li>Hetty</li>
+// </ul>
+//
+// will produce dividers like this:
+//
+// <ul data-role="listview" data-autodividers="alpha">
+//	<li data-role="list-divider">B</li>
+//	<li>Barry</li>
+//	<li data-role="list-divider">C</li>
+//	<li>Carrie</li>
+//	<li data-role="list-divider">B</li>
+//	<li>Betty</li>
+//	<li data-role="list-divider">H</li>
+//	<li>Harry</li>
+//	<li data-role="list-divider">C</li>
+//	<li>Carly</li>
+//	<li data-role="list-divider">H</li>
+//	<li>Hetty</li>
+// </ul>
+//
+// with each divider occuring twice.
+//
+// Options:
+//
+//	selector: The jQuery selector to use to find text for the
+//			generated dividers. Default is to use the first 'a'
+//			(link) element. If this selector doesn't find any
+//			text, the widget automatically falls back to the text
+//			inside the li (for read-only lists). Can be set to a custom
+//			selector via data-autodividers-selector="..." or the 'selector'
+//			option.
+//
+//	 type: 'alpha' (default) sets the auto divider type to "uppercased
+//		 first character of text selected from each item"; "full" sets
+//		 it to the unmodified text selected from each item. Set via
+//		 the data-autodividers="<type>" attribute on the listview or
+//		 the 'type' option.
+//
+// Events:
+//
+//	updatelayout: Triggered if the dividers in the list change;
+//		this happens if list items are added to the listview,
+//		which causes the autodividers to be regenerated.
+
+(function ( $, undefined ) {
+
+	var autodividers = function ( options ) {
+		var list = $( this ),
+			listview = list.data( 'listview' ),
+			dividerType,
+			textSelector,
+			getDividerText,
+			mergeDividers,
+			isNonDividerLi,
+			liAdded,
+			liRemoved;
+
+		options = options || {};
+		dividerType = options.type || list.jqmData( 'autodividers' ) || 'alpha';
+		textSelector = options.selector || list.jqmData( 'autodividers-selector' ) || 'a';
+
+		getDividerText = function ( elt ) {
+			// look for some text in the item
+			var text = elt.find( textSelector ).text() || elt.text() || null;
+
+			if ( !text ) {
+				return null;
+			}
+
+			// create the text for the divider
+			if ( dividerType === 'alpha' ) {
+				text = text.slice( 0, 1 ).toUpperCase();
+			}
+
+			return text;
+		};
+
+		mergeDividers = function () {
+			var dividersChanged = false,
+				divider,
+				dividerText,
+				selector,
+				nextDividers;
+
+			// any dividers which are following siblings of a divider, where
+			// there are no dividers with different text inbetween, can be removed
+			list.find( 'li.ui-li-divider' ).each(function () {
+				divider = $( this );
+				dividerText = divider.text();
+				selector = '.ui-li-divider:not(:contains(' + dividerText + '))';
+				nextDividers = divider.nextUntil( selector );
+				nextDividers = nextDividers.filter( '.ui-li-divider:contains(' + dividerText + ')' );
+
+				if ( nextDividers.length > 0 ) {
+					nextDividers.remove();
+					dividersChanged = true;
+				}
+			} );
+
+			if ( dividersChanged ) {
+				list.trigger( 'updatelayout' );
+			}
+		};
+
+		// check that elt is a non-divider li element
+		isNonDividerLi = function ( elt ) {
+			return elt.is('li') &&
+					elt.jqmData( 'role' ) !== 'list-divider';
+		};
+
+		// li element inserted, so check whether it needs a divider
+		liAdded = function ( li ) {
+			var dividerText = getDividerText( li ),
+				existingDividers,
+				divider;
+
+			if ( !dividerText ) {
+				listview.refresh();
+				return;
+			}
+
+			// add expected divider for this li if it doesn't exist
+			existingDividers = li.prevAll( '.ui-li-divider:first:contains(' + dividerText + ')' );
+
+			if ( existingDividers.length === 0 ) {
+				divider = $( '<li>' + dividerText + '</li>' );
+				divider.attr( 'data-' + $.mobile.ns + 'role', 'list-divider' );
+				li.before( divider );
+
+				listview.refresh();
+
+				mergeDividers();
+			} else {
+				listview.refresh();
+			}
+		};
+
+		// li element removed, so check whether its divider should go
+		liRemoved = function ( li ) {
+			var dividerText = getDividerText( li ),
+				precedingItems,
+				nextItems;
+
+			if ( !dividerText ) {
+				listview.refresh();
+				return;
+			}
+
+			// remove divider for this li if there are no other
+			// li items for the divider before or after this li item
+			precedingItems = li.prevUntil( '.ui-li-divider:contains(' + dividerText + ')' );
+			nextItems = li.nextUntil( '.ui-li-divider' );
+
+			if ( precedingItems.length === 0 && nextItems.length === 0 ) {
+				li.prevAll( '.ui-li-divider:contains(' + dividerText + '):first' ).remove();
+
+				listview.refresh();
+
+				mergeDividers();
+			} else {
+				listview.refresh();
+			}
+		};
+
+		// set up the dividers on first create
+		list.find( 'li' ).each( function () {
+			var li = $( this );
+
+			// remove existing dividers
+			if ( li.jqmData( 'role' ) === 'list-divider' ) {
+				li.remove();
+			} else {			// make new dividers for list items
+				liAdded( li );
+			}
+		} );
+
+		// bind to DOM events to keep list up to date
+		list.bind( 'DOMNodeInserted', function ( e ) {
+			var elt = $( e.target );
+
+			if ( !isNonDividerLi( elt ) ) {
+				return;
+			}
+
+			liAdded( elt );
+		} );
+
+		list.bind( 'DOMNodeRemoved', function ( e ) {
+			var elt = $( e.target );
+
+			if ( !isNonDividerLi( elt ) ) {
+				return;
+			}
+
+			liRemoved( elt );
+		} );
+	};
+
+	$.fn.autodividers = autodividers;
+
+	$( ":jqmData(role=listview)" ).live( "listviewcreate", function () {
+		var list = $( this );
+
+		if ( list.is( ':jqmData(autodividers)' ) ) {
+			list.autodividers();
+		}
+	} );
+}( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// most of following codes are derived from jquery.mobile.scrollview.js
+(function ( $, window, document, undefined ) {
+
+	function circularNum( num, total ) {
+		var n = num % total;
+		if ( n < 0 ) {
+			n = total + n;
+		}
+		return n;
+	}
+
+	function setElementTransform( $ele, x, y ) {
+		var v = "translate3d( " + x + "," + y + ", 0px)";
+		$ele.css({
+			"-moz-transform": v,
+			"-webkit-transform": v,
+			"transform": v
+		} );
+	}
+
+	function MomentumTracker( options ) {
+		this.options = $.extend( {}, options );
+		this.easing = "easeOutQuad";
+		this.reset();
+	}
+
+	var tstates = {
+		scrolling : 0,
+		done : 1
+	};
+
+	function getCurrentTime() {
+		return ( new Date()).getTime();
+	}
+
+	$.extend( MomentumTracker.prototype, {
+		start: function ( pos, speed, duration ) {
+			this.state = ( speed != 0 ) ? tstates.scrolling : tstates.done;
+			this.pos = pos;
+			this.speed = speed;
+			this.duration = duration;
+
+			this.fromPos = 0;
+			this.toPos = 0;
+
+			this.startTime = getCurrentTime();
+		},
+
+		reset: function () {
+			this.state = tstates.done;
+			this.pos = 0;
+			this.speed = 0;
+			this.duration = 0;
+		},
+
+		update: function () {
+			var state = this.state,
+				duration,
+				elapsed,
+				dx,
+				x;
+
+			if ( state == tstates.done ) {
+				return this.pos;
+			}
+
+			duration = this.duration;
+			elapsed = getCurrentTime() - this.startTime;
+			elapsed = elapsed > duration ? duration : elapsed;
+
+			dx = this.speed * ( 1 - $.easing[this.easing](elapsed / duration, elapsed, 0, 1, duration ) );
+
+			x = this.pos + dx;
+			this.pos = x;
+
+			if ( elapsed >= duration ) {
+				this.state = tstates.done;
+			}
+
+			return this.pos;
+		},
+
+		done: function () {
+			return this.state == tstates.done;
+		},
+
+		getPosition: function () {
+			return this.pos;
+		}
+	} );
+
+	jQuery.widget( "mobile.circularview", jQuery.mobile.widget, {
+		options: {
+			fps:				60,
+
+			scrollDuration:		2000,
+
+			moveThreshold:		10,
+			moveIntervalThreshold:	150,
+
+			startEventName:		"scrollstart",
+			updateEventName:	"scrollupdate",
+			stopEventName:		"scrollstop",
+
+			eventType:			$.support.touch	? "touch" : "mouse",
+
+			delayedClickSelector: "a, .ui-btn",
+			delayedClickEnabled: false
+		},
+
+		_makePositioned: function ( $ele ) {
+			if ( $ele.css( 'position' ) == 'static' ) {
+				$ele.css( 'position', 'relative' );
+			}
+		},
+
+		_create: function () {
+			this._$clip = $( this.element).addClass( "ui-scrollview-clip" );
+			var $child = this._$clip.children(),
+				self;
+			//if ( $child.length > 1 ) {
+			$child = this._$clip.wrapInner( "<div></div>" ).children();
+			//}
+			this._$view = $child.addClass( "ui-scrollview-view" );
+			this._$list = $child.children();
+
+			this._$clip.css( "overflow", "hidden" );
+			this._makePositioned( this._$clip );
+
+			this._$view.css( "overflow", "hidden" );
+			this._tracker = new MomentumTracker( this.options );
+
+			this._timerInterval = 1000 / this.options.fps;
+			this._timerID = 0;
+
+			self = this;
+			this._timerCB = function () { self._handleMomentumScroll(); };
+
+			this.refresh();
+
+			this._addBehaviors();
+		},
+
+		refresh: function () {
+			var itemsPerView;
+
+			this._viewWidth = this._$view.width();
+			this._clipWidth = $( window ).width();
+			this._itemWidth = this._$list.children().first().outerWidth();
+			this._$items = this._$list.children().detach();
+			itemsPerView = this._clipWidth / this._itemWidth;
+			itemsPerView = Math.ceil( itemsPerView * 10 ) / 10;
+			this._itemsPerView = parseInt( itemsPerView, 10 );
+
+			this._rx = -this._itemWidth;
+			this._sx = -this._itemWidth;
+			this._setItems();
+		},
+
+		_startMScroll: function ( speedX, speedY ) {
+			this._stopMScroll();
+
+			var keepGoing = false,
+				duration = this.options.scrollDuration,
+				t = this._tracker,
+				c = this._clipWidth,
+				v = this._viewWidth;
+
+			this._$clip.trigger( this.options.startEventName);
+
+			t.start( this._rx, speedX, duration, (v > c ) ? -(v - c) : 0, 0 );
+			keepGoing = !t.done();
+
+			if ( keepGoing ) {
+				this._timerID = setTimeout( this._timerCB, this._timerInterval );
+			} else {
+				this._stopMScroll();
+			}
+			//console.log( "startmscroll" + this._rx + "," + this._sx );
+		},
+
+		_stopMScroll: function () {
+			if ( this._timerID ) {
+				this._$clip.trigger( this.options.stopEventName );
+				clearTimeout( this._timerID );
+			}
+
+			this._timerID = 0;
+
+			if ( this._tracker ) {
+				this._tracker.reset();
+			}
+			//console.log( "stopmscroll" + this._rx + "," + this._sx );
+		},
+
+		_handleMomentumScroll: function () {
+			var keepGoing = false,
+				v = this._$view,
+				x = 0,
+				y = 0,
+				t = this._tracker;
+
+			if ( t ) {
+				t.update();
+				x = t.getPosition();
+
+				keepGoing = !t.done();
+
+			}
+
+			this._setScrollPosition( x, y );
+			this._rx = x;
+
+			this._$clip.trigger( this.options.updateEventName, [ { x: x, y: y } ] );
+
+			if ( keepGoing ) {
+				this._timerID = setTimeout( this._timerCB, this._timerInterval );
+			} else {
+				this._stopMScroll();
+			}
+		},
+
+		_setItems: function () {
+			var i,
+				$item;
+
+			for ( i = -1; i < this._itemsPerView + 1; i++ ) {
+				$item = this._$items[ circularNum( i, this._$items.length ) ];
+				this._$list.append( $item );
+			}
+			setElementTransform( this._$view, this._sx + "px", 0 );
+			this._$view.width( this._itemWidth * ( this._itemsPerView + 2 ) );
+			this._viewWidth = this._$view.width();
+		},
+
+		_setScrollPosition: function ( x, y ) {
+			var sx = this._sx,
+				dx = x - sx,
+				di = parseInt( dx / this._itemWidth, 10 ),
+				i,
+				idx,
+				$item;
+
+			if ( di > 0 ) {
+				for ( i = 0; i < di; i++ ) {
+					this._$list.children().last().detach();
+					idx = -parseInt( ( sx / this._itemWidth ) + i + 3, 10 );
+					$item = this._$items[ circularNum( idx, this._$items.length ) ];
+					this._$list.prepend( $item );
+					//console.log( "di > 0 : " + idx );
+				}
+			} else if ( di < 0 ) {
+				for ( i = 0; i > di; i-- ) {
+					this._$list.children().first().detach();
+					idx = this._itemsPerView - parseInt( ( sx / this._itemWidth ) + i, 10 );
+					$item = this._$items[ circularNum( idx, this._$items.length ) ];
+					this._$list.append( $item );
+					//console.log( "di < 0 : " + idx );
+				}
+			}
+
+			this._sx += di * this._itemWidth;
+
+			setElementTransform( this._$view, ( x - this._sx - this._itemWidth ) + "px", 0 );
+
+			//console.log( "rx " + this._rx + "sx " + this._sx );
+		},
+
+		_enableTracking: function () {
+			$(document).bind( this._dragMoveEvt, this._dragMoveCB );
+			$(document).bind( this._dragStopEvt, this._dragStopCB );
+		},
+
+		_disableTracking: function () {
+			$(document).unbind( this._dragMoveEvt, this._dragMoveCB );
+			$(document).unbind( this._dragStopEvt, this._dragStopCB );
+		},
+
+		_getScrollHierarchy: function () {
+			var svh = [],
+				d;
+			this._$clip.parents( '.ui-scrollview-clip' ).each( function () {
+				d = $( this ).jqmData( 'circulaview' );
+				if ( d ) {
+					svh.unshift( d );
+				}
+			} );
+			return svh;
+		},
+
+		centerTo: function ( selector ) {
+			var i,
+				newX;
+
+			for ( i = 0; i < this._$items.length; i++ ) {
+				if ( $( this._$items[i]).is( selector ) ) {
+					newX = -( i * this._itemWidth - this._clipWidth / 2 + this._itemWidth * 2 );
+					this.scrollTo( newX, 0 );
+					console.log( i + "," + newX );
+					return;
+				}
+			}
+		},
+
+		scrollTo: function ( x, y, duration ) {
+			this._stopMScroll();
+			if ( !duration ) {
+				this._setScrollPosition( x, y );
+				this._rx = x;
+				return;
+			}
+
+			x = -x;
+			y = -y;
+
+			var self = this,
+				start = getCurrentTime(),
+				efunc = $.easing.easeOutQuad,
+				sx = this._rx,
+				sy = 0,
+				dx = x - sx,
+				dy = 0,
+				tfunc,
+				elapsed,
+				ec;
+
+			tfunc = function () {
+				elapsed = getCurrentTime() - start;
+				if ( elapsed >= duration ) {
+					self._timerID = 0;
+					self._setScrollPosition( x, y );
+				} else {
+					ec = efunc( elapsed / duration, elapsed, 0, 1, duration );
+					self._setScrollPosition( sx + ( dx * ec ), sy + ( dy * ec ) );
+					self._timerID = setTimeout( tfunc, self._timerInterval );
+				}
+			};
+
+			this._timerID = setTimeout( tfunc, this._timerInterval );
+		},
+
+		getScrollPosition: function () {
+			return { x: -this._rx, y: 0 };
+		},
+
+		_handleDragStart: function ( e, ex, ey ) {
+			$.each( this._getScrollHierarchy(), function ( i, sv ) {
+				sv._stopMScroll();
+			} );
+
+			this._stopMScroll();
+
+			if ( this.options.delayedClickEnabled ) {
+				this._$clickEle = $( e.target ).closest( this.options.delayedClickSelector );
+			}
+			this._lastX = ex;
+			this._lastY = ey;
+			this._speedX = 0;
+			this._speedY = 0;
+			this._didDrag = false;
+
+			this._lastMove = 0;
+			this._enableTracking();
+
+			this._ox = ex;
+			this._nx = this._rx;
+
+			if ( this.options.eventType == "mouse" || this.options.delayedClickEnabled ) {
+				e.preventDefault();
+			}
+			//console.log( "scrollstart" + this._rx + "," + this._sx );
+			e.stopPropagation();
+		},
+
+		_handleDragMove: function ( e, ex, ey ) {
+			this._lastMove = getCurrentTime();
+
+			var dx = ex - this._lastX,
+				dy = ey - this._lastY;
+
+			this._speedX = dx;
+			this._speedY = 0;
+
+			this._didDrag = true;
+
+			this._lastX = ex;
+			this._lastY = ey;
+
+			this._mx = ex - this._ox;
+
+			this._setScrollPosition( this._nx + this._mx, 0 );
+
+			//console.log( "scrollmove" + this._rx + "," + this._sx );
+			return false;
+		},
+
+		_handleDragStop: function ( e ) {
+			var l = this._lastMove,
+				t = getCurrentTime(),
+				doScroll = l && ( t - l ) <= this.options.moveIntervalThreshold,
+				sx = ( this._tracker && this._speedX && doScroll ) ? this._speedX : 0,
+				sy = 0;
+
+			this._rx = this._mx ? this._nx + this._mx : this._rx;
+
+			if ( sx ) {
+				this._startMScroll( sx, sy );
+			}
+
+			//console.log( "scrollstop" + this._rx + "," + this._sx );
+
+			this._disableTracking();
+
+			if ( !this._didDrag && this.options.delayedClickEnabled && this._$clickEle.length ) {
+				this._$clickEle
+					.trigger( "mousedown" )
+					.trigger( "mouseup" )
+					.trigger( "click" );
+			}
+
+			if ( this._didDrag ) {
+				e.preventDefault();
+				e.stopPropagation();
+			}
+
+			return this._didDrag ? false : undefined;
+		},
+
+		_addBehaviors: function () {
+			var self = this;
+
+			if ( this.options.eventType === "mouse" ) {
+				this._dragStartEvt = "mousedown";
+				this._dragStartCB = function ( e ) {
+					return self._handleDragStart( e, e.clientX, e.clientY );
+				};
+
+				this._dragMoveEvt = "mousemove";
+				this._dragMoveCB = function ( e ) {
+					return self._handleDragMove( e, e.clientX, e.clientY );
+				};
+
+				this._dragStopEvt = "mouseup";
+				this._dragStopCB = function ( e ) {
+					return self._handleDragStop( e );
+				};
+
+				this._$view.bind( "vclick", function (e) {
+					return !self._didDrag;
+				} );
+
+			} else { //touch
+				this._dragStartEvt = "touchstart";
+				this._dragStartCB = function ( e ) {
+					var t = e.originalEvent.targetTouches[0];
+					return self._handleDragStart(e, t.pageX, t.pageY );
+				};
+
+				this._dragMoveEvt = "touchmove";
+				this._dragMoveCB = function ( e ) {
+					var t = e.originalEvent.targetTouches[0];
+					return self._handleDragMove(e, t.pageX, t.pageY );
+				};
+
+				this._dragStopEvt = "touchend";
+				this._dragStopCB = function ( e ) {
+					return self._handleDragStop( e );
+				};
+			}
+			this._$view.bind( this._dragStartEvt, this._dragStartCB );
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.mobile.circularview.prototype.options.initSelector, e.target ).circularview();
+	} );
+
+}( jQuery, window, document ) ); // End Component
+/* TBD */
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// It displays a grid two rows by five columns of colors.
+//
+// The colors are automatically computed based on the hue
+// of the color set by the color attribute (see below).
+//
+// One of the displayed colors is the color attribute itself
+// and the others are multiples of 360/10 away from that color;
+// 10 is the total number of colors displayed (2 rows by 5 columns).
+//
+// To apply, add the attribute data-role="colorpalette" to a <div>
+// element inside a page. Alternatively, call colorpalette() on an
+// element.
+//
+// Options:
+//
+//     color: String; initial color can be specified in html
+//            using the data-color="#ff00ff" attribute or
+//            when constructed in javascript, eg :
+//                $("#mycolorpalette").colorpalette({ color: "#ff00ff" });
+//            where the html might be :
+//                <div id="mycolorpalette"></div>
+//            The color can be changed post-construction like this :
+//                $("#mycolorpalette").colorpalette("option", "color", "#ABCDEF");
+//            Default: "#1a8039"
+
+/*
+ * Colorpalette displays a grid two rows by five columns of colors.
+ *
+ * The colors are automatically computed based on the hue
+ * of the color set by the color attribute (see below).
+ *
+ * One of the displayed colors is the color attribute itself
+ * and the others are multiples of 360/10 away from that color;
+ * 10 is the total number of colors displayed (2 rows by 5 columns).
+ *
+ * HTML attributes:
+ *
+ * To apply, add the attribute data-role="colorpalette" to a <div>
+ * element inside a page. Alternatively, call colorpalette() on an
+ * element.
+ *
+ *     data-role: Myst have 'colorpalette'.
+ *     data-color: String; initial color can be specified in html
+ *            using the data-color="#ff00ff" attribute or
+ *            when constructed in javascript, eg :
+ *                $("#mycolorpalette").colorpalette({ color: "#ff00ff" });
+ *            where the html might be :
+ *                <div id="mycolorpalette"></div>
+ *            The color can be changed post-construction like this :
+ *                $("#mycolorpalette").colorpalette("option", "color", "#ABCDEF");
+ *            Default: "#1a8039"
+ *
+ *APIs:
+ *		$('obj').colorpalette() : Make an object to a colorpalette widget.
+ *
+ *Events:
+ *		No event.
+ *
+ *Examples:
+ *		<div data-role="colorpalette" data-color: "#ffffff"></div>
+ *
+ *		<div id="toBeColorpalette"></div>
+ *		<script>
+ *			$("#toBeColorpalette").colorpalette({ color: "#ffffff" });
+ *		</script>
+ *
+ */
+
+( function ( $, undefined ) {
+
+	$.widget( "tizen.colorpalette", $.tizen.colorwidget, {
+		options: {
+			showPreview: false,
+			initSelector: ":jqmData(role='colorpalette')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='colorpalette' class='ui-colorpalette jquery-mobile-ui-widget' data-n-choices='10'>" +
+  "    <div class='colorpalette-preview-container' id='colorpalette-preview-container'>" +
+  "        <div id='colorpalette-preview' class='colorpalette-preview ui-corner-all'></div>" +
+  "    </div>" +
+  "    <div class='colorpalette-table'>" +
+  "        <div class='colorpalette-normal-row'>" +
+  "            <div class='colorpalette-choice-container-left'>" +
+  "                <div data-colorpalette-choice='0' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='1' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='2' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='3' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='4' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "        </div>" +
+  "        <div class='colorpalette-bottom-row'>" +
+  "            <div class='colorpalette-choice-container-left'>" +
+  "                <div data-colorpalette-choice='5' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='6' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='7' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='8' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='9' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "        </div>" +
+  "    </div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				clrpalette: "#colorpalette",
+				preview: "#colorpalette-preview",
+				previewContainer: "#colorpalette-preview-container"
+			}
+		},
+
+		_create: function () {
+			var self = this;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.clrpalette );
+
+			this._ui.clrpalette.find( "[data-colorpalette-choice]" ).bind( "vclick", function ( e ) {
+				var clr = $.tizen.colorwidget.prototype._getElementColor.call(this, $(e.target)),
+					Nix,
+					nChoices = self._ui.clrpalette.attr( "data-" + ( $.mobile.ns || "" ) + "n-choices" ),
+					choiceId,
+					rgbMatches;
+
+				rgbMatches = clr.match(/rgb\(([0-9]*), *([0-9]*), *([0-9]*)\)/);
+
+				if ( rgbMatches && rgbMatches.length > 3 ) {
+					clr = $.tizen.colorwidget.clrlib.RGBToHTML( [
+						parseInt(rgbMatches[1], 10) / 255,
+						parseInt(rgbMatches[2], 10) / 255,
+						parseInt(rgbMatches[3], 10) / 255] );
+				}
+
+				for ( Nix = 0 ; Nix < nChoices ; Nix++ ) {
+					self._ui.clrpalette.find( "[data-colorpalette-choice=" + Nix + "]" ).removeClass( "colorpalette-choice-active" );
+				}
+
+				$(e.target).addClass( "colorpalette-choice-active" );
+				$.tizen.colorwidget.prototype._setColor.call( self, clr );
+				$.tizen.colorwidget.prototype._setElementColor.call( self, self._ui.preview, $.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( clr ) ), "background" );
+			} );
+		},
+
+		_setShowPreview: function ( show ) {
+			if ( show ) {
+				this._ui.previewContainer.removeAttr( "style" );
+			} else {
+				this._ui.previewContainer.css( "display", "none" );
+			}
+
+			this.element.attr( "data-" + ( $.mobile.ns || "" ) + "show-preview", show );
+			this.options.showPreview = show;
+		},
+
+		widget: function ( value ) {
+			return this._ui.clrpalette;
+		},
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.clrpalette[value ? "addClass" : "removeClass"]( "ui-disabled" );
+			$.tizen.colorwidget.prototype._displayDisabledState.call( this, this._ui.clrpalette );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				clr = this.options.color;
+
+				var Nix,
+					activeIdx = -1,
+					nChoices = this._ui.clrpalette.attr( "data-" + ( $.mobile.ns || "" ) + "n-choices" ),
+					hsl = $.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( clr ) ),
+					origHue = hsl[0],
+					offset = hsl[0] / 36,
+					theFloor = Math.floor( offset ),
+					newClr,
+					currentlyActive;
+
+				$.tizen.colorwidget.prototype._setElementColor.call( this, this._ui.preview,
+						$.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( clr ) ), "background" );
+
+				offset = ( offset - theFloor < 0.5 )
+					? ( offset - theFloor )
+					: ( offset - ( theFloor + 1 ) );
+
+				offset *= 36;
+
+				for ( Nix = 0 ; Nix < nChoices ; Nix++ ) {
+					hsl[0] = Nix * 36 + offset;
+					hsl[0] = ( ( hsl[0] < 0) ? ( hsl[0] + 360 ) : ( ( hsl[0] > 360 ) ? ( hsl[0] - 360 ) : hsl[0] ) );
+
+					if ( hsl[0] === origHue ) {
+						activeIdx = Nix;
+					}
+
+					newClr = $.tizen.colorwidget.clrlib.RGBToHTML( $.tizen.colorwidget.clrlib.HSLToRGB( hsl ) );
+
+					$.tizen.colorwidget.prototype._setElementColor.call( this, this._ui.clrpalette.find( "[data-colorpalette-choice=" + Nix + "]" ),
+							$.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( newClr ) ), "background" );
+				}
+
+				if (activeIdx != -1) {
+					currentlyActive = parseInt( this._ui.clrpalette.find( ".colorpalette-choice-active" ).attr( "data-" + ($.mobile.ns || "" ) + "colorpalette-choice" ), 10 );
+					if ( currentlyActive != activeIdx ) {
+						this._ui.clrpalette.find( "[data-colorpalette-choice=" + currentlyActive + "]" ).removeClass( "colorpalette-choice-active" );
+						this._ui.clrpalette.find( "[data-colorpalette-choice=" + activeIdx + "]" ).addClass( "colorpalette-choice-active" );
+					}
+				}
+			}
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.colorpalette.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.colorpalette();
+	});
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays a 2D hue/saturation spectrum and a lightness slider.
+//
+// To apply, add the attribute data-role="colorpicker" to a <div>
+// element inside a page. Alternatively, call colorpicker() 
+// on an element (see below).
+//
+//Options:
+//	color: String; can be specified in html using the
+//		data-color="#ff00ff" attribute or when constructed
+//			$("#mycolorpicker").colorpicker({ color: "#ff00ff" });
+//		where the html might be :
+//			<div id="mycolorpicker"/>
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.colorpicker", $.tizen.colorwidget, {
+		options: {
+			initSelector: ":jqmData(role='colorpicker')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='colorpicker' class='ui-colorpicker'>" +
+  "    <div class='colorpicker-hs-container'>" +
+  "        <div id='colorpicker-hs-hue-gradient' class='colorpicker-hs-mask'></div>" +
+  "        <div id='colorpicker-hs-sat-gradient' class='colorpicker-hs-mask sat-gradient'></div>" +
+  "        <div id='colorpicker-hs-val-mask' class='colorpicker-hs-mask' data-event-source='hs'></div>" +
+  "        <div id='colorpicker-hs-selector' class='colorpicker-hs-selector ui-corner-all'></div>" +
+  "    </div>" +
+  "    <div class='colorpicker-l-container'>" +
+  "        <div id='colorpicker-l-gradient' class='colorpicker-l-mask l-gradient' data-event-source='l'></div>" +
+  "        <div id='colorpicker-l-selector' class='colorpicker-l-selector ui-corner-all'></div>" +
+  "    </div>" +
+  "    <div style='clear: both;'></div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				clrpicker: "#colorpicker",
+				hs: {
+					hueGradient: "#colorpicker-hs-hue-gradient",
+					gradient:    "#colorpicker-hs-sat-gradient",
+					eventSource: "[data-event-source='hs']",
+					valMask:     "#colorpicker-hs-val-mask",
+					selector:    "#colorpicker-hs-selector"
+				},
+				l: {
+					gradient:    "#colorpicker-l-gradient",
+					eventSource: "[data-event-source='l']",
+					selector:    "#colorpicker-l-selector"
+				}
+			}
+		},
+
+		_create: function () {
+			var self = this;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.clrpicker );
+
+			this._ui.hs.hueGradient.huegradient();
+
+			$.extend( self, {
+				dragging: false,
+				draggingHS: false,
+				selectorDraggingOffset: {
+					x : -1,
+					y : -1
+				},
+				dragging_hsl: undefined
+			} );
+
+			$( document )
+				.bind( "vmousemove", function ( event ) {
+					if ( self.dragging ) {
+						event.stopPropagation();
+						event.preventDefault();
+					}
+				} )
+				.bind( "vmouseup", function ( event ) {
+					if ( self.dragging ) {
+						self.dragging = false;
+					}
+				} );
+
+			this._bindElements( "hs" );
+			this._bindElements( "l" );
+		},
+
+		_bindElements: function ( which ) {
+			var self = this,
+				stopDragging = function ( event ) {
+					self.dragging = false;
+					event.stopPropagation();
+					event.preventDefault();
+				};
+
+			this._ui[which].eventSource
+				.bind( "vmousedown mousedown", function ( event ) { self._handleMouseDown( event, which, false ); } )
+				.bind( "vmousemove"          , function ( event ) { self._handleMouseMove( event, which, false ); } )
+				.bind( "vmouseup"            , stopDragging );
+
+			this._ui[which].selector
+				.bind( "vmousedown mousedown", function ( event ) { self._handleMouseDown( event, which, true); } )
+				.bind( "touchmove vmousemove", function ( event ) { self._handleMouseMove( event, which, true); } )
+				.bind( "vmouseup"            , stopDragging );
+		},
+
+		_handleMouseDown: function ( event, containerStr, isSelector ) {
+			var coords = $.mobile.tizen.targetRelativeCoordsFromEvent( event ),
+				widgetStr = isSelector ? "selector" : "eventSource";
+			if ( ( coords.x >= 0 && coords.x <= this._ui[containerStr][widgetStr].width() &&
+					coords.y >= 0 && coords.y <= this._ui[containerStr][widgetStr].height() ) || isSelector ) {
+				this.dragging = true;
+				this.draggingHS = ( "hs" === containerStr );
+
+				if ( isSelector ) {
+					this.selectorDraggingOffset.x = coords.x;
+					this.selectorDraggingOffset.y = coords.y;
+				}
+
+				this._handleMouseMove( event, containerStr, isSelector, coords );
+			}
+		},
+
+		_handleMouseMove: function ( event, containerStr, isSelector, coords ) {
+			var potential_h,
+				potential_s,
+				potential_l;
+
+			if ( this.dragging &&
+					!( ( this.draggingHS && containerStr === "l" ) ||
+						( !this.draggingHS && containerStr === "hs" ) ) ) {
+				coords = ( coords || $.mobile.tizen.targetRelativeCoordsFromEvent( event ) );
+
+				if ( this.draggingHS ) {
+					potential_h = isSelector
+						? this.dragging_hsl[0] / 360 + ( coords.x - this.selectorDraggingOffset.x ) / this._ui[containerStr].eventSource.width()
+						: coords.x / this._ui[containerStr].eventSource.width();
+					potential_s = isSelector
+						? this.dragging_hsl[1] + ( coords.y - this.selectorDraggingOffset.y ) / this._ui[containerStr].eventSource.height()
+						: coords.y / this._ui[containerStr].eventSource.height();
+
+					this.dragging_hsl[0] = Math.min( 1.0, Math.max( 0.0, potential_h ) ) * 360;
+					this.dragging_hsl[1] = Math.min( 1.0, Math.max( 0.0, potential_s ) );
+				} else {
+					potential_l = isSelector
+						? this.dragging_hsl[2] + ( coords.y - this.selectorDraggingOffset.y ) / this._ui[containerStr].eventSource.height()
+						: coords.y / this._ui[containerStr].eventSource.height();
+
+					this.dragging_hsl[2] = Math.min( 1.0, Math.max( 0.0, potential_l ) );
+				}
+
+				if ( !isSelector ) {
+					this.selectorDraggingOffset.x = Math.ceil( this._ui[containerStr].selector.outerWidth()  / 2.0 );
+					this.selectorDraggingOffset.y = Math.ceil( this._ui[containerStr].selector.outerHeight() / 2.0 );
+				}
+
+				this._updateSelectors( this.dragging_hsl );
+				event.stopPropagation();
+				event.preventDefault();
+			}
+		},
+
+		_updateSelectors: function ( hsl ) {
+			var clr = $.tizen.colorwidget.prototype._setElementColor.call( this, this._ui.hs.selector, [hsl[0], 1.0 - hsl[1], hsl[2]], "background" ).clr,
+				gray = $.tizen.colorwidget.clrlib.RGBToHTML( [hsl[2], hsl[2], hsl[2]] );
+
+			this._ui.hs.valMask.css((hsl[2] < 0.5)
+				? { background : "#000000" , opacity : ( 1.0 - hsl[2] * 2.0 )   }
+				: { background : "#ffffff" , opacity : ( ( hsl[2] - 0.5 ) * 2.0 ) } );
+			this._ui.hs.selector.css( {
+				left : ( hsl[0] / 360 * this._ui.hs.eventSource.width() ),
+				top : ( hsl[1] * this._ui.hs.eventSource.height() )
+			});
+			this._ui.l.selector.css({
+				top : ( hsl[2] * this._ui.l.eventSource.height() ),
+				background : gray
+			} );
+			$.tizen.colorwidget.prototype._setColor.call( this, clr );
+		},
+
+		widget: function () { return this._ui.clrpicker; },
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.hs.hueGradient.huegradient( "option", "disabled", value );
+			this._ui.clrpicker[value ? "addClass" : "removeClass"]( "ui-disabled" );
+			$.tizen.colorwidget.prototype._displayDisabledState.call( this, this._ui.clrpicker );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				this.dragging_hsl = $.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( this.options.color ) );
+				this.dragging_hsl[1] = 1.0 - this.dragging_hsl[1];
+				this._updateSelectors( this.dragging_hsl );
+			}
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.colorpicker.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.colorpicker();
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence ( as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php )
+ *
+ * ***************************************************************************
+ * Copyright ( c ) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright ( c ) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files ( the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays a button which, when pressed, opens a popupwindow
+// containing hsvpicker.
+//
+// To apply, add the attribute data-role="colorpickerbutton" to a <div>
+// element inside a page. Alternatively, call colorpickerbutton() on an
+// element.
+//
+// Options:
+//
+//   color: String; color displayed on the button and the base color
+//      of the hsvpicker ( see hsvpicker ).
+//      initial color can be specified in html using the
+//      data-color="#ff00ff" attribute or when constructed in
+//      javascript, eg :
+//        $( "#mycolorpickerbutton" ).colorpickerbutton( { color: "#ff00ff" } );
+//      where the html might be :
+//        <div id="colorpickerbutton"></div>
+//      The color can be changed post-construction like this :
+//        $( "#mycolorpickerbutton" ).colorpickerbutton( "option", "color", "#ABCDEF" );
+//      Default: "#1a8039"
+//
+//   buttonMarkup: String; markup to use for the close button on the popupwindow, eg :
+//          $( "#mycolorpickerbutton" ).colorpickerbutton( "option","buttonMarkup",
+//           "<a href='#' data-role='button'>ignored</a>" );
+//
+//   closeText: String; the text to display on the close button on the popupwindow.
+//        The text set in the buttonMarkup will be ignored and this used instead.
+//
+// Events:
+//
+//   colorchanged: emitted when the color has been changed and the popupwindow is closed.
+
+( function ( $, undefined ) {
+
+	$.widget( "tizen.colorpickerbutton", $.tizen.colorwidget, {
+		options: {
+			buttonMarkup: {
+				theme: null,
+				inline: true,
+				corners: true,
+				shadow: true
+			},
+			hideInput: true,
+			closeText: "Close",
+			initSelector: "input[type='color'], :jqmData(type='color'), :jqmData(role='colorpickerbutton')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='colorpickerbutton'>" +
+  "    <a id='colorpickerbutton-button' href='#' data-role='button' aria-haspopup='true'>" +
+  "        <span id='colorpickerbutton-button-contents'>&#x2587;&#x2587;&#x2587;</span>" +
+  "    </a>" +
+  "    <div id='colorpickerbutton-popup-container' class='colorpickerbutton-popup-container-style'>" +
+  "        <div id='colorpickerbutton-popup-hsvpicker' data-role='hsvpicker'></div>" +
+  "        <a id='colorpickerbutton-popup-close-button' href='#' data-role='button'>" +
+  "            <span id='colorpickerbutton-popup-close-button-text'></span>" +
+  "        </a>" +
+  "    </div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				button: "#colorpickerbutton-button",
+				buttonContents: "#colorpickerbutton-button-contents",
+				popup: "#colorpickerbutton-popup-container",
+				hsvpicker: "#colorpickerbutton-popup-hsvpicker",
+				closeButton: "#colorpickerbutton-popup-close-button",
+				closeButtonText: "#colorpickerbutton-popup-close-button-text"
+			}
+		},
+
+		_create: function () {
+			var self = this;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.button );
+
+			/* Tear apart the proto */
+			this._ui.popup.insertBefore( this.element ).popupwindow();
+			this._ui.hsvpicker.hsvpicker();
+
+			$.tizen.popupwindow.bindPopupToButton( this._ui.button, this._ui.popup );
+
+			this._ui.closeButton.bind( "vclick", function ( event ) {
+				self._setColor( self._ui.hsvpicker.hsvpicker( "option", "color" ) );
+				self.close();
+			} );
+
+			this.element.bind( "change keyup blur", function () {
+				self._setColor( self.element.val() );
+			} );
+		},
+
+		_setHideInput: function ( value ) {
+			this.element[value ? "addClass" : "removeClass"]( "ui-colorpickerbutton-input-hidden" );
+			this.element[value ? "removeClass" : "addClass"]( "ui-colorpickerbutton-input" );
+			this.element.attr( "data-" + ( $.mobile.ns || "" ) + "hide-input", value );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				var clrlib = $.tizen.colorwidget.clrlib;
+
+				this._ui.hsvpicker.hsvpicker( "option", "color", this.options.color );
+				$.tizen.colorwidget.prototype._setElementColor.call( this, this._ui.buttonContents,
+						clrlib.RGBToHSL( clrlib.HTMLToRGB( this.options.color ) ), "color" );
+			}
+		},
+
+		_setButtonMarkup: function ( value ) {
+			this._ui.button.buttonMarkup( value );
+			this.options.buttonMarkup = value;
+			value.inline = false;
+			this._ui.closeButton.buttonMarkup( value );
+		},
+
+		_setCloseText: function ( value ) {
+			this._ui.closeButtonText.text( value );
+			this.options.closeText = value;
+			this.element.attr( "data-" + ( $.mobile.ns || "" ) + "close-text", value );
+		},
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.popup.popupwindow( "option", "disabled", value );
+			this._ui.button[value ? "addClass" : "removeClass"]( "ui-disabled" );
+			$.tizen.colorwidget.prototype._displayDisabledState.call( this, this._ui.button );
+		},
+
+		open: function () {
+			this._ui.popup.popupwindow( "open",
+					this._ui.button.offset().left + this._ui.button.outerWidth() / 2,
+					this._ui.button.offset().top + this._ui.button.outerHeight() / 2 );
+		},
+
+		_focusButton : function () {
+			var self = this;
+			setTimeout( function () {
+				self._ui.button.focus();
+			}, 40 );
+		},
+
+		close: function () {
+			this._focusButton();
+			this._ui.popup.popupwindow( "close" );
+		}
+	} );
+
+//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.colorpickerbutton.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.colorpickerbutton();
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays the color in text of the form '#RRGGBB' where
+// RR, GG, and BB are in hexadecimal.
+//
+// Apply a colortitle by adding the attribute data-role="colortitle"
+// to a <div> element inside a page. Alternatively, call colortitle() 
+// on an element (see below).
+//
+// Options:
+//
+//     color: String; the initial color can be specified in html using
+//            the data-color="#ff00ff" attribute or when constructed
+//            in javascipt eg
+//                $("#mycolortitle").colortitle({ color: "#ff00ff" });
+//            where the html might be :
+//                <div id="mycolortitle"></div>
+//            The color can be changed post-construction :
+//                $("#mycolortitle").colortitle("option", "color", "#ABCDEF");
+//            Default: "#1a8039".
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.colortitle", $.tizen.colorwidget, {
+		options: {
+			initSelector: ":jqmData(role='colortitle')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='colortitle' class='ui-colortitle jquery-mobile-ui-widget'>" +
+  "    <h1 id='colortitle-string'></h1>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				clrtitle: "#colortitle",
+				header:   "#colortitle-string"
+			}
+		},
+
+		_create: function () {
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.clrtitle );
+
+		},
+
+		widget: function () { return this._ui.clrtitle; },
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.clrtitle[value ? "addClass" : "removeClass"]( "ui-disabled" );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				this._ui.header.text( this.options.color );
+				$( this._ui.header ).parent().css( "color", this.options.color );
+			}
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.colortitle.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.colortitle();
+	} );
+
+}( jQuery ) );
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Ensure that the given namespace is defined. If not, define it to be an empty object.
+// This is kinda like the mkdir -p command.
+
+function ensureNS(ns) {
+    var nsAr = ns.split("."),
+    nsSoFar = "";
+
+    for (var Nix in nsAr) {
+        nsSoFar = nsSoFar + (Nix > 0 ? "." : "") + nsAr[Nix];
+        eval (nsSoFar + " = " + nsSoFar + " || {};");
+    }
+}
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright © 2008 George McGinley Smith
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this list of 
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list 
+ * of conditions and the following disclaimer in the documentation and/or other materials 
+ * provided with the distribution.
+ * 
+ * Neither the name of the author nor the names of contributors may be used to endorse 
+ * or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+jQuery.easing['jswing'] = jQuery.easing['swing'];
+
+jQuery.extend( jQuery.easing,
+{
+	def: 'easeOutQuad',
+	swing: function (x, t, b, c, d) {
+		//alert(jQuery.easing.default);
+		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
+	},
+	easeInQuad: function (x, t, b, c, d) {
+		return c*(t/=d)*t + b;
+	},
+	easeOutQuad: function (x, t, b, c, d) {
+		return -c *(t/=d)*(t-2) + b;
+	},
+	easeInOutQuad: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t + b;
+		return -c/2 * ((--t)*(t-2) - 1) + b;
+	},
+	easeInCubic: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t + b;
+	},
+	easeOutCubic: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t + 1) + b;
+	},
+	easeInOutCubic: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t + b;
+		return c/2*((t-=2)*t*t + 2) + b;
+	},
+	easeInQuart: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t + b;
+	},
+	easeOutQuart: function (x, t, b, c, d) {
+		return -c * ((t=t/d-1)*t*t*t - 1) + b;
+	},
+	easeInOutQuart: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+		return -c/2 * ((t-=2)*t*t*t - 2) + b;
+	},
+	easeInQuint: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t*t + b;
+	},
+	easeOutQuint: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t*t*t + 1) + b;
+	},
+	easeInOutQuint: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+		return c/2*((t-=2)*t*t*t*t + 2) + b;
+	},
+	easeInSine: function (x, t, b, c, d) {
+		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+	},
+	easeOutSine: function (x, t, b, c, d) {
+		return c * Math.sin(t/d * (Math.PI/2)) + b;
+	},
+	easeInOutSine: function (x, t, b, c, d) {
+		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+	},
+	easeInExpo: function (x, t, b, c, d) {
+		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+	},
+	easeOutExpo: function (x, t, b, c, d) {
+		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+	},
+	easeInOutExpo: function (x, t, b, c, d) {
+		if (t==0) return b;
+		if (t==d) return b+c;
+		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+	},
+	easeInCirc: function (x, t, b, c, d) {
+		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+	},
+	easeOutCirc: function (x, t, b, c, d) {
+		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+	},
+	easeInOutCirc: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+	},
+	easeInElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+	},
+	easeOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+	},
+	easeInOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+	},
+	easeInBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*(t/=d)*t*((s+1)*t - s) + b;
+	},
+	easeOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+	},
+	easeInOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158; 
+		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+	},
+	easeInBounce: function (x, t, b, c, d) {
+		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+	},
+	easeOutBounce: function (x, t, b, c, d) {
+		if ((t/=d) < (1/2.75)) {
+			return c*(7.5625*t*t) + b;
+		} else if (t < (2/2.75)) {
+			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+		} else if (t < (2.5/2.75)) {
+			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+		} else {
+			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+		}
+	},
+	easeInOutBounce: function (x, t, b, c, d) {
+		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+	}
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright © 2001 Robert Penner
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this list of 
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list 
+ * of conditions and the following disclaimer in the documentation and/or other materials 
+ * provided with the distribution.
+ * 
+ * Neither the name of the author nor the names of contributors may be used to endorse 
+ * or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Add markup for labels
+
+(function($, undefined) {
+
+$(document).bind("pagecreate create", function(e) {
+    $(":jqmData(role='label')", e.target).not(":jqmData(role='none'), :jqmData(role='nojs')").each(function() {
+        $(this).addClass("jquery-mobile-ui-label")
+               .html($("<span>", {"class": "jquery-mobile-ui-label-text"}).text($(this).text()));
+    });
+});
+
+})(jQuery);
+/*
+ * Size pages to the window
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Size pages to the window
+
+(function($, undefined) {
+
+var _fit_page_to_window_selector = ":jqmData(role='page'):jqmData(fit-page-to-window='true'):visible";
+
+$(document).bind("pageshow", function(e) {
+    if ($(e.target).is(_fit_page_to_window_selector))
+        $.mobile.tizen.fillPageWithContentArea($(e.target));
+});
+
+$(window).resize(function() {
+    if ($(_fit_page_to_window_selector)[0] !== undefined)
+        $.mobile.tizen.fillPageWithContentArea($(_fit_page_to_window_selector));
+});
+
+})(jQuery);
+ensureNS("jQuery.mobile.tizen.clrlib");
+
+jQuery.extend( jQuery.mobile.tizen.clrlib, 
+{
+    nearestInt: function(val) { 
+        var theFloor = Math.floor(val);
+
+        return (((val - theFloor) > 0.5) ? (theFloor + 1) : theFloor);
+    },
+
+    /*
+     * Converts html color string to rgb array.
+     *
+     * Input: string clr_str, where
+     * clr_str is of the form "#aabbcc"
+     *
+     * Returns: [ r, g, b ], where
+     * r is in [0, 1]
+     * g is in [0, 1]
+     * b is in [0, 1]
+     */
+    HTMLToRGB: function(clr_str) {
+        clr_str = (('#' == clr_str.charAt(0)) ? clr_str.substring(1) : clr_str);
+
+        return ([
+            clr_str.substring(0, 2),
+            clr_str.substring(2, 4),
+            clr_str.substring(4, 6)
+            ].map(function(val) {
+                return parseInt(val, 16) / 255.0;
+            }));
+    },
+
+    /*
+     * Converts rgb array to html color string.
+     *
+     * Input: [ r, g, b ], where
+     * r is in [0, 1]
+     * g is in [0, 1]
+     * b is in [0, 1]
+     *
+     * Returns: string of the form "#aabbcc"
+     */
+    RGBToHTML: function(rgb) {
+        return ("#" + 
+            rgb.map(function(val) {
+                      var ret = val * 255,
+                          theFloor = Math.floor(ret);
+
+                      ret = ((ret - theFloor > 0.5) ? (theFloor + 1) : theFloor);
+                      ret = (((ret < 16) ? "0" : "") + (ret & 0xff).toString(16));
+                      return ret;
+                  })
+               .join(""));
+    },
+
+    /*
+     * Converts hsl to rgb.
+     *
+     * From http://130.113.54.154/~monger/hsl-rgb.html
+     *
+     * Input: [ h, s, l ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * l is in [0,   1]
+     *
+     * Returns: [ r, g, b ], where
+     * r is in [0, 1]
+     * g is in [0, 1]
+     * b is in [0, 1]
+     */
+    HSLToRGB: function(hsl) {
+        var h = hsl[0] / 360.0, s = hsl[1], l = hsl[2];
+
+        if (0 === s)
+            return [ l, l, l ];
+
+        var temp2 = ((l < 0.5)
+                ? l * (1.0 + s)
+                : l + s - l * s),
+            temp1 = 2.0 * l - temp2,
+            temp3 = {
+                r: h + 1.0 / 3.0,
+                g: h,
+                b: h - 1.0 / 3.0
+            };
+
+        temp3.r = ((temp3.r < 0) ? (temp3.r + 1.0) : ((temp3.r > 1) ? (temp3.r - 1.0) : temp3.r));
+        temp3.g = ((temp3.g < 0) ? (temp3.g + 1.0) : ((temp3.g > 1) ? (temp3.g - 1.0) : temp3.g));
+        temp3.b = ((temp3.b < 0) ? (temp3.b + 1.0) : ((temp3.b > 1) ? (temp3.b - 1.0) : temp3.b));
+
+        ret = [
+            (((6.0 * temp3.r) < 1) ? (temp1 + (temp2 - temp1) * 6.0 * temp3.r) :
+            (((2.0 * temp3.r) < 1) ? temp2 :
+            (((3.0 * temp3.r) < 2) ? (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp3.r) * 6.0) :
+             temp1))),
+            (((6.0 * temp3.g) < 1) ? (temp1 + (temp2 - temp1) * 6.0 * temp3.g) :
+            (((2.0 * temp3.g) < 1) ? temp2 :
+            (((3.0 * temp3.g) < 2) ? (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp3.g) * 6.0) :
+             temp1))),
+            (((6.0 * temp3.b) < 1) ? (temp1 + (temp2 - temp1) * 6.0 * temp3.b) :
+            (((2.0 * temp3.b) < 1) ? temp2 :
+            (((3.0 * temp3.b) < 2) ? (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp3.b) * 6.0) :
+             temp1)))]; 
+
+        return ret;
+    },
+
+    /*
+     * Converts hsv to rgb.
+     *
+     * Input: [ h, s, v ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * v is in [0,   1]
+     *
+     * Returns: [ r, g, b ], where
+     * r is in [0, 1]
+     * g is in [0, 1]
+     * b is in [0, 1]
+     */
+    HSVToRGB: function(hsv) {
+        return $.mobile.tizen.clrlib.HSLToRGB($.mobile.tizen.clrlib.HSVToHSL(hsv));
+    },
+
+    /*
+     * Converts rgb to hsv.
+     *
+     * from http://coecsl.ece.illinois.edu/ge423/spring05/group8/FinalProject/HSV_writeup.pdf
+     *
+     * Input: [ r, g, b ], where
+     * r is in [0,   1]
+     * g is in [0,   1]
+     * b is in [0,   1]
+     *
+     * Returns: [ h, s, v ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * v is in [0,   1]
+     */
+    RGBToHSV: function(rgb) {
+        var min, max, delta, h, s, v, r = rgb[0], g = rgb[1], b = rgb[2];
+
+        min = Math.min(r, Math.min(g, b));
+        max = Math.max(r, Math.max(g, b));
+        delta = max - min;
+
+        h = 0;
+        s = 0;
+        v = max;
+
+        if (delta > 0.00001) {
+            s = delta / max;
+
+            if (r === max)
+                h = (g - b) / delta ;
+            else
+            if (g === max)
+                h = 2 + (b - r) / delta ;
+            else
+                h = 4 + (r - g) / delta ;
+
+            h *= 60 ;
+
+            if (h < 0)
+                h += 360 ;
+        }
+
+        return [h, s, v];
+    },
+
+    /*
+     * Converts hsv to hsl.
+     *
+     * Input: [ h, s, v ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * v is in [0,   1]
+     *
+     * Returns: [ h, s, l ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * l is in [0,   1]
+     */
+    HSVToHSL: function(hsv) {
+        var max = hsv[2],
+            delta = hsv[1] * max,
+            min = max - delta,
+            sum = max + min,
+            half_sum = sum / 2,
+            s_divisor = ((half_sum < 0.5) ? sum : (2 - max - min));
+
+        return [ hsv[0], ((0 == s_divisor) ? 0 : (delta / s_divisor)), half_sum ];
+    },
+
+    /*
+     * Converts rgb to hsl
+     *
+     * Input: [ r, g, b ], where
+     * r is in [0,   1]
+     * g is in [0,   1]
+     * b is in [0,   1]
+     *
+     * Returns: [ h, s, l ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * l is in [0,   1]
+     */
+    RGBToHSL: function(rgb) {
+        return $.mobile.tizen.clrlib.HSVToHSL($.mobile.tizen.clrlib.RGBToHSV(rgb));
+    }
+});
+/*!
+ * jQuery Mobile Widget @VERSION
+ *
+ * TODO: remove unnecessary codes....
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Kalyan Kondapally <kalyan.kondapally@intel.com>
+ */
+
+ensureNS("jQuery.mobile.tizen");
+
+(function () {
+jQuery.extend(jQuery.mobile.tizen, {
+    Point: function (x, y) {
+        var X = isNaN(x) ? 0 : x;
+        var Y = isNaN(y) ? 0 : y;
+
+        this.add = function (Point) {
+            this.setX(X + Point.x());
+            this.setY(Y + Point.y());
+            return this;
+        }
+
+        this.subtract = function (Point) {
+            this.setX(X - Point.x());
+            this.setY(Y - Point.y());
+            return this;
+        }
+
+        this.multiply = function (Point) {
+            this.setX(Math.round(X * Point.x()));
+            this.setY(Math.round(Y * Point.y()));
+            return this;
+        }
+
+        this.divide = function (Point) {
+            this.setX(Math.round(X / Point.x()));
+            this.setY(Math.round(Y / Point.y()));
+            return this;
+        }
+
+        this.isNull = function () {
+            return (X === 0 && Y === 0);
+        }
+
+        this.x = function () {
+            return X;
+        }
+
+        this.setX = function (val) {
+            isNaN(val) ? X = 0 : X = val;
+        }
+
+        this.y = function () {
+            return Y;
+        }
+
+        this.setY = function (val) {
+            isNaN(val) ? Y = 0 : Y = val;
+        }
+
+        this.setNewPoint = function (point) {
+            this.setX(point.x());
+            this.setY(point.y());
+        }
+
+        this.isEqualTo = function (point) {
+            return (X === point.x() && Y === point.y());
+        }
+    },
+
+    Rect: function (left,top,width,height) {
+        var Left = left;
+        var Top = top;
+        var Right = Left+width;
+        var Bottom = Top+height;
+
+        this.setRect = function(varL,varR,varT,varB) {
+            this.setLeft(varL);
+            this.setRight(varR);
+            this.setTop(varT);
+            this.setBottom(varB);
+        }
+
+        this.right = function () {
+            return Right;
+        }
+
+        this.setRight = function (val) {
+            Right = val;
+        }
+
+        this.top = function () {
+            return Top;
+        }
+
+        this.setTop = function (val) {
+            Top = val;
+        }
+
+        this.bottom = function () {
+            return Bottom;
+        }
+
+        this.setBottom = function (val) {
+            Bottom = val;
+        }
+
+        this.left = function () {
+            return Left;
+        }
+
+        this.setLeft = function (val) {
+            Left = val;
+        }
+
+        this.moveTop = function(valY) {
+            var h = this.height();
+            Top = valY;
+            Bottom = Top + h;
+        }
+
+        this.isNull = function () {
+            return Right === Left && Bottom === Top;
+        }
+
+        this.isValid = function () {
+            return Left <= Right && Top <= Bottom;
+        }
+
+        this.isEmpty = function () {
+            return Left > Right || Top > Bottom;
+        }
+
+        this.contains = function (valX,valY) {
+            if (this.containsX(valX) && this.containsY(valY))
+                return true;
+            return false;
+        }
+
+        this.width = function () {
+            return Right - Left;
+        }
+
+        this.height = function () {
+            return Bottom - Top;
+        }
+
+        this.containsX = function(val) {
+            var l = Left,
+            r = Right;
+            if (Right<Left) {
+                l = Right;
+                r = Left;
+            }
+            if (l > val || r < val)
+                return false;
+        return true;
+        }
+
+        this.containsY = function(val) {
+            var t = Top,
+            b = Bottom;
+            if (Bottom<Top) {
+                t = Bottom;
+                b = Top;
+            }
+            if (t > val || b < val)
+                return false;
+          return true;
+        }
+    },
+
+    disableSelection: function (element) {
+        return $(element).each(function () {
+            jQuery(element).css('-webkit-user-select', 'none');
+        });
+    },
+
+    enableSelection: function (element, value) {
+        return $(element).each(function () {
+            val = value == "text" ? val = 'text' : val = 'auto';
+            jQuery(element).css('-webkit-user-select', val);
+        });
+    },
+
+    // Set the height of the content area to fill the space between a
+    // page's header and footer
+    fillPageWithContentArea: function (page) {
+        var $page = $(page);
+        var $content = $page.children(".ui-content:first");
+        var hh = $page.children(".ui-header").outerHeight(); hh = hh ? hh : 0;
+        var fh = $page.children(".ui-footer").outerHeight(); fh = fh ? fh : 0;
+        var pt = parseFloat($content.css("padding-top"));
+        var pb = parseFloat($content.css("padding-bottom"));
+        var wh = window.innerHeight;
+        var height = wh - (hh + fh) - (pt + pb);
+        $content.height(height);
+    },
+
+    // Get document-relative mouse coordinates from a given event
+    // From: http://www.quirksmode.org/js/events_properties.html#position
+    documentRelativeCoordsFromEvent: function(ev) {
+        var e = ev ? ev : window.event,
+            client = { x: e.clientX, y: e.clientY },
+            page   = { x: e.pageX,   y: e.pageY   },
+            posx = 0,
+            posy = 0;
+
+        // Grab useful coordinates from touch events
+        if (e.type.match(/^touch/)) {
+            page = {
+                x: e.originalEvent.targetTouches[0].pageX,
+                y: e.originalEvent.targetTouches[0].pageY
+            };
+            client = {
+                x: e.originalEvent.targetTouches[0].clientX,
+                y: e.originalEvent.targetTouches[0].clientY
+            };
+        }
+
+        if (page.x || page.y) {
+            posx = page.x;
+            posy = page.y;
+        }
+        else
+        if (client.x || client.y) {
+            posx = client.x + document.body.scrollLeft + document.documentElement.scrollLeft;
+            posy = client.y + document.body.scrollTop  + document.documentElement.scrollTop;
+        }
+
+        return { x: posx, y: posy };
+    },
+
+	// TODO : offsetX, offsetY. touch events don't have offsetX and offsetY. support for touch devices.
+    // check algorithm...
+    targetRelativeCoordsFromEvent: function(e) {
+        var coords = { x: e.offsetX, y: e.offsetY };
+
+        if (coords.x === undefined || isNaN(coords.x) ||
+            coords.y === undefined || isNaN(coords.y)) {
+            var offset = $(e.target).offset();
+            //coords = documentRelativeCoordsFromEvent(e);	// Old code. Must be checked again.
+            coords = $.mobile.tizen.documentRelativeCoordsFromEvent(e);
+            coords.x -= offset.left;
+            coords.y -= offset.top;
+        }
+
+        return coords;
+    }
+});
+
+})();
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Wrapper round the jLayout functions to enable it to be used
+// for creating jQuery Mobile layout extensions.
+//
+// See the layouthbox and layoutvbox widgets for usage examples.
+(function ($, undefined) {
+
+$.widget("tizen.jlayoutadaptor", $.mobile.widget, {
+    options: {
+        hgap: null,
+        vgap: null,
+        scrollable: true,
+        showScrollBars: true,
+        direction: null
+    },
+
+    _create: function () {
+        var self = this,
+            options = this.element.data('layout-options'),
+            page = $(this.element).closest(':jqmData(role="page")');
+
+        $.extend(this.options, options);
+
+        if (page && !page.is(':visible')) {
+            this.element.hide();
+
+            page.bind('pageshow', function () {
+                self.refresh();
+            });
+        }
+        else {
+            this.refresh();
+        }
+    },
+
+    refresh: function () {
+        var container;
+        var config = $.extend(this.options, this.fixed);
+
+        if (config.scrollable) {
+            if (!(this.element.children().is('.ui-scrollview-view'))) {
+                // create the scrollview
+                this.element.scrollview({direction: config.direction,
+                                         showScrollBars: config.showScrollBars});
+            }
+            else if (config.showScrollBars) {
+                this.element.find('.ui-scrollbar').show();
+            }
+            else {
+                this.element.find('.ui-scrollbar').hide();
+            }
+
+            container = this.element.find('.ui-scrollview-view');
+        }
+        else {
+            container = this.element;
+        }
+
+        container.layout(config);
+
+        this.element.show();
+
+        if (config.scrollable) {
+            // get the right/bottom edge of the last child after layout
+            var lastItem = container.children().last();
+
+            var edge;
+
+            var scrollview = this.element.find('.ui-scrollview-view');
+
+            if (config.direction === 'x') {
+                edge = lastItem.position().left +
+                       lastItem.outerWidth(true);
+
+                // set the scrollview's view width to the original width
+                scrollview.width(edge);
+
+                // set the parent container's height to the height of
+                // the scrollview
+                this.element.height(scrollview.height());
+            }
+            else if (config.direction === 'y') {
+                edge = lastItem.position().top +
+                       lastItem.outerHeight(true);
+
+                // set the scrollview's view height to the original height
+                scrollview.height(edge);
+
+                // set the parent container's width to the width of the
+                // scrollview
+                this.element.width(scrollview.width());
+            }
+        }
+    }
+});
+
+})(jQuery);
+(function($, undefined) {
+
+ensureNS("jQuery.mobile.tizen");
+
+jQuery.extend( jQuery.mobile.tizen,
+{
+    _widgetPrototypes: {},
+
+    /*
+     * load the prototype for a widget.
+     *
+     * If @widget is a string, the function looks for @widget.prototype.html in the proto-html/ subdirectory of the
+     * framework's current theme and loads the file via AJAX into a string. Note that the file will only be loaded via
+     * AJAX once. If two widget instances based on the same @widget value are to be constructed, the second will be
+     * constructed from the cached copy of the prototype of the first instance.
+     *
+     * If @widget is not a string, it is assumed to be a hash containing at least one key, "proto", the value of which is
+     * the string to be used for the widget prototype. if another key named "key" is also provided, it will serve as the
+     * key under which to cache the prototype, so it need not be rendered again in the future.
+     *
+     * Given the string for the widget prototype, the following patterns occurring in the string are replaced:
+     *
+     *   "${FRAMEWORK_ROOT}" - replaced with the path to the root of the framework
+     *
+     * The function then creates a jQuery $("<div>") object containing the prototype from the string.
+     *
+     * If @ui is not provided, the jQuery object containing the prototype is returned.
+     *
+     * If @ui is provided, it is assumed to be a (possibly multi-level) hash containing CSS selectors. For every level of
+     * the hash and for each string-valued key at that level, the CSS selector specified as the value is sought in the
+     * prototype jQuery object and, if found, the value of the key is replaced with the jQuery object resulting from the
+     * search. Additionally, if the CSS selector is of the form "#widgetid", the "id" attribute will be removed from the
+     * elements contained within the resulting jQuery object. The resulting hash is returned.
+     *
+     * Examples:
+     *
+     * 1.
+     * $.mobile.tizen.loadPrototype("mywidget") => Returns a <div> containing the structure from the file
+     * mywidget.prototype.html located in the current theme folder of the current framework.
+     *
+     * 2. $.mobile.tizen.loadPrototype("mywidget", ui):
+     * where ui is a hash that looks like this:
+     * ui = {
+     *   element1: "<css selector 1>",
+     *   element2: "<css selector 2>",
+     *   group1: {
+     *     group1element1: "<css selector 3>",
+     *     group1element1: "<css selector 4>"
+     *   }
+     *  ...
+     * }
+     *
+     * In this case, after loading the prototype as in Example 1, loadPrototype will traverse @ui and replace the CSS
+     * selector strings with the result of the search for the selector string upon the prototype. If any of the CSS
+     * selectors are of the form "#elementid" then the "id" attribute will be stripped from the elements selected. This
+     * means that they will no longer be accessible via the selector used initially. @ui is then returned thus modified.
+     */
+
+    loadPrototype: function(widget, ui) {
+        var ret = undefined,
+            theScriptTag = $("script[data-framework-version][data-framework-root][data-framework-theme]"),
+            frameworkRootPath = theScriptTag.attr("data-framework-root")    + "/" +
+                                theScriptTag.attr("data-framework-version") + "/";
+
+        function replaceVariables(s) {
+            return s.replace(/\$\{FRAMEWORK_ROOT\}/g, frameworkRootPath);
+        }
+
+        function fillObj(obj, uiProto) {
+            var selector;
+
+            for (var key in obj) {
+                if (typeof obj[key] === "string") {
+                    selector = obj[key];
+                    obj[key] = uiProto.find(obj[key]);
+                    if (selector.substring(0, 1) === "#")
+                        obj[key].removeAttr("id");
+                }
+                else
+                if (typeof obj[key] === "object")
+                    obj[key] = fillObj(obj[key], uiProto);
+            }
+            return obj;
+        }
+
+        /* If @widget is a string ... */
+        if (typeof widget === "string") {
+            /* ... try to use it as a key into the cached prototype hash ... */
+            ret = $.mobile.tizen._widgetPrototypes[widget];
+            if (ret === undefined) {
+                /* ... and if the proto was not found, try to load its definition ... */
+                var protoPath = frameworkRootPath + "proto-html" + "/" +
+                                theScriptTag.attr("data-framework-theme");
+                $.ajax({
+                    url: protoPath + "/" + widget + ".prototype.html",
+                    async: false,
+                    dataType: "html"
+                })
+                 .success(function(data, textStatus, jqXHR) {
+                    /* ... and if loading succeeds, cache it and use a copy of it ... */
+                    $.mobile.tizen._widgetPrototypes[widget] = $("<div>").html(replaceVariables(data));
+                    ret = $.mobile.tizen._widgetPrototypes[widget].clone();
+                });
+            }
+        }
+        /* Otherwise ... */
+        else {
+            /* ... if a key was provided ... */
+            if (widget.key !== undefined)
+                /* ... try to use it as a key into the cached prototype hash ... */
+                ret = $.mobile.tizen._widgetPrototypes[widget.key];
+
+            /* ... and if the proto was not found in the cache ... */
+            if (ret === undefined) {
+                /* ... and a proto definition string was provided ... */
+                if (widget.proto !== undefined) {
+                    /* ... create a new proto from the definition ... */
+                    ret = $("<div>").html(replaceVariables(widget.proto));
+                    /* ... and if a key was provided ... */
+                    if (widget.key !== undefined)
+                        /* ... cache a copy of the proto under that key */
+                        $.mobile.tizen._widgetPrototypes[widget.key] = ret.clone();
+                }
+            }
+            else
+                /* otherwise, if the proto /was/ found in the cache, return a copy of it */
+                ret = ret.clone();
+        }
+
+        /* If the prototype was found/created successfully ... */
+        if (ret != undefined)
+            /* ... and @ui was provided */
+            if (ui != undefined)
+                /* ... return @ui, but replace the CSS selectors it contains with the elements they select */
+                ret = fillObj(ui, ret);
+
+        return ret;
+    }
+});
+})(jQuery);
+/*
+* jQuery Mobile Framework : scrollview plugin
+* Copyright (c) 2010 Adobe Systems Incorporated - Kin Blas (jblas@adobe.com)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* Note: Code is in draft form and is subject to change
+* Modified by Koeun Choi <koeun.choi@samsung.com>
+* Modified by Minkyu Kang <mk7.kang@samsung.com>
+*/
+
+(function ( $, window, document, undefined ) {
+
+	function setElementTransform( $ele, x, y, duration ) {
+		var v = "translate(" + x + "," + y + ")",
+			transition;
+
+		if ( !duration || duration === undefined ) {
+			transition = "none";
+		} else {
+			transition =  "-webkit-transform " + duration / 1000 + "s";
+		}
+
+		$ele.css({
+			"-moz-transform": v,
+			"-webkit-transform": v,
+			"-ms-transform": v,
+			"-o-transform": v,
+			"transform": v,
+			"-webkit-transition": transition
+		});
+	}
+
+	function MomentumTracker( options ) {
+		this.options = $.extend( {}, options );
+		this.easing = "easeOutQuad";
+		this.reset();
+	}
+
+	var tstates = {
+		scrolling: 0,
+		overshot:  1,
+		snapback:  2,
+		done:      3
+	};
+
+	function getCurrentTime() {
+		return ( new Date() ).getTime();
+	}
+
+	jQuery.widget( "tizen.scrollview", jQuery.mobile.widget, {
+		options: {
+			fps:               60,    // Frames per second in msecs.
+			direction:         null,  // "x", "y", or null for both.
+
+			scrollDuration:    2000,  // Duration of the scrolling animation in msecs.
+			overshootDuration: 250,   // Duration of the overshoot animation in msecs.
+			snapbackDuration:  500,   // Duration of the snapback animation in msecs.
+
+			moveThreshold:     50,   // User must move this many pixels in any direction to trigger a scroll.
+			moveIntervalThreshold:     150,   // Time between mousemoves must not exceed this threshold.
+
+			scrollMethod:      "translate",  // "translate", "position", "scroll"
+			startEventName:    "scrollstart",
+			updateEventName:   "scrollupdate",
+			stopEventName:     "scrollstop",
+
+			eventType:         $.support.touch ? "touch" : "mouse",
+
+			showScrollBars:    true,
+
+			pagingEnabled:     false,
+			overshootEnable:   false,
+
+			delayedClickSelector: "a,input,textarea,select,button,.ui-btn"
+		},
+
+		_makePositioned: function ( $ele ) {
+			if ( $ele.css("position") === "static" ) {
+				$ele.css( "position", "relative" );
+			}
+		},
+
+		_create: function () {
+			var $page = $('.ui-page'),
+				$child,
+				direction,
+				self = this;
+
+			this._$clip = $( this.element ).addClass("ui-scrollview-clip");
+
+			$child = this._$clip.wrapInner("<div></div>").children();
+
+			this._$view = $child.addClass("ui-scrollview-view");
+
+			if ( this.options.scrollMethod === "translate" ) {
+				if ( this._$view.css("transform") === undefined ) {
+					this.options.scrollMethod = "position";
+				}
+			}
+
+			this._$clip.css( "overflow",
+				this.options.scrollMethod === "scroll" ? "scroll" : "hidden" );
+
+			this._makePositioned( this._$clip );
+
+			/*
+			 * Turn off our faux scrollbars if we are using native scrolling
+			 * to position the view.
+			 */
+			if ( this.options.scrollMethod === "scroll" ) {
+				this.options.showScrollBars = false;
+			}
+
+			/*
+			 * We really don't need this if we are using a translate transformation
+			 * for scrolling. We set it just in case the user wants to switch methods
+			 * on the fly.
+			 */
+			this._makePositioned( this._$view );
+			this._$view.css({ left: 0, top: 0 });
+
+			this._sx = 0;
+			this._sy = 0;
+
+			direction = this.options.direction;
+
+			this._hTracker = ( direction !== "y" ) ?
+					new MomentumTracker( this.options ) : null;
+			this._vTracker = ( direction !== "x" ) ?
+					new MomentumTracker( this.options ) : null;
+
+			this._timerInterval = 1000 / this.options.fps;
+			this._timerID = 0;
+
+			this._timerCB = function () {
+				self._handleMomentumScroll();
+			};
+
+			this._addBehaviors();
+		},
+
+		_startMScroll: function ( speedX, speedY ) {
+			this._stopMScroll();
+			this._showScrollBars();
+
+			var keepGoing = false,
+				duration = this.options.scrollDuration,
+				ht = this._hTracker,
+				vt = this._vTracker,
+				c,
+				v;
+
+			this._$clip.trigger( this.options.startEventName );
+			$( document ).trigger("scrollview_scroll");
+
+			if ( ht ) {
+				c = this._$clip.width();
+				v = this._$view.width();
+				ht.start( this._sx, speedX,
+					duration, (v > c) ? -(v - c) : 0, 0 );
+				keepGoing = !ht.done();
+			}
+
+			if ( vt ) {
+				c = this._$clip.height();
+				v = this._$view.height() +
+					parseFloat( this._$view.css("padding-top") );
+
+				vt.start( this._sy, speedY,
+					duration, (v > c) ? -(v - c) : 0, 0 );
+				keepGoing = keepGoing || !vt.done();
+			}
+
+			if ( keepGoing ) {
+				this._timerID = setTimeout( this._timerCB, this._timerInterval );
+			} else {
+				this._stopMScroll();
+			}
+		},
+
+		_stopMScroll: function () {
+			if ( this._timerID ) {
+				this._$clip.trigger( this.options.stopEventName );
+				clearTimeout( this._timerID );
+			}
+			this._timerID = 0;
+
+			if ( this._vTracker ) {
+				this._vTracker.reset();
+			}
+
+			if ( this._hTracker ) {
+				this._hTracker.reset();
+			}
+
+			this._hideScrollBars();
+		},
+
+		_handleMomentumScroll: function () {
+			var keepGoing = false,
+				v = this._$view,
+				x = 0,
+				y = 0,
+				vt = this._vTracker,
+				ht = this._hTracker;
+
+			if ( vt ) {
+				vt.update( this.options.overshootEnable );
+				y = vt.getPosition();
+				keepGoing = !vt.done();
+			}
+
+			if ( ht ) {
+				ht.update( this.options.overshootEnable );
+				x = ht.getPosition();
+				keepGoing = keepGoing || !ht.done();
+			}
+
+			this._setScrollPosition( x, y );
+			this._$clip.trigger( this.options.updateEventName,
+					[ { x: x, y: y } ] );
+
+			if ( keepGoing ) {
+				this._timerID = setTimeout( this._timerCB, this._timerInterval );
+			} else {
+				this._stopMScroll();
+			}
+		},
+
+		_setCalibration: function ( x, y ) {
+			if ( this.options.overshootEnable ) {
+				this._sx = x;
+				this._sy = y;
+				return;
+			}
+
+			var v = this._$view,
+				c = this._$clip,
+				dirLock = this._directionLock,
+				scroll_height = 0;
+
+			if ( dirLock !== "y" && this._hTracker ) {
+				this._sx = x;
+			}
+
+			if ( dirLock !== "x" && this._vTracker ) {
+				scroll_height = v.height() - c.height() +
+					parseFloat( c.css("padding-top") ) +
+					parseFloat( c.css("padding-bottom") );
+
+				if ( y >= 0 ) {
+					this._sy = 0;
+				} else if ( y < -scroll_height ) {
+					this._sy = -scroll_height;
+				} else {
+					this._sy = y;
+				}
+
+				if ( scroll_height < 0 ) {
+					this._sy = 0;
+				}
+			}
+		},
+
+		_setScrollPosition: function ( x, y, duration ) {
+			this._setCalibration( x, y );
+
+			x = this._sx;
+			y = this._sy;
+
+			var $v = this._$view,
+				sm = this.options.scrollMethod,
+				$vsb = this._$vScrollBar,
+				$hsb = this._$hScrollBar,
+				$sbt;
+
+			switch ( sm ) {
+			case "translate":
+				setElementTransform( $v, x + "px", y + "px", duration );
+				break;
+
+			case "position":
+				$v.css({left: x + "px", top: y + "px"});
+				break;
+
+			case "scroll":
+				this._$clip[0].scrollLeft = -x;
+				this._$clip[0].scrollTop = -y;
+				break;
+			}
+
+			if ( $vsb ) {
+				$sbt = $vsb.find(".ui-scrollbar-thumb");
+
+				if ( sm === "translate" ) {
+					setElementTransform( $sbt, "0px",
+						-y / $v.height() * $sbt.parent().height() + "px",
+						duration );
+				} else {
+					$sbt.css( "top", -y / $v.height() * 100 + "%" );
+				}
+			}
+
+			if ( $hsb ) {
+				$sbt = $hsb.find(".ui-scrollbar-thumb");
+
+				if ( sm === "translate" ) {
+					setElementTransform( $sbt,
+						-x / $v.width() * $sbt.parent().width() + "px", "0px",
+						duration);
+				} else {
+					$sbt.css("left", -x / $v.width() * 100 + "%");
+				}
+			}
+		},
+
+		scrollTo: function ( x, y, duration ) {
+			this._stopMScroll();
+
+			/*
+			 * currently support only animation for translate
+			 * Don't want to use setTimeout algorithm for animation.
+			 */
+			if ( !duration || (duration && this.options.scrollMethod === "translate") ) {
+				return this._setScrollPosition( x, y, duration );
+			}
+
+			// follow jqm default animation when the scrollmethod is not translate.
+
+			x = -x;
+			y = -y;
+
+			var self = this,
+				start = getCurrentTime(),
+				efunc = $.easing.easeOutQuad,
+				sx = this._sx,
+				sy = this._sy,
+				dx = x - sx,
+				dy = y - sy,
+				tfunc;
+
+			tfunc = function () {
+				var elapsed = getCurrentTime() - start,
+				    ec;
+
+				if ( elapsed >= duration ) {
+					self._timerID = 0;
+					self._setScrollPosition( x, y );
+				} else {
+					ec = efunc( elapsed / duration, elapsed, 0, 1, duration );
+
+					self._setScrollPosition( sx + (dx * ec), sy + (dy * ec) );
+					self._timerID = setTimeout( tfunc, self._timerInterval );
+				}
+			};
+
+			this._timerID = setTimeout( tfunc, this._timerInterval );
+		},
+
+		getScrollPosition: function () {
+			return { x: -this._sx, y: -this._sy };
+		},
+
+		_getScrollHierarchy: function () {
+			var svh = [],
+				d;
+
+			this._$clip.parents(".ui-scrollview-clip").each(function () {
+				d = $( this ).jqmData("scrollview");
+				if ( d ) {
+					svh.unshift( d );
+				}
+			});
+			return svh;
+		},
+
+		_getAncestorByDirection: function ( dir ) {
+			var svh = this._getScrollHierarchy(),
+				n = svh.length,
+				sv,
+				svdir;
+
+			while ( 0 < n-- ) {
+				sv = svh[n];
+				svdir = sv.options.direction;
+
+				if (!svdir || svdir === dir) {
+					return sv;
+				}
+			}
+			return null;
+		},
+
+		_handleDragStart: function ( e, ex, ey ) {
+			// Stop any scrolling of elements in our parent hierarcy.
+			$.each( this._getScrollHierarchy(), function (i, sv) {
+				sv._stopMScroll();
+			});
+			this._stopMScroll();
+
+			this._didDrag = false;
+
+			var target = $( e.target ),
+				shouldBlockEvent = 1,
+				c = this._$clip,
+				v = this._$view,
+				cw = 0,
+				vw = 0,
+				ch = 0,
+				vh = 0,
+				svdir = this.options.direction,
+				thumb;
+
+			// should skip the dragging when click the button
+			this._skip_dragging = target.is('.ui-btn-text') ||
+					target.is('.ui-btn-inner');
+
+			if ( this._skip_dragging ) {
+				return;
+			}
+
+			/*
+			 * If we're using mouse events, we need to prevent the default
+			 * behavior to suppress accidental selection of text, etc. We
+			 * can't do this on touch devices because it will disable the
+			 * generation of "click" events.
+			 */
+
+			this._shouldBlockEvent = !( target.is(':input') ||
+					target.parents(':input').length > 0 );
+
+			if ( this._shouldBlockEvent ) {
+				e.preventDefault();
+			}
+
+			this._lastX = ex;
+			this._lastY = ey;
+			this._startY = ey;
+			this._doSnapBackX = false;
+			this._doSnapBackY = false;
+			this._speedX = 0;
+			this._speedY = 0;
+
+			this._directionLock = "";
+
+			if ( this._hTracker ) {
+				cw = parseInt( c.css("width"), 10 );
+				vw = parseInt( v.css("width"), 10 );
+				this._maxX = cw - vw;
+
+				if ( this._maxX > 0 ) {
+					this._maxX = 0;
+				}
+				if ( this._$hScrollBar  && vw ) {
+					thumb = this._$hScrollBar.find(".ui-scrollbar-thumb");
+					thumb.css( "width", (cw >= vw ? "100%" :
+							(Math.floor(cw / vw * 100) || 1) + "%") );
+				}
+			}
+
+			if ( this._vTracker ) {
+				ch = parseInt( c.css("height"), 10 );
+				vh = parseInt( v.css("height"), 10 ) +
+					parseFloat( v.css("padding-top") );
+				this._maxY = ch - vh;
+
+				if ( this._maxY > 0 ) {
+					this._maxY = 0;
+				}
+				if ( this._$vScrollBar && vh ) {
+					thumb = this._$vScrollBar.find(".ui-scrollbar-thumb");
+					thumb.css( "height", (ch >= vh ? "100%" :
+							(Math.floor(ch / vh * 100) || 1) + "%") );
+				}
+			}
+
+			this._pageDelta = 0;
+			this._pageSize = 0;
+			this._pagePos = 0;
+
+			if ( this.options.pagingEnabled && (svdir === "x" || svdir === "y") ) {
+				this._pageSize = (svdir === "x") ? cw : ch;
+				this._pagePos = (svdir === "x") ? this._sx : this._sy;
+				this._pagePos -= this._pagePos % this._pageSize;
+			}
+
+			this._lastMove = 0;
+			this._enableTracking();
+		},
+
+		_propagateDragMove: function ( sv, e, ex, ey, dir ) {
+			this._hideScrollBars();
+			this._disableTracking();
+			sv._handleDragStart( e, ex, ey );
+			sv._directionLock = dir;
+			sv._didDrag = this._didDrag;
+		},
+
+		_handleDragMove: function ( e, ex, ey ) {
+			if ( this._skip_dragging ) {
+				return;
+			}
+
+			if ( !this._dragging ) {
+				return;
+			}
+
+			if ( this._shouldBlockEvent ) {
+				e.preventDefault();
+			}
+
+			var mt = this.options.moveThreshold,
+				v = this._$view,
+				dx = ex - this._lastX,
+				dy = ey - this._lastY,
+				svdir = this.options.direction,
+				dir = null,
+				x,
+				y,
+				sv,
+				scope,
+				newX,
+				newY,
+				dirLock,
+				opos,
+				cpos,
+				delta;
+
+			if ( Math.abs( this._startY - ey ) < mt && !this._didDrag ) {
+				return;
+			}
+
+			this._lastMove = getCurrentTime();
+			if ( !this._directionLock ) {
+				x = Math.abs( dx );
+				y = Math.abs( dy );
+
+				if ( x < mt && y < mt ) {
+					return false;
+				}
+
+				if ( x < y && (x / y) < 0.5 ) {
+					dir = "y";
+				} else if ( x > y && (y / x) < 0.5 ) {
+					dir = "x";
+				}
+
+				if ( svdir && dir && svdir !== dir ) {
+					/*
+					 * This scrollview can't handle the direction the user
+					 * is attempting to scroll. Find an ancestor scrollview
+					 * that can handle the request.
+					 */
+
+					sv = this._getAncestorByDirection( dir );
+					if ( sv ) {
+						this._propagateDragMove( sv, e, ex, ey, dir );
+						return false;
+					}
+				}
+
+				//this._directionLock = svdir ? svdir : (dir ? dir : "none");
+				this._directionLock = svdir || (dir || "none");
+			}
+
+			newX = this._sx;
+			newY = this._sy;
+			dirLock = this._directionLock;
+
+			if ( dirLock !== "y" && this._hTracker ) {
+				x = this._sx;
+				this._speedX = dx;
+				newX = x + dx;
+
+				// Simulate resistance.
+
+				this._doSnapBackX = false;
+
+				scope = (newX > 0 || newX < this._maxX);
+				if ( scope && dirLock === "x" ) {
+					sv = this._getAncestorByDirection("x");
+					if ( sv ) {
+						this._setScrollPosition( newX > 0 ?
+								0 : this._maxX, newY );
+						this._propagateDragMove( sv, e, ex, ey, dir );
+						return false;
+					}
+
+					newX = x + (dx / 2);
+					this._doSnapBackX = true;
+				}
+			}
+
+			if ( dirLock !== "x" && this._vTracker ) {
+				y = this._sy;
+				this._speedY = dy;
+				newY = y + dy;
+
+				// Simulate resistance.
+
+				this._doSnapBackY = false;
+
+				scope = (newY > 0 || newY < this._maxY);
+				if ( scope && dirLock === "y" ) {
+					sv = this._getAncestorByDirection("y");
+					if ( sv ) {
+						this._setScrollPosition( newX,
+								newY > 0 ? 0 : this._maxY );
+						this._propagateDragMove( sv, e, ex, ey, dir );
+						return false;
+					}
+
+					newY = y + (dy / 2);
+					this._doSnapBackY = true;
+				}
+			}
+
+			if ( this.options.overshootEnable === false ) {
+				this._doSnapBackX = false;
+				this._doSnapBackY = false;
+			}
+
+			if ( this.options.pagingEnabled && (svdir === "x" || svdir === "y") ) {
+				if ( this._doSnapBackX || this._doSnapBackY ) {
+					this._pageDelta = 0;
+				} else {
+					opos = this._pagePos;
+					cpos = svdir === "x" ? newX : newY;
+					delta = svdir === "x" ? dx : dy;
+
+					if ( opos > cpos && delta < 0 ) {
+						this._pageDelta = this._pageSize;
+					} else if ( opos < cpos && delta > 0 ) {
+						this._pageDelta = -this._pageSize;
+					} else {
+						this._pageDelta = 0;
+					}
+				}
+			}
+
+			this._didDrag = true;
+			this._lastX = ex;
+			this._lastY = ey;
+
+			this._setScrollPosition( newX, newY );
+
+			this._showScrollBars();
+		},
+
+		_handleDragStop: function ( e ) {
+			if ( this._skip_dragging ) {
+				return;
+			}
+
+			var l = this._lastMove,
+				t = getCurrentTime(),
+				doScroll = (l && (t - l) <= this.options.moveIntervalThreshold),
+				sx = ( this._hTracker && this._speedX && doScroll ) ?
+						this._speedX : ( this._doSnapBackX ? 1 : 0 ),
+				sy = ( this._vTracker && this._speedY && doScroll ) ?
+						this._speedY : ( this._doSnapBackY ? 1 : 0 ),
+				svdir = this.options.direction,
+				x,
+				y;
+
+			if ( this.options.pagingEnabled && (svdir === "x" || svdir === "y") &&
+					!this._doSnapBackX && !this._doSnapBackY ) {
+				x = this._sx;
+				y = this._sy;
+
+				if ( svdir === "x" ) {
+					x = -this._pagePos + this._pageDelta;
+				} else {
+					y = -this._pagePos + this._pageDelta;
+				}
+
+				this.scrollTo( x, y, this.options.snapbackDuration );
+			} else if ( sx || sy ) {
+				this._startMScroll( sx, sy );
+			} else {
+				this._hideScrollBars();
+			}
+
+			this._disableTracking();
+
+			if ( !this._didDrag && this.options.eventType === "touch" ) {
+				$(e.target).closest(this.options.delayedClickSelector).trigger("click");
+			}
+
+			/*
+			 * If a view scrolled, then we need to absorb
+			 * the event so that links etc, underneath our
+			 * cursor/finger don't fire.
+			 */
+
+			return !this._didDrag;
+		},
+
+		_enableTracking: function () {
+			this._dragging = true;
+		},
+
+		_disableTracking: function () {
+			this._dragging = false;
+		},
+
+		_showScrollBars: function () {
+			var vclass = "ui-scrollbar-visible";
+			if ( this._$vScrollBar ) {
+				this._$vScrollBar.addClass( vclass );
+			}
+			if ( this._$hScrollBar ) {
+				this._$hScrollBar.addClass( vclass );
+			}
+		},
+
+		_hideScrollBars: function () {
+			var vclass = "ui-scrollbar-visible";
+			if ( this._$vScrollBar ) {
+				this._$vScrollBar.removeClass( vclass );
+			}
+			if ( this._$hScrollBar ) {
+				this._$hScrollBar.removeClass( vclass );
+			}
+		},
+
+		_addBehaviors: function () {
+			var self = this,
+				$c = this._$clip,
+				prefix = "<div class=\"ui-scrollbar ui-scrollbar-",
+				suffix = "\"><div class=\"ui-scrollbar-track\"><div class=\"ui-scrollbar-thumb\"></div></div></div>";
+
+			if ( this.options.eventType === "mouse" ) {
+				this._dragEvt = "mousedown mousemove mouseup click";
+				this._dragCB = function ( e ) {
+					switch ( e.type ) {
+					case "mousedown":
+						return self._handleDragStart( e,
+								e.clientX, e.clientY );
+
+					case "mousemove":
+						return self._handleDragMove( e,
+								e.clientX, e.clientY );
+
+					case "mouseup":
+						return self._handleDragStop( e );
+
+					case "click":
+						return !self._didDrag;
+					}
+				};
+			} else {
+				this._dragEvt = "touchstart touchmove touchend vclick";
+				this._dragCB = function ( e ) {
+					var t;
+
+					switch ( e.type ) {
+					case "touchstart":
+						t = e.originalEvent.targetTouches[0];
+						return self._handleDragStart( e,
+								t.pageX, t.pageY );
+
+					case "touchmove":
+						t = e.originalEvent.targetTouches[0];
+						return self._handleDragMove( e,
+								t.pageX, t.pageY );
+
+					case "touchend":
+						return self._handleDragStop( e );
+
+					case "vclick":
+						return !self._didDrag;
+					}
+				};
+			}
+
+			this._$view.bind( this._dragEvt, this._dragCB );
+
+			if ( this.options.showScrollBars ) {
+				if ( this._vTracker ) {
+					$c.append( prefix + "y" + suffix );
+					this._$vScrollBar = $c.children(".ui-scrollbar-y");
+				}
+				if ( this._hTracker ) {
+					$c.append( prefix + "x" + suffix );
+					this._$hScrollBar = $c.children(".ui-scrollbar-x");
+				}
+			}
+		}
+	});
+
+	$.extend( MomentumTracker.prototype, {
+		start: function ( pos, speed, duration, minPos, maxPos ) {
+			var tstate = (pos < minPos || pos > maxPos) ?
+					tstates.snapback : tstates.scrolling,
+				pos_temp;
+
+			this.state = (speed !== 0) ? tstate : tstates.done;
+			this.pos = pos;
+			this.speed = speed;
+			this.duration = (this.state === tstates.snapback) ?
+					this.options.snapbackDuration : duration;
+			this.minPos = minPos;
+			this.maxPos = maxPos;
+
+			this.fromPos = (this.state === tstates.snapback) ? this.pos : 0;
+			pos_temp = (this.pos < this.minPos) ? this.minPos : this.maxPos;
+			this.toPos = (this.state === tstates.snapback) ? pos_temp : 0;
+
+			this.startTime = getCurrentTime();
+		},
+
+		reset: function () {
+			this.state = tstates.done;
+			this.pos = 0;
+			this.speed = 0;
+			this.minPos = 0;
+			this.maxPos = 0;
+			this.duration = 0;
+		},
+
+		update: function ( overshootEnable ) {
+			var state = this.state,
+				cur_time = getCurrentTime(),
+				duration = this.duration,
+				elapsed =  cur_time - this.startTime,
+				dx,
+				x,
+				didOverShoot;
+
+			if ( state === tstates.done ) {
+				return this.pos;
+			}
+
+			elapsed = elapsed > duration ? duration : elapsed;
+
+			if ( state === tstates.scrolling || state === tstates.overshot ) {
+				dx = this.speed *
+					(1 - $.easing[this.easing]( elapsed / duration,
+								elapsed, 0, 1, duration ));
+
+				x = this.pos + dx;
+
+				didOverShoot = (state === tstates.scrolling) &&
+					(x < this.minPos || x > this.maxPos);
+
+				if ( didOverShoot ) {
+					x = (x < this.minPos) ? this.minPos : this.maxPos;
+				}
+
+				this.pos = x;
+
+				if ( state === tstates.overshot ) {
+					if ( elapsed >= duration ) {
+						this.state = tstates.snapback;
+						this.fromPos = this.pos;
+						this.toPos = (x < this.minPos) ?
+								this.minPos : this.maxPos;
+						this.duration = this.options.snapbackDuration;
+						this.startTime = cur_time;
+						elapsed = 0;
+					}
+				} else if ( state === tstates.scrolling ) {
+					if ( didOverShoot && overshootEnable ) {
+						this.state = tstates.overshot;
+						this.speed = dx / 2;
+						this.duration = this.options.overshootDuration;
+						this.startTime = cur_time;
+					} else if ( elapsed >= duration ) {
+						this.state = tstates.done;
+					}
+				}
+			} else if ( state === tstates.snapback ) {
+				if ( elapsed >= duration ) {
+					this.pos = this.toPos;
+					this.state = tstates.done;
+				} else {
+					this.pos = this.fromPos + ((this.toPos - this.fromPos) *
+						$.easing[this.easing]( elapsed / duration,
+							elapsed, 0, 1, duration ));
+				}
+			}
+
+			return this.pos;
+		},
+
+		done: function () {
+			return this.state === tstates.done;
+		},
+
+		getPosition: function () {
+			return this.pos;
+		}
+	});
+
+	function resizePageContentHeight( page ) {
+		var $page = $( page ),
+			$content = $page.children(".ui-content"),
+			hh = $page.children(".ui-header").outerHeight() || 0,
+			fh = $page.children(".ui-footer").outerHeight() || 0,
+			pt = parseFloat( $content.css("padding-top") ),
+			pb = parseFloat( $content.css("padding-bottom") ),
+			wh = $(window).height();
+
+		$content.height( wh - (hh + fh) - (pt + pb) );
+	}
+
+	// auto-init scrollview and scrolllistview widgets
+	$( document ).bind( 'pagecreate create', function ( e ) {
+		var $page = $( e.target ),
+			scroll = $page.find(".ui-content").attr("data-scroll");
+
+		if ( scroll === "none" ) {
+			return;
+		}
+
+		if ( $.support.scrollview === undefined ) {
+			// set as default value
+			$.support.scrollview = true;
+		}
+
+		if ( $.support.scrollview === true && scroll === undefined ) {
+			$page.find(".ui-content").attr( "data-scroll", "y" );
+		}
+
+		$page.find(":jqmData(scroll):not(.ui-scrollview-clip)").each( function () {
+			if ( $( this ).hasClass("ui-scrolllistview") ) {
+				$( this ).scrolllistview();
+			} else {
+				var st = $( this ).jqmData("scroll"),
+					paging = st && (st.search(/^[xy]p$/) !== -1),
+					dir = st && (st.search(/^[xy]/) !== -1) ? st.charAt(0) : null,
+					opts;
+
+				opts = {
+					direction: dir || undefined,
+					paging: paging || undefined,
+					scrollMethod: $( this ).jqmData("scroll-method") || undefined
+				};
+
+				$( this ).scrollview( opts );
+			}
+		});
+	});
+
+	$( document ).bind( 'pageshow', function ( e ) {
+		var $page = $( e.target ),
+			scroll = $page.find(".ui-content").attr("data-scroll");
+
+		if ( scroll === "y" ) {
+			setTimeout( function () {
+				resizePageContentHeight( e.target );
+			}, 100);
+		}
+	});
+
+	$( window ).bind( "orientationchange", function ( e ) {
+		resizePageContentHeight( $(".ui-page") );
+	});
+
+}( jQuery, window, document ) );
+/*!
+ * jQuery Templates Plugin 1.0.0pre
+ * http://github.com/jquery/jquery-tmpl
+ * Requires jQuery 1.4.2
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ */
+(function( jQuery, undefined ){
+	var oldManip = jQuery.fn.domManip, tmplItmAtt = "_tmplitem", htmlExpr = /^[^<]*(<[\w\W]+>)[^>]*$|\{\{\! /,
+		newTmplItems = {}, wrappedItems = {}, appendToTmplItems, topTmplItem = { key: 0, data: {} }, itemKey = 0, cloneIndex = 0, stack = [];
+
+	function newTmplItem( options, parentItem, fn, data ) {
+		// Returns a template item data structure for a new rendered instance of a template (a 'template item').
+		// The content field is a hierarchical array of strings and nested items (to be
+		// removed and replaced by nodes field of dom elements, once inserted in DOM).
+		var newItem = {
+			data: data || (data === 0 || data === false) ? data : (parentItem ? parentItem.data : {}),
+			_wrap: parentItem ? parentItem._wrap : null,
+			tmpl: null,
+			parent: parentItem || null,
+			nodes: [],
+			calls: tiCalls,
+			nest: tiNest,
+			wrap: tiWrap,
+			html: tiHtml,
+			update: tiUpdate
+		};
+		if ( options ) {
+			jQuery.extend( newItem, options, { nodes: [], parent: parentItem });
+		}
+		if ( fn ) {
+			// Build the hierarchical content to be used during insertion into DOM
+			newItem.tmpl = fn;
+			newItem._ctnt = newItem._ctnt || newItem.tmpl( jQuery, newItem );
+			newItem.key = ++itemKey;
+			// Keep track of new template item, until it is stored as jQuery Data on DOM element
+			(stack.length ? wrappedItems : newTmplItems)[itemKey] = newItem;
+		}
+		return newItem;
+	}
+
+	// Override appendTo etc., in order to provide support for targeting multiple elements. (This code would disappear if integrated in jquery core).
+	jQuery.each({
+		appendTo: "append",
+		prependTo: "prepend",
+		insertBefore: "before",
+		insertAfter: "after",
+		replaceAll: "replaceWith"
+	}, function( name, original ) {
+		jQuery.fn[ name ] = function( selector ) {
+			var ret = [], insert = jQuery( selector ), elems, i, l, tmplItems,
+				parent = this.length === 1 && this[0].parentNode;
+
+			appendToTmplItems = newTmplItems || {};
+			if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+				insert[ original ]( this[0] );
+				ret = this;
+			} else {
+				for ( i = 0, l = insert.length; i < l; i++ ) {
+					cloneIndex = i;
+					elems = (i > 0 ? this.clone(true) : this).get();
+					jQuery( insert[i] )[ original ]( elems );
+					ret = ret.concat( elems );
+				}
+				cloneIndex = 0;
+				ret = this.pushStack( ret, name, insert.selector );
+			}
+			tmplItems = appendToTmplItems;
+			appendToTmplItems = null;
+			jQuery.tmpl.complete( tmplItems );
+			return ret;
+		};
+	});
+
+	jQuery.fn.extend({
+		// Use first wrapped element as template markup.
+		// Return wrapped set of template items, obtained by rendering template against data.
+		tmpl: function( data, options, parentItem ) {
+			return jQuery.tmpl( this[0], data, options, parentItem );
+		},
+
+		// Find which rendered template item the first wrapped DOM element belongs to
+		tmplItem: function() {
+			return jQuery.tmplItem( this[0] );
+		},
+
+		// Consider the first wrapped element as a template declaration, and get the compiled template or store it as a named template.
+		template: function( name ) {
+			return jQuery.template( name, this[0] );
+		},
+
+		domManip: function( args, table, callback, options ) {
+			if ( args[0] && jQuery.isArray( args[0] )) {
+				var dmArgs = jQuery.makeArray( arguments ), elems = args[0], elemsLength = elems.length, i = 0, tmplItem;
+				while ( i < elemsLength && !(tmplItem = jQuery.data( elems[i++], "tmplItem" ))) {}
+				if ( tmplItem && cloneIndex ) {
+					dmArgs[2] = function( fragClone ) {
+						// Handler called by oldManip when rendered template has been inserted into DOM.
+						jQuery.tmpl.afterManip( this, fragClone, callback );
+					};
+				}
+				oldManip.apply( this, dmArgs );
+			} else {
+				oldManip.apply( this, arguments );
+			}
+			cloneIndex = 0;
+			if ( !appendToTmplItems ) {
+				jQuery.tmpl.complete( newTmplItems );
+			}
+			return this;
+		}
+	});
+
+	jQuery.extend({
+		// Return wrapped set of template items, obtained by rendering template against data.
+		tmpl: function( tmpl, data, options, parentItem ) {
+			var ret, topLevel = !parentItem;
+			if ( topLevel ) {
+				// This is a top-level tmpl call (not from a nested template using {{tmpl}})
+				parentItem = topTmplItem;
+				tmpl = jQuery.template[tmpl] || jQuery.template( null, tmpl );
+				wrappedItems = {}; // Any wrapped items will be rebuilt, since this is top level
+			} else if ( !tmpl ) {
+				// The template item is already associated with DOM - this is a refresh.
+				// Re-evaluate rendered template for the parentItem
+				tmpl = parentItem.tmpl;
+				newTmplItems[parentItem.key] = parentItem;
+				parentItem.nodes = [];
+				if ( parentItem.wrapped ) {
+					updateWrapped( parentItem, parentItem.wrapped );
+				}
+				// Rebuild, without creating a new template item
+				return jQuery( build( parentItem, null, parentItem.tmpl( jQuery, parentItem ) ));
+			}
+			if ( !tmpl ) {
+				return []; // Could throw...
+			}
+			if ( typeof data === "function" ) {
+				data = data.call( parentItem || {} );
+			}
+			if ( options && options.wrapped ) {
+				updateWrapped( options, options.wrapped );
+			}
+			ret = jQuery.isArray( data ) ?
+				jQuery.map( data, function( dataItem ) {
+					return dataItem ? newTmplItem( options, parentItem, tmpl, dataItem ) : null;
+				}) :
+				[ newTmplItem( options, parentItem, tmpl, data ) ];
+			return topLevel ? jQuery( build( parentItem, null, ret ) ) : ret;
+		},
+
+		// Return rendered template item for an element.
+		tmplItem: function( elem ) {
+			var tmplItem;
+			if ( elem instanceof jQuery ) {
+				elem = elem[0];
+			}
+			while ( elem && elem.nodeType === 1 && !(tmplItem = jQuery.data( elem, "tmplItem" )) && (elem = elem.parentNode) ) {}
+			return tmplItem || topTmplItem;
+		},
+
+		// Set:
+		// Use $.template( name, tmpl ) to cache a named template,
+		// where tmpl is a template string, a script element or a jQuery instance wrapping a script element, etc.
+		// Use $( "selector" ).template( name ) to provide access by name to a script block template declaration.
+
+		// Get:
+		// Use $.template( name ) to access a cached template.
+		// Also $( selectorToScriptBlock ).template(), or $.template( null, templateString )
+		// will return the compiled template, without adding a name reference.
+		// If templateString includes at least one HTML tag, $.template( templateString ) is equivalent
+		// to $.template( null, templateString )
+		template: function( name, tmpl ) {
+			if (tmpl) {
+				// Compile template and associate with name
+				if ( typeof tmpl === "string" ) {
+					// This is an HTML string being passed directly in.
+					tmpl = buildTmplFn( tmpl );
+				} else if ( tmpl instanceof jQuery ) {
+					tmpl = tmpl[0] || {};
+				}
+				if ( tmpl.nodeType ) {
+					// If this is a template block, use cached copy, or generate tmpl function and cache.
+					tmpl = jQuery.data( tmpl, "tmpl" ) || jQuery.data( tmpl, "tmpl", buildTmplFn( tmpl.innerHTML ));
+					// Issue: In IE, if the container element is not a script block, the innerHTML will remove quotes from attribute values whenever the value does not include white space.
+					// This means that foo="${x}" will not work if the value of x includes white space: foo="${x}" -> foo=value of x.
+					// To correct this, include space in tag: foo="${ x }" -> foo="value of x"
+				}
+				return typeof name === "string" ? (jQuery.template[name] = tmpl) : tmpl;
+			}
+			// Return named compiled template
+			return name ? (typeof name !== "string" ? jQuery.template( null, name ):
+				(jQuery.template[name] ||
+					// If not in map, and not containing at least on HTML tag, treat as a selector.
+					// (If integrated with core, use quickExpr.exec)
+					jQuery.template( null, htmlExpr.test( name ) ? name : jQuery( name )))) : null;
+		},
+
+		encode: function( text ) {
+			// Do HTML encoding replacing < > & and ' and " by corresponding entities.
+			return ("" + text).split("<").join("&lt;").split(">").join("&gt;").split('"').join("&#34;").split("'").join("&#39;");
+		}
+	});
+
+	jQuery.extend( jQuery.tmpl, {
+		tag: {
+			"tmpl": {
+				_default: { $2: "null" },
+				open: "if($notnull_1){__=__.concat($item.nest($1,$2));}"
+				// tmpl target parameter can be of type function, so use $1, not $1a (so not auto detection of functions)
+				// This means that {{tmpl foo}} treats foo as a template (which IS a function).
+				// Explicit parens can be used if foo is a function that returns a template: {{tmpl foo()}}.
+			},
+			"wrap": {
+				_default: { $2: "null" },
+				open: "$item.calls(__,$1,$2);__=[];",
+				close: "call=$item.calls();__=call._.concat($item.wrap(call,__));"
+			},
+			"each": {
+				_default: { $2: "$index, $value" },
+				open: "if($notnull_1){$.each($1a,function($2){with(this){",
+				close: "}});}"
+			},
+			"if": {
+				open: "if(($notnull_1) && $1a){",
+				close: "}"
+			},
+			"else": {
+				_default: { $1: "true" },
+				open: "}else if(($notnull_1) && $1a){"
+			},
+			"html": {
+				// Unecoded expression evaluation.
+				open: "if($notnull_1){__.push($1a);}"
+			},
+			"=": {
+				// Encoded expression evaluation. Abbreviated form is ${}.
+				_default: { $1: "$data" },
+				open: "if($notnull_1){__.push($.encode($1a));}"
+			},
+			"!": {
+				// Comment tag. Skipped by parser
+				open: ""
+			}
+		},
+
+		// This stub can be overridden, e.g. in jquery.tmplPlus for providing rendered events
+		complete: function( items ) {
+			newTmplItems = {};
+		},
+
+		// Call this from code which overrides domManip, or equivalent
+		// Manage cloning/storing template items etc.
+		afterManip: function afterManip( elem, fragClone, callback ) {
+			// Provides cloned fragment ready for fixup prior to and after insertion into DOM
+			var content = fragClone.nodeType === 11 ?
+				jQuery.makeArray(fragClone.childNodes) :
+				fragClone.nodeType === 1 ? [fragClone] : [];
+
+			// Return fragment to original caller (e.g. append) for DOM insertion
+			callback.call( elem, fragClone );
+
+			// Fragment has been inserted:- Add inserted nodes to tmplItem data structure. Replace inserted element annotations by jQuery.data.
+			storeTmplItems( content );
+			cloneIndex++;
+		}
+	});
+
+	//========================== Private helper functions, used by code above ==========================
+
+	function build( tmplItem, nested, content ) {
+		// Convert hierarchical content into flat string array
+		// and finally return array of fragments ready for DOM insertion
+		var frag, ret = content ? jQuery.map( content, function( item ) {
+			return (typeof item === "string") ?
+				// Insert template item annotations, to be converted to jQuery.data( "tmplItem" ) when elems are inserted into DOM.
+				(tmplItem.key ? item.replace( /(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g, "$1 " + tmplItmAtt + "=\"" + tmplItem.key + "\" $2" ) : item) :
+				// This is a child template item. Build nested template.
+				build( item, tmplItem, item._ctnt );
+		}) :
+		// If content is not defined, insert tmplItem directly. Not a template item. May be a string, or a string array, e.g. from {{html $item.html()}}.
+		tmplItem;
+		if ( nested ) {
+			return ret;
+		}
+
+		// top-level template
+		ret = ret.join("");
+
+		// Support templates which have initial or final text nodes, or consist only of text
+		// Also support HTML entities within the HTML markup.
+		ret.replace( /^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/, function( all, before, middle, after) {
+			frag = jQuery( middle ).get();
+
+			storeTmplItems( frag );
+			if ( before ) {
+				frag = unencode( before ).concat(frag);
+			}
+			if ( after ) {
+				frag = frag.concat(unencode( after ));
+			}
+		});
+		return frag ? frag : unencode( ret );
+	}
+
+	function unencode( text ) {
+		// Use createElement, since createTextNode will not render HTML entities correctly
+		var el = document.createElement( "div" );
+		el.innerHTML = text;
+		return jQuery.makeArray(el.childNodes);
+	}
+
+	// Generate a reusable function that will serve to render a template against data
+	function buildTmplFn( markup ) {
+		return new Function("jQuery","$item",
+			// Use the variable __ to hold a string array while building the compiled template. (See https://github.com/jquery/jquery-tmpl/issues#issue/10).
+			"var $=jQuery,call,__=[],$data=$item.data;" +
+
+			// Introduce the data as local variables using with(){}
+			"with($data){__.push('" +
+
+			// Convert the template into pure JavaScript
+			jQuery.trim(markup)
+				.replace( /([\\'])/g, "\\$1" )
+				.replace( /[\r\t\n]/g, " " )
+				.replace( /\$\{([^\}]*)\}/g, "{{= $1}}" )
+				.replace( /\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g,
+				function( all, slash, type, fnargs, target, parens, args ) {
+					var tag = jQuery.tmpl.tag[ type ], def, expr, exprAutoFnDetect;
+					if ( !tag ) {
+						throw "Unknown template tag: " + type;
+					}
+					def = tag._default || [];
+					if ( parens && !/\w$/.test(target)) {
+						target += parens;
+						parens = "";
+					}
+					if ( target ) {
+						target = unescape( target );
+						args = args ? ("," + unescape( args ) + ")") : (parens ? ")" : "");
+						// Support for target being things like a.toLowerCase();
+						// In that case don't call with template item as 'this' pointer. Just evaluate...
+						expr = parens ? (target.indexOf(".") > -1 ? target + unescape( parens ) : ("(" + target + ").call($item" + args)) : target;
+						exprAutoFnDetect = parens ? expr : "(typeof(" + target + ")==='function'?(" + target + ").call($item):(" + target + "))";
+					} else {
+						exprAutoFnDetect = expr = def.$1 || "null";
+					}
+					fnargs = unescape( fnargs );
+					return "');" +
+						tag[ slash ? "close" : "open" ]
+							.split( "$notnull_1" ).join( target ? "typeof(" + target + ")!=='undefined' && (" + target + ")!=null" : "true" )
+							.split( "$1a" ).join( exprAutoFnDetect )
+							.split( "$1" ).join( expr )
+							.split( "$2" ).join( fnargs || def.$2 || "" ) +
+						"__.push('";
+				}) +
+			"');}return __;"
+		);
+	}
+	function updateWrapped( options, wrapped ) {
+		// Build the wrapped content.
+		options._wrap = build( options, true,
+			// Suport imperative scenario in which options.wrapped can be set to a selector or an HTML string.
+			jQuery.isArray( wrapped ) ? wrapped : [htmlExpr.test( wrapped ) ? wrapped : jQuery( wrapped ).html()]
+		).join("");
+	}
+
+	function unescape( args ) {
+		return args ? args.replace( /\\'/g, "'").replace(/\\\\/g, "\\" ) : null;
+	}
+	function outerHtml( elem ) {
+		var div = document.createElement("div");
+		div.appendChild( elem.cloneNode(true) );
+		return div.innerHTML;
+	}
+
+	// Store template items in jQuery.data(), ensuring a unique tmplItem data data structure for each rendered template instance.
+	function storeTmplItems( content ) {
+		var keySuffix = "_" + cloneIndex, elem, elems, newClonedItems = {}, i, l, m;
+		for ( i = 0, l = content.length; i < l; i++ ) {
+			if ( (elem = content[i]).nodeType !== 1 ) {
+				continue;
+			}
+			elems = elem.getElementsByTagName("*");
+			for ( m = elems.length - 1; m >= 0; m-- ) {
+				processItemKey( elems[m] );
+			}
+			processItemKey( elem );
+		}
+		function processItemKey( el ) {
+			var pntKey, pntNode = el, pntItem, tmplItem, key;
+			// Ensure that each rendered template inserted into the DOM has its own template item,
+			if ( (key = el.getAttribute( tmplItmAtt ))) {
+				while ( pntNode.parentNode && (pntNode = pntNode.parentNode).nodeType === 1 && !(pntKey = pntNode.getAttribute( tmplItmAtt ))) { }
+				if ( pntKey !== key ) {
+					// The next ancestor with a _tmplitem expando is on a different key than this one.
+					// So this is a top-level element within this template item
+					// Set pntNode to the key of the parentNode, or to 0 if pntNode.parentNode is null, or pntNode is a fragment.
+					pntNode = pntNode.parentNode ? (pntNode.nodeType === 11 ? 0 : (pntNode.getAttribute( tmplItmAtt ) || 0)) : 0;
+					if ( !(tmplItem = newTmplItems[key]) ) {
+						// The item is for wrapped content, and was copied from the temporary parent wrappedItem.
+						tmplItem = wrappedItems[key];
+						tmplItem = newTmplItem( tmplItem, newTmplItems[pntNode]||wrappedItems[pntNode] );
+						tmplItem.key = ++itemKey;
+						newTmplItems[itemKey] = tmplItem;
+					}
+					if ( cloneIndex ) {
+						cloneTmplItem( key );
+					}
+				}
+				el.removeAttribute( tmplItmAtt );
+			} else if ( cloneIndex && (tmplItem = jQuery.data( el, "tmplItem" )) ) {
+				// This was a rendered element, cloned during append or appendTo etc.
+				// TmplItem stored in jQuery data has already been cloned in cloneCopyEvent. We must replace it with a fresh cloned tmplItem.
+				cloneTmplItem( tmplItem.key );
+				newTmplItems[tmplItem.key] = tmplItem;
+				pntNode = jQuery.data( el.parentNode, "tmplItem" );
+				pntNode = pntNode ? pntNode.key : 0;
+			}
+			if ( tmplItem ) {
+				pntItem = tmplItem;
+				// Find the template item of the parent element.
+				// (Using !=, not !==, since pntItem.key is number, and pntNode may be a string)
+				while ( pntItem && pntItem.key != pntNode ) {
+					// Add this element as a top-level node for this rendered template item, as well as for any
+					// ancestor items between this item and the item of its parent element
+					pntItem.nodes.push( el );
+					pntItem = pntItem.parent;
+				}
+				// Delete content built during rendering - reduce API surface area and memory use, and avoid exposing of stale data after rendering...
+				delete tmplItem._ctnt;
+				delete tmplItem._wrap;
+				// Store template item as jQuery data on the element
+				jQuery.data( el, "tmplItem", tmplItem );
+			}
+			function cloneTmplItem( key ) {
+				key = key + keySuffix;
+				tmplItem = newClonedItems[key] =
+					(newClonedItems[key] || newTmplItem( tmplItem, newTmplItems[tmplItem.parent.key + keySuffix] || tmplItem.parent ));
+			}
+		}
+	}
+
+	//---- Helper functions for template item ----
+
+	function tiCalls( content, tmpl, data, options ) {
+		if ( !content ) {
+			return stack.pop();
+		}
+		stack.push({ _: content, tmpl: tmpl, item:this, data: data, options: options });
+	}
+
+	function tiNest( tmpl, data, options ) {
+		// nested template, using {{tmpl}} tag
+		return jQuery.tmpl( jQuery.template( tmpl ), data, options, this );
+	}
+
+	function tiWrap( call, wrapped ) {
+		// nested template, using {{wrap}} tag
+		var options = call.options || {};
+		options.wrapped = wrapped;
+		// Apply the template, which may incorporate wrapped content,
+		return jQuery.tmpl( jQuery.template( call.tmpl ), call.data, options, call.item );
+	}
+
+	function tiHtml( filter, textOnly ) {
+		var wrapped = this._wrap;
+		return jQuery.map(
+			jQuery( jQuery.isArray( wrapped ) ? wrapped.join("") : wrapped ).filter( filter || "*" ),
+			function(e) {
+				return textOnly ?
+					e.innerText || e.textContent :
+					e.outerHTML || outerHtml(e);
+			});
+	}
+
+	function tiUpdate() {
+		var coll = this.nodes;
+		jQuery.tmpl( null, null, null, this).insertBefore( coll[0] );
+		jQuery( coll ).remove();
+	}
+})( jQuery );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * jQuery Mobile Framework : "controlbar" plugin
+ * Copyright (c) jQuery Project
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ * Authors: Jinhyuk Jun <jinhyuk.jun@samsung.com>
+*/
+
+/**
+ *  Controlbar can be created using data-role = "controlbar" inside footer 
+ *  Framework determine which controlbar will display with controlbar attribute
+ *
+ * Attributes:
+ *
+ *     data-style : determine which controlbar will use ( tabbar / toolbar )
+ *                    tabbar do not have back button, toolbar has back button 
+ *
+ * Examples:
+ *         
+ *     HTML markup for creating tabbar: ( 2 ~ 5 li item available )
+ *     icon can be changed data-icon attribute
+ *         <div data-role="footer"data-position ="fixed">
+ *              <div data-role="controlbar" data-style="tabbar" >
+ *                     <ul>
+ *                            <li><a href="#" data-icon="ctrlbar-menu" class="ui-btn-active">Menu</a></li>
+ *                            <li><a href="#" data-icon="ctrlbar-save" >Save</a></li>
+ *                            <li><a href="#" data-icon="ctrlbar-share" >Share</a></li>
+ *                     </ul>
+ *             </div>
+ *      </div>
+ *
+ *     HTML markup for creating toolbar: ( 2 ~ 5 li item available )
+ *     icon can be changed data-icon attribute
+ *         <div data-role="footer" data-position ="fixed">
+ *              <div data-role="controlbar" data-style="toolbar" >
+ *                     <ul>
+ *                            <li><a href="#" data-icon="ctrlbar-menu" class="ui-btn-active">Menu</a></li>
+ *                            <li><a href="#" data-icon="ctrlbar-save" >Save</a></li>
+ *                            <li><a href="#" data-icon="ctrlbar-share" >Share</a></li>
+ *                     </ul>
+ *             </div>
+ *      </div>
+*/
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.controlbar", $.mobile.widget, {
+		options: {
+			iconpos: "top",
+			grid: null,
+			initSelector: ":jqmData(role='controlbar')"
+		},
+
+		_create: function () {
+
+			var $controlbar = this.element,
+				$navbtns = $controlbar.find( "a" ),
+				iconpos = $navbtns.filter( ":jqmData(icon)" ).length ?
+										this.options.iconpos : undefined,
+				theme = $.mobile.listview.prototype.options.theme,	/* Get current theme */
+				style = $controlbar.attr( "data-style" );
+
+			if ( style === "left" || style === "right" ) {
+				$controlbar
+					.parents( ".ui-content" )
+					.css( 'padding', '0' );
+			} else {
+				$controlbar
+					.addClass( "ui-navbar" )
+					.attr( "role", "navigation" )
+					.find( "ul" )
+						.grid( { grid: this.options.grid } );
+			}
+
+			if ( !iconpos ) {
+				$controlbar.addClass( "ui-navbar-noicons" );
+			}
+
+			$navbtns.buttonMarkup({
+				corners:	false,
+				shadow:		false,
+				iconpos:	iconpos
+			});
+
+			$controlbar.delegate( "a", "vclick", function ( event ) {
+				$navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass );
+				$( this ).addClass( $.mobile.activeBtnClass );
+			});
+
+			if ( style === "tabbar" || style === "toolbar" ) {
+				$controlbar
+					.addClass( "ui-controlbar-" + theme )
+					.addClass( "ui-" + style + "-" + theme );
+			} else {
+				$controlbar
+					.addClass( "ui-controlbar-" + style )
+					.end();
+			}
+
+			$( document ).bind( "pagebeforeshow", function ( event, ui ) {
+				var footer_filter = $( event.target ).find( ":jqmData(role='footer')" ),
+					controlbar_filter = footer_filter.find( ":jqmData(role='controlbar')" ),
+					style = controlbar_filter.jqmData( "style" );
+
+				if ( style == "toolbar" || style == "tabbar" ) {
+					/* Need to add text only style */
+					if ( !(controlbar_filter.find(".ui-btn-inner").children().is(".ui-icon")) ) {
+						controlbar_filter.find( ".ui-btn-inner" ).addClass( "ui-navbar-textonly" );
+					} else {
+						if ( controlbar_filter.find( ".ui-btn-text" ).text() == "" ) {
+							controlbar_filter.find( ".ui-btn" ).addClass( "ui-ctrlbar-icononly" );
+						}
+					}
+					footer_filter
+						.css( "position", "fixed" )
+						.css( "height", controlbar_filter.height() )
+						.css( "top", window.innerHeight - footer_filter.height() );
+					if ( style == "toolbar" ) {
+						controlbar_filter
+							.css( "width", window.innerWidth - controlbar_filter.siblings(".ui-btn").width() );
+					}
+				}
+			});
+
+			$( document ).bind( "pageshow", function ( e, ui ) {
+				var controlbar_filter = $( ".ui-page" ).find( ":jqmData(role='footer')" ).eq( 0 ).find( ":jqmData(role='controlbar')" ),
+					element_count = controlbar_filter.find( 'li' ).length;
+
+				if ( controlbar_filter.find(".ui-btn-active").length == 0 ) {
+					controlbar_filter.find( "div" ).css( "left", "0px" );
+				} else {
+					controlbar_filter.find( "div" ).css( "left", controlbar_filter.find( ".ui-btn-active" ).parent( "li" ).index() * controlbar_filter.width() / element_count );
+				}
+
+				/* Increase Content size with dummy <div> because of footer height */
+				if ( controlbar_filter.length != 0 && $( ".ui-page-active" ).find( ".dummy-div" ).length == 0 && $( ".ui-page-active" ).find( ":jqmData(role='footer')" ).find( ":jqmData(role='controlbar')" ).length != 0 ) {
+					$( ".ui-page-active" ).find( ":jqmData(role='content')" ).append( '<div class="dummy-div"></div>' );
+					$( ".ui-page-active" ).find( ".dummy-div" )
+						.css( "width", controlbar_filter.width() )
+						.css( "height", controlbar_filter.height() );
+				}
+			});
+		},
+
+		_setDisabled: function ( value, cnt ) {
+			this.element.find( "li" ).eq( cnt ).attr( "disabled", value );
+			this.element.find( "li" ).eq( cnt ).attr( "aria-disabled", value );
+		},
+
+		disable: function ( cnt ) {
+			this._setDisabled( true, cnt );
+			this.element.find( "li" ).eq( cnt ).addClass( "ui-disabled" );
+		},
+
+		enable: function ( cnt ) {
+			this._setDisabled( false, cnt );
+			this.element.find( "li" ).eq( cnt ).removeClass( "ui-disabled" );
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.controlbar.prototype.options.initSelector, e.target ).controlbar();
+	});
+}( jQuery ) );
+/*global Globalize:false, range:false, regexp:false*/
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Salvatore Iovene <salvatore.iovene@intel.com>
+ *			Daehyon Jung <darrenh.jung@samsung.com>
+ */
+
+/**
+ * datetimepicker is a widget that lets the user select a date and/or a 
+ * time. If you'd prefer use as auto-initialization of form elements, 
+ * use input elements with type=date/time/datetime within form tag
+ * as same as other form elements.
+ * 
+ * HTML Attributes:
+ * 
+ *	data-role: 'datetimepicker'
+ *	data-format: date format string. e.g) "MMM dd yyyy, HH:mm"
+ *	type: 'date', 'datetime', 'time'
+ *	data-val: pre-set value. any date/time string Date.parse() accepts.
+ *
+ * Options:
+ *	type: 'date', 'datetime', 'time'
+ *	format: see data-format in HTML Attributes.
+ *	val: see data-val in HTML Attributes.
+ *
+ * APIs:
+ *	getValue()
+ *		: Get current selected date/time as W3C DTF style string.
+ *	update()
+ *		: Force to update fields.
+ *
+ * Events:
+ *	data-changed: Raised when date/time was changed.
+ *
+ * Examples:
+ *	<ul data-role="listview">
+ *		<li class="ui-li-3-2-2">
+ *			<span class="ui-li-text-main">
+ *				<input type="datetime" name="demo-date" id="demo-date" 
+ *					data-format="MMM dd yyyy hh:mm tt"/>
+ *			</span>
+ *			<span class="ui-li-text-sub">
+ *				Date/Time Picker - <span id="selected-date1"><em>(select a date first)</em></span>
+ *			</span>
+ *		</li>
+ *		<li class="ui-li-3-2-2">
+ *			<span class="ui-li-text-main">
+ *				<input type="date" name="demo-date2" id="demo-date2"/>
+ *			</span>
+ *			<span class="ui-li-text-sub">
+ *				Date Picker  - <span id="selected-date2"><em>(select a date first)</em></span>
+ *			</span>
+ *		</li>
+ *		<li class="ui-li-3-2-2">
+ *			<span class="ui-li-text-main">
+ *				<input type="time" name="demo-date3" id="demo-date3"/>
+ *			</span>
+ *			<span class="ui-li-text-sub">
+ *				Time Picker - <span id="selected-date3"><em>(select a date first)</em></span>
+ *			</span>
+ *		</li>
+ *	</ul>
+ * How to get a return value:
+ * ==========================
+ * Bind to the 'date-changed' event, e.g.:
+ *    $("#myDatetimepicker").bind("date-changed", function(e, date) {
+ *        alert("New date: " + date.toString());
+ *    });
+ */
+
+
+( function ( $, window, undefined ) {
+	$.widget( "tizen.datetimepicker", $.tizen.widgetex, {
+		options: {
+			type: 'datetime', // date, time, datetime applicable
+			format: null,
+			val: null,
+			initSelector: "input[type='date'], input[type='datetime'], input[type='time'], :jqmData(role='datetimepicker')"
+		},
+
+		_makeTwoDigits: function ( val ) {
+			var ret = val.toString(10);
+
+			if ( val < 10 ) {
+				ret = "0" + ret;
+			}
+			return ret;
+		},
+
+		/**
+		 * return W3C DTF string
+		 */
+		getValue: function () {
+			var data = [],
+				item,
+				greg,
+				obj = this,
+				toTimeString,
+				toDateString;
+
+			for ( item in this.data ) {
+				data[item] = this.data[item];
+			}
+
+			if ( this.calendar.convert ) {
+				greg = this.calendar.convert.toGregorian( data.year, data.month, data.day );
+				data.year = greg.getFullYear();
+				data.month = greg.getMonth();
+				data.day = greg.getDate();
+			}
+			obj = this;
+			toTimeString = function timeStr( t ) {
+				return obj._makeTwoDigits( t.hour ) + ':' +
+					obj._makeTwoDigits( t.min ) + ':' +
+					obj._makeTwoDigits( t.sec );
+			};
+
+			toDateString = function dateStr( d ) {
+				return ( ( d.year % 10000 ) + 10000 ).toString().substr(1) + '-' +
+					obj._makeTwoDigits( d.month ) + '-' +
+					obj._makeTwoDigits( d.day );
+			};
+
+			switch ( this.options.type ) {
+			case 'time':
+				return toTimeString( data );
+			case 'date':
+				return toDateString( data );
+			default:
+				return toDateString( data ) + 'T' + toTimeString( data );
+			}
+		},
+
+		_updateField: function ( target, value ) {
+			if ( !target || target.length == 0 ) {
+				return;
+			}
+
+			if ( value == 0 ) {
+				value = "0";
+			}
+
+			var pat = target.jqmData( 'pat' ),
+				hour;
+			switch ( pat ) {
+			case 'H':
+			case 'HH':
+			case 'h':
+			case 'hh':
+				hour = value;
+				if ( pat.charAt(0) == 'h' ) {
+					if ( hour > 12 ) {
+						hour -= 12;
+					} else if ( hour == 0 ) {
+						hour = 12;
+					}
+				}
+				if ( pat.length == 2 ) {
+					hour = this._makeTwoDigits( hour );
+				}
+				target.text( hour );
+				break;
+			case 'm':
+			case 'M':
+			case 'd':
+			case 's':
+				target.text( value );
+				break;
+			case 'mm':
+			case 'dd':
+			case 'MM':
+			case 'ss':
+				target.text( this._makeTwoDigits( value ) );
+				break;
+			case 'MMM':
+				target.text( this.calendar.months.namesAbbr[ value - 1] );
+				break;
+			case 'MMMM':
+				target.text( this.calendar.months.names[ value - 1 ] );
+				break;
+			case 'yy':
+				target.text( this._makeTwoDigits( value % 100 ) );
+				break;
+			case 'yyyy':
+				if ( value < 10 ) {
+					value = '000' + value;
+				} else if ( value < 100 ) {
+					value = '00' + value;
+				} else if ( value < 1000 ) {
+					value = '0' + value;
+				}
+				target.text( value );
+				break;
+			}
+
+		},
+
+		_format: function ( pattern ) {
+			var token = this._parsePattern( pattern ),
+				div = document.createElement('div'),
+				attr = [],
+				pat,
+				tpl,
+				ampm,
+				btn;
+
+			while ( token.length > 0 ) {
+				pat = token.shift();
+				tpl = '<span class="ui-datefield-%1" data-pat="' + pat + '">%2</span>';
+				switch ( pat ) {
+				case 'H': //0 1 2 3 ... 21 22 23
+				case 'HH': //00 01 02 ... 21 22 23
+				case 'h': //0 1 2 3 ... 11 12
+				case 'hh': //00 01 02 ... 11 12
+					$(div).append( tpl.replace('%1', 'hour') );
+					attr.hour = true;
+					break;
+				case 'mm': //00 01 ... 59
+				case 'm': //0 1 2 ... 59
+					$(div).append( tpl.replace('%1', 'min') );
+					attr.min = true;
+					break;
+				case 'ss':
+				case 's':
+					$(div).append( tpl.replace('%1', 'sec') );
+					attr.sec = true;
+					break;
+				case 'd': // day of month 5					
+				case 'dd': // day of month(leading zero) 05
+					$(div).append( tpl.replace('%1', 'day') );
+					attr.day = true;
+					break;
+				case 'M': // Month of year 9
+				case 'MM': // Month of year(leading zero) 09
+				case 'MMM':
+				case 'MMMM':
+					$(div).append( tpl.replace('%1', 'month') );
+					attr.month = true;
+					break;
+				case 'yy':	// year two digit
+				case 'yyyy': // year four digit
+					$(div).append( tpl.replace('%1', 'year') );
+					attr.year = true;
+					break;
+				case 't': //AM / PM indicator(first letter) A, P
+					// add button
+				case 'tt': //AM / PM indicator AM/PM
+					// add button
+					ampm = this.data.hour > 11 ?
+							this.calendar.PM[0] : this.calendar.AM[0];
+					btn = '<a href="#" class="ui-datefield-ampm"' +
+						' data-role="button" data-inline="true">' +
+						ampm + '</a>';
+					$(div).append( btn );
+					attr.ampm = true;
+					break;
+				case 'g':
+				case 'gg':
+					$(div).append( tpl.replace('%1', 'era').replace('%2', this.calendar.eras.name) );
+					break;
+				default : // string or any non-clickable object
+					$(div).append( tpl.replace('%1', 'seperator').replace('%2', pat) );
+					break;
+				}
+			}
+
+			return {
+				attr: attr,
+				html: div
+			};
+		},
+
+		_switchAmPm: function ( obj, owner ) {
+			if ( this.calendar.AM != null ) {
+				if ( this.calendar.AM[0] == $(owner).find('.ui-btn-text').text() ) { // AM to PM
+					this.data.hour += 12;
+					$(owner).find('.ui-btn-text').text( this.calendar.PM[0] );
+				} else {	// PM to AM
+					this.data.hour -= 12;
+					$(owner).find('.ui-btn-text').text( this.calendar.AM[0] );
+				}
+				obj.update();
+			}
+		},
+
+		update: function () {
+			if ( $(this.elem).is('input') ) {
+				this.options.val = this.getValue();
+				this.elem.value = this.options.val;
+			}
+			$(this.elem).trigger('date-changed', this.getValue() );
+		},
+
+		_parsePattern: function ( pattern ) {
+			var regex = /^(\/|\s|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|f|gg|g)|('[\w\W\s]*?')/,
+				token = [],
+				s;
+
+			while ( pattern.length > 0 ) {
+				s = regex.exec( pattern );
+				if ( s ) {
+					pattern = pattern.substr( s[0].length );
+					if ( s[0].charAt(0) == "'" ) {
+						s[0] = s[0].substr( 1, s[0].length - 2 );
+					}
+					token.push( s[0] );
+				} else {
+					token.push( pattern.charAt(0) );
+					pattern = pattern.substr(1);
+				}
+			}
+
+			return token;
+		},
+
+		_create: function () {
+			var input = this.element.get(0),
+				type = $(input).attr("type"),
+				isTime,
+				isDate,
+				val,
+				now,
+				data,
+				local,
+				obj = this,
+				$div;
+
+			if ( type ) {
+				obj.options.type = type;
+			}
+
+			isTime = type.indexOf("time") > -1;
+			isDate = type.indexOf("date") > -1;
+			$.extend( obj, {
+				elem: input,
+				time: isTime,
+				date: isDate,
+				calendar: window.Globalize.culture().calendars.standard,
+				data: {
+					"hour"	: 0,
+					"min"	: 0,
+					"sec"	: 0,
+					"year"	: 0,
+					"month"	: 0,
+					"day"	: 0
+				}
+
+			});
+
+			// init date&time
+			val = this.options.val;
+			if ( val ) {
+				now = new Date( Date.parse( val ) );
+			} else {
+				now = new Date();
+			}
+
+			data = obj.data;
+			if ( isDate ) {
+				if ( obj.calendar.convert ) {
+					local = obj.calendar.convert.fromGregorian( now );
+					data.year = local.year;
+					data.month = local.month + 1;
+					data.day = local.day;
+				} else {
+					data.year = now.getFullYear();
+					data.month = now.getMonth() + 1;
+					data.day = now.getDate();
+				}
+			}
+
+			if ( isTime ) {
+				data.hour = now.getHours();
+				data.min = now.getMinutes();
+				data.sec = now.getSeconds();
+			}
+
+			$(input).css('display', 'none');
+			$div = $(document.createElement('div'));
+			$div.addClass('ui-datefield');
+			$(input).after( $div );
+			this._initField( this.options.type, $div );
+			$div.trigger('create');
+
+			$div.bind('vclick', function ( e ) {
+				obj._showDataSelector( obj, this, e.target );
+			});
+
+			$div.find('.ui-datefield-ampm').bind( 'vclick', function ( e ) {
+				obj._switchAmPm( obj, this );
+			});
+		},
+
+		_populateDataSelector: function ( field, pat, obj ) {
+			var values,
+				numItems,
+				current,
+				data,
+				range = window.range,
+				local,
+				yearlb,
+				yearhb,
+				day;
+
+
+			switch ( field ) {
+			case 'hour':
+				if ( pat == 'H' ) {
+					// twentyfour
+					values = range( 0, 23 );
+					data = range( 0, 23 );
+					current = obj.data.hour;
+				} else {
+					values = range( 1, 12 );
+					current = obj.data.hour - 1;//11
+					if ( current >= 11 ) {
+						current = current - 12;
+						data = range( 13, 23 );
+						data.push( 12 ); // consider 12:00 am as 00:00
+					} else {
+						data = range( 1, 11 );
+						data.push( 0 );
+					}
+					if ( current < 0 ) {
+						current = 11; // 12:00 or 00:00
+					}
+				}
+				if ( pat.length == 2 ) {
+					// two digit
+					values = values.map( obj._makeTwoDigits );
+				}
+				numItems = values.length;
+				break;
+			case 'min':
+			case 'sec':
+				values = range( 0, 59 );
+				if ( pat.length == 2 ) {
+					values = values.map( obj._makeTwoDigits );
+				}
+				data = range( 0, 59 );
+				current = ( field == 'min' ? obj.data.min : obj.data.sec );
+				numItems = values.length;
+				break;
+			case 'year':
+				local = new Date( 1900, 0, 1 );
+				if ( obj.calendar.convert ) {
+					local = obj.calendar.convert.fromGregorian( local );
+					yearlb = local.year;
+					yearhb = yearlb + 200;
+				} else {
+					yearlb = local.getFullYear();
+					yearhb = yearlb + 200;
+				}
+				data = range( yearlb, yearhb );
+				current = obj.data.year - yearlb;
+				values = range( yearlb, yearhb );
+				numItems = values.length;
+				break;
+			case 'month':
+				switch ( pat.length ) {
+				case 1:
+					values = range( 1, 12 );
+					break;
+				case 2:
+					values = range( 1, 12 ).map( obj._makeTwoDigits );
+					break;
+				case 3:
+					values = obj.calendar.months.namesAbbr.slice();
+					break;
+				case 4:
+					values = obj.calendar.months.names.slice();
+					break;
+				}
+				if ( values.length == 13 ) { // @TODO Lunar calendar support
+					if ( values[12] == "" ) { // to remove lunar calendar reserved space
+						values.pop();
+					}
+				}
+				data = range( 1, values.length );
+				current = obj.data.month - 1;
+				numItems = values.length;
+				break;
+			case 'day':
+				//@TODO max number 31 -> depends on month
+				day = 31;
+				values = range( 1, day );
+				if ( pat.length == 2 ) {
+					values = values.map( obj._makeTwoDigits );
+				}
+				data = range( 1, day );
+				current = obj.data.day - 1;
+				numItems = day;
+				break;
+			}
+
+			return {
+				values: values,
+				data: data,
+				numItems: numItems,
+				current: current
+			};
+
+		},
+
+		_showDataSelector: function ( obj, ui, target ) {
+			target = $(target);
+
+			var attr = target.attr("class"),
+				field = attr.match(/ui-datefield-([\w]*)/),
+				pat,
+				data,
+				values,
+				numItems,
+				current,
+				valuesData,
+				item,
+				$li,
+				$item,
+				$ul,
+				$div,
+				$ctx;
+
+			if ( !attr ) {
+				return;
+			}
+			if ( !field ) {
+				return;
+			}
+
+			target.not('.ui-datefield-seperator').addClass('ui-datefield-selected');
+
+			pat = target.jqmData('pat');
+			data = obj._populateDataSelector( field[1], pat, obj );
+
+			values = data.values;
+			numItems = data.numItems;
+			current = data.current;
+			valuesData = data.data;
+
+			if ( values ) {
+				$ul = $(document.createElement('ul'));
+				for ( item in values ) {
+					$li = $(document.createElement('li'));
+					$item = $(document.createElement('a'));
+					$item.addClass('ui-link');
+					$item.text( values[item] );
+					$item.jqmData( "val", valuesData[item] );
+
+					$li.append( $item );
+					$ul.append( $li );
+
+					if ( current == item ) {
+						$li.addClass('current');
+					}
+				}
+
+				/* TODO NEED TO REFACTORING HERE */
+				$div = $(document.createElement('div'));
+				$div.append( $ul ).appendTo( ui );
+				$div.addClass('ui-datetimepicker-selector');
+				$div.attr( 'data-transition', 'none' );
+				$ctx = $div.ctxpopup();
+				$ctx.parents('.ui-popupwindow').addClass('ui-datetimepicker');
+				$div.circularview();
+				$div.circularview( 'centerTo', '.current' );
+				$ctx.popupwindow( 'open',
+						target.offset().left + target.width() / 2 - window.pageXOffset,
+						target.offset().top + target.height() - window.pageYOffset );
+				$div.bind('closed', function ( e ) {
+					$div.unbind( 'closed' );
+					$ul.unbind( 'vclick' );
+					$(obj).unbind( 'update' );
+					$(ui).find('.ui-datefield-selected').removeClass('ui-datefield-selected');
+					$ctx.popupwindow( 'destroy' );
+					$div.remove();
+				});
+
+				$(obj).bind( 'update', function ( e, val ) {
+					$ctx.popupwindow( 'close' );
+					var data = $(ui).find( '.' + field[0] );
+					obj._updateField( $(data), val );
+					obj.data[ field[1] ] = val;
+					obj.update();
+				});
+
+				$ul.bind( 'vclick', function ( e ) {
+					if ( $(e.target).is('a') ) {
+						$ul.find(".current").removeClass("current");
+						$(e.target).parent().addClass('current');
+						var val = $(e.target).jqmData("val");
+						$(obj).trigger( 'update', val ); // close popup, unselect field
+					}
+				});
+			}
+		},
+
+		_initField: function ( type, div ) {
+			var date,
+				time,
+				datetime,
+				updateFields = function ( obj, html, attr ) {
+					var item;
+					for ( item in attr ) {
+						if ( attr[item] ) {
+							obj._updateField( $(html).find( '.ui-datefield-' + item ),
+								obj.data[item] );
+						}
+					}
+				};
+
+			if ( this.options.format ) {
+				datetime = this._format( this.options.format );
+				updateFields( this, datetime.html, datetime.attr );
+				div.append( datetime.html );
+			} else {
+				if ( type.match( 'date' ) ) {
+					date = this._format( this.calendar.patterns.d );
+					$(date.html).addClass('date');
+					updateFields( this, date.html, date.attr );
+					div.append( date.html );
+				}
+
+				if ( type.match( 'datetime' ) ) {
+					div.append( '<span class="ui-datefield-tab"></span>' );
+				}
+
+				if ( type.match( 'time' ) ) {
+					time = this._format( this.calendar.patterns.t );
+					$(time.html).addClass('time');
+					updateFields( this, time.html, time.attr );
+					div.append( time.html );
+				}
+			}
+		}
+
+	});
+
+	$(document).bind("pagecreate create", function ( e ) {
+		$($.tizen.datetimepicker.prototype.options.initSelector, e.target)
+			.not(":jqmData(role='none'), :jqmData(role='nojs')")
+			.datetimepicker();
+	});
+
+} ( jQuery, this ) );
+/*
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL licenses
+ * http://phpjs.org/functions/range
+ * original by: Waldo Malqui Silva
+ * version: 1107.2516
+ */
+function range( low, high, step ) {
+    // Create an array containing the range of integers or characters
+    // from low to high (inclusive)  
+    // 
+    // version: 1107.2516
+    // discuss at: http://phpjs.org/functions/range
+    // +   original by: Waldo Malqui Silva
+    // *     example 1: range ( 0, 12 );
+    // *     returns 1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+    // *     example 2: range( 0, 100, 10 );
+    // *     returns 2: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
+    // *     example 3: range( 'a', 'i' );
+    // *     returns 3: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
+    // *     example 4: range( 'c', 'a' );
+    // *     returns 4: ['c', 'b', 'a']
+	var matrix = [],
+		inival,
+		endval,
+		plus,
+		walker = step || 1,
+		chars = false;
+
+    if (!isNaN(low) && !isNaN(high)) {
+        inival = low;
+        endval = high;
+    } else if (isNaN(low) && isNaN(high)) {
+        chars = true;
+        inival = low.charCodeAt(0);
+        endval = high.charCodeAt(0);
+    } else {
+        inival = (isNaN(low) ? 0 : low);
+        endval = (isNaN(high) ? 0 : high);
+    }
+
+    plus = ((inival > endval) ? false : true);
+    if (plus) {
+        while (inival <= endval) {
+            matrix.push(((chars) ? String.fromCharCode(inival) : inival));
+            inival += walker;
+        }
+    } else {
+        while (inival >= endval) {
+            matrix.push(((chars) ? String.fromCharCode(inival) : inival));
+            inival -= walker;
+        }
+    }
+
+    return matrix;
+}
+
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Rijubrata Bhaumik <rijubrata.bhaumik@intel.com>
+ *          Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Displays a day selector element: a control group with 7 check
+// boxes which can be toggled on and off.
+//
+// The widget can be invoked on fieldset element with
+// $(element).dayselector() or by creating a fieldset element with
+// data-role="dayselector". If you try to apply it to an element
+// of type other than fieldset, results will be unpredictable.
+//
+// The default is to display the controlgroup horizontally; you can
+// override this by setting data-type="vertical" on the fieldset,
+// or by passing a type option to the constructor. The data-type
+// attribute has precedence.
+//
+// If no ID is supplied for the dayselector, one will be generated
+// automatically.
+//
+// Methods:
+//
+//     value: Return the day numbers (0=Sunday, ..., 6=Saturday) of
+//            the selected checkboxes as an array.
+//
+//     selectAll: Select all 7 days of the week by automatically "ticking"
+//                all of the checkboxes.
+//
+// Options:
+//
+//     theme : Override the data-theme of the widget; note that the
+//             order of preference is: 1) set from data-theme attribute;
+//             2) set from option; 3) set from closest parent data-theme;
+//             4) default to 'c'
+//
+//     type: 'horizontal' (default) or 'vertical'; specifies the type
+//           of controlgroup to create around the day check boxes.
+//
+//     days: array of day names, Sunday first; defaults to English day
+//           names; the first letters are used as text for the checkboxes
+
+(function ( $, window, undefined ) {
+	$.widget( "tizen.dayselector", $.mobile.widget, {
+		options: {
+			initSelector: 'fieldset:jqmData(role="dayselector")',
+			theme: null,
+			type: 'horizontal',
+			days: ['Sunday',
+			       'Monday',
+			       'Tuesday',
+			       'Wednesday',
+			       'Thursday',
+			       'Friday',
+			       'Saturday']
+		},
+
+		defaultTheme: 'c',
+
+		_create: function () {
+			var days,
+				parentId,
+				i,
+				day,
+				letter,
+				id,
+				labelClass,
+				checkbox,
+				label;
+
+			this.element.addClass( 'ui-dayselector' );
+
+			this.options.type = this.element.jqmData( 'type' ) || this.options.type;
+
+			this.options.theme = this.element.jqmData( 'theme' ) ||
+									this.options.theme ||
+									this.element.closest( ':jqmData(theme)').jqmData('theme' ) ||
+									this.defaultTheme;
+
+			days = this.options.days;
+
+			this.element.attr( 'data-' + $.mobile.ns + 'type', this.options.type );
+
+			parentId = this.element.attr( 'id' ) ||
+							'dayselector' + ( new Date() ).getTime();
+
+			for ( i = 0; i < days.length; i++ ) {
+				day = days[i];
+				letter = day.slice(0, 1);
+
+				if ( window.Globalize ) {
+					//TODO may some modification required to support
+					//	start week day difference upon cultures.
+					letter = window.Globalize.culture().calendars.standard.days.namesShort[i];
+				}
+				id = parentId + '_' + i;
+				labelClass = 'ui-dayselector-label-' + i;
+
+				checkbox = $( '<input type="checkbox"/>' )
+							.attr( 'id', id )
+							.attr( 'value', i );
+
+				label = $( '<label>' + letter + '</label>' )
+						.attr( 'for', id )
+						.addClass( labelClass );
+
+				this.element.append( checkbox );
+				this.element.append( label );
+			}
+
+			this.checkboxes = this.element
+								.find( ':checkbox' )
+								.checkboxradio( { theme: this.options.theme } );
+
+			this.element.controlgroup( { excludeInvisible: false } );
+		},
+
+		_setOption: function ( key, value ) {
+			if ( key === "disabled" ) {
+				this._setDisabled( value );
+			}
+		},
+
+		_setDisabled: function ( value ) {
+			$.Widget.prototype._setOption.call(this, "disabled", value);
+			this.element[value ? "addClass" : "removeClass"]("ui-disabled");
+		},
+
+		value: function () {
+			var values = this.checkboxes.filter( ':checked' ).map( function () {
+				return this.value;
+			} ).get();
+
+			return values;
+		},
+
+		selectAll: function () {
+			this.checkboxes
+				.attr( 'checked', 'checked' )
+				.checkboxradio( 'refresh' );
+		}
+
+	} ); /* End of Widget */
+
+	// auto self-init widgets
+	$( document ).bind( "pagebeforecreate", function ( e ) {
+		var elts = $( $.tizen.dayselector.prototype.options.initSelector, e.target );
+		elts.not( ":jqmData(role='none'), :jqmData(role='nojs')" ).dayselector();
+	} );
+
+}( jQuery, this ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+/**
+ * Displays vertical multi-level list.
+ *
+ * To apply, add the attribute data-expandable="true" and id="parentid" to a <li> element for parent list item
+ * and add the arrribute data-expanded-by="parentid" to a <li> element for child list item.
+ *
+ * HTML Attributes:
+ *		data-expandable: Parent list item must have 'true' value for this attribute
+ *		data-expanded-by: Child list item expanded by parent list item must have 'true' value for this attribute
+ *		data-initial-expansion: If you want expandable list to be expanded initially, set this value as 'true'
+ *
+ * Example:
+ *     <li data-expandable="true" id="exp1" data-initial-expansion="true">Parent</li>
+ *     <li data-expanded-by="exp1">Child</li>
+ */
+
+( function ( $, undefined ) {
+
+	$.widget( "tizen.expandablelist", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(expandable='true')"
+		},
+
+		_hide: function ( e ) {
+			$( e ).removeClass( 'ui-li-expand-transition-show' )
+				.addClass( 'ui-li-expand-transition-hide' );
+		},
+		_show: function ( e ) {
+			$( e ).removeClass( 'ui-li-expand-transition-hide' )
+				.addClass( 'ui-li-expand-transition-show' );
+		},
+		_hide_expand_img: function ( e ) {
+			$( e ).removeClass( 'ui-li-expandable-hidden' )
+				.addClass( 'ui-li-expandable-shown' );
+
+			$( e ).find( ".ui-li-expand-icon" )
+				.addClass( "ui-li-expanded-icon" )
+				.removeClass( "ui-li-expand-icon" );
+		},
+		_show_expand_img: function ( e ) {
+			$( e ).removeClass( 'ui-li-expandable-shown' )
+				.addClass( 'ui-li-expandable-hidden' );
+
+			$( e ).find( ".ui-li-expanded-icon" )
+				.addClass( "ui-li-expand-icon" )
+				.removeClass( "ui-li-expanded-icon" );
+		},
+
+		_set_expand_arrow: function ( self, e, parent_is_expanded ) {
+			if ( parent_is_expanded ) {
+				self._hide_expand_img( e );
+			} else {
+				self._show_expand_img( e );
+			}
+			if ( $( e[0] ).data( "expandable" ) && parent_is_expanded == false ) {
+				var children = $( e ).nextAll( ":jqmData(expanded-by='" + $( e ).attr( 'id' ) + "')" );
+				children.each( function ( idx, child ) {
+					self._set_expand_arrow( self, child, e.is_expanded );
+				} );
+			}
+		},
+
+		_toggle: function ( self, e, parent_is_expanded ) {
+			if ( ! parent_is_expanded ) {
+				self._show( e );
+			} else {
+				self._hide( e );
+				if ( $( e ).data( "expandable" ) && e.is_expanded == true ) {
+					var children = $( e ).nextAll( ":jqmData(expanded-by='" + $( e ).attr( 'id' ) + "')" );
+					children.each( function ( idx, child ) {
+						self._toggle( self, child, e.is_expanded );
+					} );
+					e.is_expanded = false;
+				}
+			}
+		},
+		_is_hidden: function ( e ) {
+			return ( $( e ).height( ) == 0);
+		},
+
+		_create: function ( ) {
+
+			var children = $( this.element ).nextAll( ":jqmData(expanded-by='" + $( this.element ).attr( 'id' ) + "')" ),
+				e = this.element,
+				self = this,
+				expanded = e.nextAll( ":jqmData(expanded-by='" + e[0].id + "')" ),
+				initial_expansion = e.data( "initial-expansion" ),
+				is_expanded = false,
+				parent_id = null;
+
+			if ( children.length == 0 ) {
+				return;
+			}
+
+			if ( initial_expansion == true ) {
+				parent_id = e.data( "expanded-by" );
+				if ( parent_id ) {
+					if ( $( "#" + parent_id ).is_expanded == true) {
+						is_expanded = true;
+					}
+				} else {
+					is_expanded = true;
+				}
+			}
+
+			e[0].is_expanded = is_expanded;
+			if ( e[0].is_expanded ) {
+				self._hide_expand_img( e );
+				$(e).append( "<div class='ui-li-expanded-icon'></div>" );
+			} else {
+				self._show_expand_img( e );
+				$(e).append( "<div class='ui-li-expand-icon'></div>" );
+			}
+
+			if ( e[0].is_expanded ) {
+				expanded.each( function ( i, e ) { self._show( e ); } );
+			} else {
+				expanded.each( function ( i, e ) { self._hide( e ); } );
+			}
+
+			expanded.addClass( "ui-li-expanded" );
+
+			e.bind( 'vclick', function ( ) {
+				var _is_expanded = e[0].is_expanded;
+				expanded.each( function ( i, e ) { self._toggle( self, e, _is_expanded ); } );
+				e[0].is_expanded = ! e[0].is_expanded;
+
+				self._set_expand_arrow( self, e, e[0].is_expanded );
+			});
+		}
+
+
+	});	// end: $.widget()
+
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.expandablelist.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.expandablelist( );
+	});
+
+} ( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Wongi Lee <wongi11.lee@samsung.com>
+*/
+
+/**
+ *	Extendable List Widget for unlimited data.
+ *	To support more then 1,000 items, special list widget developed.
+ *	Fast initialize and append some element into the DOM tree repeatedly.
+ *	DB connection and works like DB cursor.
+ *
+ * HTML Attributes:
+ *
+ *		data-role:	extendablelist
+ *		data-template : jQuery.template ID that populate into extendable list. A button : a <DIV> element with "data-role : button" should be included on data-template.
+ *		data-dbtable : DB Table name. It used as window[DB NAME]. Loaded data should be converted as window object.
+ *		data-extenditems : Number of elements to extend at once.
+ *		
+ *		ID : <UL> element that has "data-role=extendablelist" must have ID attribute.
+ *		Class : <UL> element that has "data-role=extendablelist" should have "vlLoadSuccess" class to guaranty DB loading is completed.
+ *		tmp_load_more : Template ID for "load more" message and button.
+ *
+ *
+ *APIs:
+ *
+ *		create ( void )
+ *			: API to call _create method. API for AJAX or DB loading callback.
+ *
+ *		recreate ( Array )
+ *			: Update extendable list with new data array. For example, update with search result.
+ *
+ *Examples:
+ *
+ *		<script id="tmp-3-1-1" type="text/x-jquery-tmpl">
+ *			<li class="ui-li-3-1-1"><span class="ui-li-text-main">${NAME}</span></li>
+ *		</script>
+ *
+ *		<script id="tmp_load_more" type="text/x-jquery-tmpl"> 
+ *			<li class="ui-li-3-1-1" style="text-align:center; margin:0 auto">
+ *				<div data-role="button">Load ${NUM_MORE_ITEMS} more items</div>
+ *			</li>
+ *		</script>
+ *	
+ *		<ul id = "extendable_list_main" data-role="extendablelist" data-extenditems="50" data-template="tmp-3-1-1" data-dbtable="JSON_DATA">
+ *		</ul>
+ *
+ */
+
+
+( function ( $, undefined ) {
+
+	//Keeps track of the number of lists per page UID
+	//This allows support for multiple nested list in the same page
+	//https://github.com/jquery/jquery-mobile/issues/1617
+	var listCountPerPage = {},
+		TOTAL_ITEMS = 0,
+		last_index = 0;
+
+	$.widget( "tizen.extendablelist", $.mobile.widget, {
+		options: {
+			theme: "s",
+			countTheme: "c",
+			headerTheme: "b",
+			dividerTheme: "b",
+			splitIcon: "arrow-r",
+			splitTheme: "b",
+			inset: false,
+			id:	"",						/* Extendable list UL elemet's ID */
+			extenditems: 50,			/* Number of append items */
+			childSelector: " li",		/* To support swipe list */
+			dbtable: "",
+			template : "",				/* Template for each list item */
+			loadmore : "tmp_load_more",	/* Template for "Load more" message */
+			scrollview: false,
+			initSelector: ":jqmData(role='extendablelist')"
+		},
+
+		_stylerMouseUp: function () {
+			$( this ).addClass( "ui-btn-up-s" );
+			$( this ).removeClass( "ui-btn-down-s" );
+		},
+
+		_stylerMouseDown: function () {
+			$( this ).addClass( "ui-btn-down-s" );
+			$( this ).removeClass( "ui-btn-up-s" );
+		},
+
+		_stylerMouseOver: function () {
+			$( this ).toggleClass( "ui-btn-hover-s" );
+		},
+
+		_stylerMouseOut: function () {
+			$( this ).toggleClass( "ui-btn-hover-s" );
+		},
+
+		_pushData: function ( template, data ) {
+			var o = this.options,
+				i = 0,
+				dataTable = data,
+				myTemplate = $( "#" + template ),
+				loadMoreItems = ( o.extenditems > data.length - last_index ? data.length - last_index : o.extenditems ),
+				htmlData;
+
+			for (i = 0; i < loadMoreItems; i++ ) {
+				htmlData = myTemplate.tmpl( dataTable[ i ] );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + i ) );
+				last_index++;
+			}
+
+			/* After push data, re-style extendable list widget */
+			$( o.id ).trigger( "create" );
+		},
+
+		_loadmore: function ( event ) {
+			var t = this,
+				o = event.data,
+				i = 0,
+				dataTable = window[ o.dbtable ],
+				myTemplate = $( "#" + o.template ),
+				loadMoreItems = ( o.extenditems > dataTable.length - last_index ? dataTable.length - last_index : o.extenditems ),
+				htmlData,
+				more_items_to_load,
+				num_next_load_items;
+
+			/* Remove load more message */
+			$( "#load_more_message" ).remove();
+
+			/* Append More Items */
+			for ( i = 0; i < loadMoreItems; i++ ) {
+				htmlData = myTemplate.tmpl( dataTable[ last_index ] );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + last_index ) );
+				last_index++;
+			}
+
+			/* Append "Load more" message on the last of list */
+			if ( TOTAL_ITEMS > last_index ) {
+				myTemplate = $( "#" + o.loadmore );
+				more_items_to_load = TOTAL_ITEMS - last_index;
+				num_next_load_items = ( o.extenditems <= more_items_to_load ) ? o.extenditems : more_items_to_load;
+				htmlData = myTemplate.tmpl( { NUM_MORE_ITEMS : num_next_load_items } );
+
+				$( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ) );
+			}
+
+			$( o.id ).trigger( "create" );
+			$( o.id ).extendablelist( "refresh" );
+		},
+
+		recreate: function ( newArray ) {
+			var t = this,
+				o = this.options;
+
+			$( o.id ).empty();
+
+			TOTAL_ITEMS = newArray.length;
+
+			t._pushData( ( o.template), newArray );
+
+			if ( o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			$( o.id ).extendablelist();
+
+			t.refresh( true );
+		},
+
+		_initList: function () {
+			var t = this,
+				o = this.options,
+				myTemplate,
+				more_items_to_load,
+				num_next_load_items,
+				htmlData;
+
+			/* After AJAX loading success */
+			o.dbtable = t.element.data( "dbtable" );
+
+			TOTAL_ITEMS = $( window[ o.dbtable ] ).size();
+
+			/* Make Gen list by template */
+			if ( last_index <= 0 ) {
+				t._pushData( ( o.template ), window[ o.dbtable ] );
+
+				/* Append "Load more" message on the last of list */
+				if ( TOTAL_ITEMS > last_index ) {
+					myTemplate = $( "#" + o.loadmore );
+					more_items_to_load = TOTAL_ITEMS - last_index;
+					num_next_load_items = ( o.extenditems <= more_items_to_load) ? o.extenditems : more_items_to_load;
+					htmlData = myTemplate.tmpl( { NUM_MORE_ITEMS : num_next_load_items } );
+
+					$( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ) );
+
+					$( "#load_more_message" ).live( "click", t.options, t._loadmore );
+				} else {
+					/* No more items to load */
+					$( "#load_more_message" ).die();
+					$( "#load_more_message" ).remove();
+				}
+			}
+
+			if ( o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			$( o.id ).trigger( "create" );
+
+			t.refresh( true );
+		},
+
+		create: function () {
+			var o = this.options;
+
+			/* external API for AJAX callback */
+			this._create( "create" );
+		},
+
+		_create: function ( event ) {
+			var t = this,
+				o = this.options,
+				$el = this.element;
+
+			// create listview markup
+			t.element.addClass( function ( i, orig ) {
+				return orig + " ui-listview ui-extendable-list-container" + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
+			});
+
+			o.id = "#" + $el.attr( "id" );
+
+			if ( $el.data( "extenditems" ) ) {
+				o.extenditems = parseInt( $el.data( "extenditems" ), 10 );
+			}
+
+			$( o.id ).bind( "pagehide", function (e) {
+				$( o.id ).empty();
+			});
+
+			/* Scroll view */
+			if ( $( ".ui-scrollview-clip" ).size() > 0) {
+				o.scrollview = true;
+			} else {
+				o.scrollview = false;
+			}
+
+			/* After DB Load complete, Init Extendable list */
+			if ( $( o.id ).hasClass( "elLoadSuccess" ) ) {
+				if ( !$( o.id ).hasClass( "elInitComplete" ) ) {
+					if ( $el.data( "template" ) ) {
+						o.template = $el.data( "template" );
+
+						/* to support swipe list, <li> or <ul> can be main node of extendable list. */
+						if ( $el.data( "swipelist" ) == true ) {
+							o.childSelector = " ul";
+						} else {
+							o.shildSelector = " li";
+						}
+					}
+
+					$( o.id ).addClass( "elInitComplete" );
+				}
+
+				t._initList();
+			}
+		},
+
+		destroy : function () {
+			var o = this.options;
+
+			$( o.id ).empty();
+
+			TOTAL_ITEMS = 0;
+			last_index = 0;
+
+			$( "#load_more_message" ).die();
+		},
+
+		_itemApply: function ( $list, item ) {
+			var $countli = item.find( ".ui-li-count" );
+
+			if ( $countli.length ) {
+				item.addClass( "ui-li-has-count" );
+			}
+
+			$countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" );
+
+			// TODO class has to be defined in markup
+			item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end()
+				.find( "p, dl" ).addClass( "ui-li-desc" ).end()
+				.find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each(function () {
+					item.addClass( $( this ).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+				}).end()
+				.find( ".ui-li-aside" ).each(function () {
+					var $this = $( this );
+					$this.prependTo( $this.parent() ); //shift aside to front for css float
+				});
+		},
+
+		_removeCorners: function ( li, which ) {
+			var top = "ui-corner-top ui-corner-tr ui-corner-tl",
+				bot = "ui-corner-bottom ui-corner-br ui-corner-bl";
+
+			li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) );
+
+			if ( which === "top" ) {
+				li.removeClass( top );
+			} else if ( which === "bottom" ) {
+				li.removeClass( bot );
+			} else {
+				li.removeClass( top + " " + bot );
+			}
+		},
+
+		_refreshCorners: function ( create ) {
+			var $li,
+				$visibleli,
+				$topli,
+				$bottomli;
+
+			if ( this.options.inset ) {
+				$li = this.element.children( "li" );
+				// at create time the li are not visible yet so we need to rely on .ui-screen-hidden
+				$visibleli = create ? $li.not( ".ui-screen-hidden" ) : $li.filter( ":visible" );
+
+				this._removeCorners( $li );
+
+				// Select the first visible li element
+				$topli = $visibleli.first()
+					.addClass( "ui-corner-top" );
+
+				$topli.add( $topli.find( ".ui-btn-inner" ) )
+					.find( ".ui-li-link-alt" )
+						.addClass( "ui-corner-tr" )
+					.end()
+					.find( ".ui-li-thumb" )
+						.not( ".ui-li-icon" )
+						.addClass( "ui-corner-tl" );
+
+				// Select the last visible li element
+				$bottomli = $visibleli.last()
+					.addClass( "ui-corner-bottom" );
+
+				$bottomli.add( $bottomli.find( ".ui-btn-inner" ) )
+					.find( ".ui-li-link-alt" )
+						.addClass( "ui-corner-br" )
+					.end()
+					.find( ".ui-li-thumb" )
+						.not( ".ui-li-icon" )
+						.addClass( "ui-corner-bl" );
+			}
+		},
+
+		refresh: function ( create ) {
+			this.parentPage = this.element.closest( ".ui-page" );
+			this._createSubPages();
+
+			var o = this.options,
+				$list = this.element,
+				self = this,
+				dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,
+				listsplittheme = $list.jqmData( "splittheme" ),
+				listspliticon = $list.jqmData( "spliticon" ),
+				li = $list.children( "li" ),
+				counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,
+				item,
+				itemClass,
+				itemTheme,
+				a,
+				last,
+				splittheme,
+				countParent,
+				icon,
+				pos,
+				numli;
+
+			if ( counter ) {
+				$list.find( ".ui-li-dec" ).remove();
+			}
+
+			for ( pos = 0, numli = li.length; pos < numli; pos++ ) {
+				item = li.eq( pos );
+				itemClass = "ui-li";
+
+				// If we're creating the element, we update it regardless
+				if ( create || !item.hasClass( "ui-li" ) ) {
+					itemTheme = item.jqmData( "theme" ) || o.theme;
+					a = item.children( "a" );
+
+					if ( a.length ) {
+						icon = item.jqmData( "icon" );
+
+						item.buttonMarkup({
+							wrapperEls: "div",
+							shadow: false,
+							corners: false,
+							iconpos: "right",
+							/* icon: a.length > 1 || icon === false ? false : icon || "arrow-r",*/
+							icon: false,	/* Remove unnecessary arrow icon */
+							theme: itemTheme
+						});
+
+						if ( ( icon != false ) && ( a.length == 1 ) ) {
+							item.addClass( "ui-li-has-arrow" );
+						}
+
+						a.first().addClass( "ui-link-inherit" );
+
+						if ( a.length > 1 ) {
+							itemClass += " ui-li-has-alt";
+
+							last = a.last();
+							splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;
+
+							last.appendTo(item)
+								.attr( "title", last.getEncodedText() )
+								.addClass( "ui-li-link-alt" )
+								.empty()
+								.buttonMarkup({
+									shadow: false,
+									corners: false,
+									theme: itemTheme,
+									icon: false,
+									iconpos: false
+								})
+								.find( ".ui-btn-inner" )
+								.append(
+									$( "<span />" ).buttonMarkup( {
+										shadow : true,
+										corners : true,
+										theme : splittheme,
+										iconpos : "notext",
+										icon : listspliticon || last.jqmData( "icon" ) || o.splitIcon
+									})
+								);
+						}
+					} else if ( item.jqmData( "role" ) === "list-divider" ) {
+
+						itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;
+						item.attr( "role", "heading" );
+
+						//reset counter when a divider heading is encountered
+						if ( counter ) {
+							counter = 1;
+						}
+
+					} else {
+						itemClass += " ui-li-static ui-body-" + itemTheme;
+					}
+				}
+
+				if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+					countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );
+
+					countParent.addClass( "ui-li-jsnumbering" )
+						.prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );
+				}
+
+				item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass );
+
+				self._itemApply( $list, item );
+			}
+
+			this._refreshCorners( create );
+		},
+
+		//create a string for ID/subpage url creation
+		_idStringEscape: function ( str ) {
+			return str.replace(/\W/g , "-");
+
+		},
+
+		_createSubPages: function () {
+			var parentList = this.element,
+				parentPage = parentList.closest( ".ui-page" ),
+				parentUrl = parentPage.jqmData( "url" ),
+				parentId = parentUrl || parentPage[ 0 ][ $.expando ],
+				parentListId = parentList.attr( "id" ),
+				o = this.options,
+				dns = "data-" + $.mobile.ns,
+				self = this,
+				persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),
+				hasSubPages,
+				newRemove;
+
+			if ( typeof listCountPerPage[ parentId ] === "undefined" ) {
+				listCountPerPage[ parentId ] = -1;
+			}
+
+			parentListId = parentListId || ++listCountPerPage[ parentId ];
+
+			$( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function ( i ) {
+				var self = this,
+					list = $( this ),
+					listId = list.attr( "id" ) || parentListId + "-" + i,
+					parent = list.parent(),
+					nodeEls,
+					title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text
+					id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,
+					theme = list.jqmData( "theme" ) || o.theme,
+					countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,
+					newPage,
+					anchor;
+
+				nodeEls = $( list.prevAll().toArray().reverse() );
+				nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim(parent.contents()[ 0 ].nodeValue) + "</span>" );
+
+				//define hasSubPages for use in later removal
+				hasSubPages = true;
+
+				newPage = list.detach()
+							.wrap( "<div " + dns + "role='page' " +	dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )
+							.parent()
+								.before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )
+								.after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='" + persistentFooterID + "'>" ) : "" )
+								.parent()
+									.appendTo( $.mobile.pageContainer );
+
+				newPage.page();
+
+				anchor = parent.find('a:first');
+
+				if ( !anchor.length ) {
+					anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );
+				}
+
+				anchor.attr( "href", "#" + id );
+
+			}).extendablelist();
+
+			// on pagehide, remove any nested pages along with the parent page, as long as they aren't active
+			// and aren't embedded
+			if ( hasSubPages &&
+					parentPage.is( ":jqmData(external-page='true')" ) &&
+					parentPage.data( "page" ).options.domCache === false ) {
+
+				newRemove = function ( e, ui ) {
+					var nextPage = ui.nextPage, npURL;
+
+					if ( ui.nextPage ) {
+						npURL = nextPage.jqmData( "url" );
+						if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {
+							self.childPages().remove();
+							parentPage.remove();
+						}
+					}
+				};
+
+				// unbind the original page remove and replace with our specialized version
+				parentPage
+					.unbind( "pagehide.remove" )
+					.bind( "pagehide.remove", newRemove);
+			}
+		},
+
+		// TODO sort out a better way to track sub pages of the extendable listview this is brittle
+		childPages: function () {
+			var parentUrl = this.parentPage.jqmData( "url" );
+
+			return $( ":jqmData(url^='" +  parentUrl + "&" + $.mobile.subPageUrlKey + "')" );
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.extendablelist.prototype.options.initSelector, e.target ).extendablelist();
+	});
+
+}( jQuery ));
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Wonseop Kim ( wonseop.kim@samsung.com )
+*/
+
+/**
+ * 'Handler' is widget that is working in conjunction with 'scrollview'.
+ * 'Handler' is supporting 'scroll event( up/down )' and is indicating scroll
+ * position.
+ *
+ * HTML Attributes:
+ *
+ *		data-handler : This attribute is indicating that whether enable.
+ *						If you want to use, you will set 'true'.
+ *		data-handlertheme : Set the widget theme ( optional )
+ *
+ * APIs:
+ *
+ *		enableHandler ( void )
+ *			: Get a status that whether enable.
+ *		enableHandler ( boolean )
+ *			: Set a status that whether enable.
+ *
+ * Events:
+ *
+ * Examples:
+ *
+ *		<div data-role="content" data-scroll="y" data-handler="true">
+ *			<ul data-role="listview">
+ *				<li data-role="list-divider">A</li>
+ *				<li><a href="../../docs/lists/index.html">Adam Kinkaid</a></li>
+ *				<li><a href="../../docs/lists/index.html">Alex Wickerham</a></li>
+ *				<li><a href="../../docs/lists/index.html">Avery Johnson</a></li>
+ *			</ul>
+ *		</div>
+ */
+
+( function ( $, document, undefined ) {
+	// The options of handler in scrollview
+	$.tizen.scrollview.prototype.options.handler = false;
+	$.tizen.scrollview.prototype.options.handlerTheme = "s";
+
+	$.extend( $.tizen.scrollview.prototype, {
+		enableHandler : function ( enabled ) {
+			if ( typeof enabled === 'undefined' ) {
+				return this.options.handler;
+			}
+
+			this.options.handler = !!enabled;
+
+			var view = this.element;
+			if ( this.options.handler ) {
+				view.find( ".ui-scrollbar" ).hide();
+				view.find( ".ui-handler" ).show();
+			} else {
+				view.find( ".ui-handler" ).hide();
+				view.find( ".ui-scrollbar" ).show();
+			}
+		},
+		_handlerTimer : 0
+	});
+
+	$( document ).delegate( ":jqmData(scroll)", "scrollviewcreate", function () {
+		if ( $( this ).attr( "data-" + $.mobile.ns + "scroll" ) === "none" ) {
+			return;
+		}
+
+		var self = this,
+			$this = $( this ),
+			scrollview = $this.data( "scrollview" ),
+			prefix = "<div class=\"ui-handler ui-handler-",
+			suffix = "\"><div class=\"ui-handler-track\"><div class=\"ui-handler-thumb\"></div></div></div>",
+			direction = scrollview.options.direction,
+			isHorizontal = ( scrollview.options.direction === "x" ),
+			_$view = scrollview._$view,
+			_$clip = scrollview._$clip,
+			handler = null,
+			handlerThumb = null,
+			viewLength = 0,
+			clipLength = 0,
+			handlerHeight = 0,
+			handlerMargin = 0,
+			trackLength = 0,
+			isTouchable = $.support.touch,
+			dragStartEvt = ( isTouchable ? "touchstart" : "mousedown" ) + ".handler",
+			dragMoveEvtDefault = ( isTouchable ? "touchmove" : "mousemove" ),
+			dragMoveEvt = dragMoveEvtDefault + ".handler",
+			dragStopEvt = ( isTouchable ? "touchend" : "mouseup" ) + ".handler";
+
+		if ( $this.find( ".ui-handler-thumb" ).length !== 0 || typeof direction !== "string" ) {
+			return;
+		}
+
+		$this.append( prefix + direction + suffix );
+		handler = $this.find( ".ui-handler" );
+		handlerThumb = $this.find( ".ui-handler-thumb" ).hide();
+		handlerHeight = ( isHorizontal ? handlerThumb.width() : handlerThumb.height() );
+		handlerMargin = ( isHorizontal ? parseInt( handler.css( "right" ), 10 ) : parseInt( handler.css( "bottom" ), 10 ) );
+
+		scrollview.enableHandler( scrollview.options.handler );
+
+		$.extend( self, {
+			moveData : null
+		});
+
+		// handler drag
+		handlerThumb.bind( dragStartEvt, {
+			e : handlerThumb
+		}, function ( event ) {
+			scrollview._stopMScroll();
+
+			var target = event.data.e, t = ( isTouchable ? event.originalEvent.targetTouches[0] : event );
+
+			self.moveData = {
+				target : target,
+				X : parseInt( target.css( 'left' ), 10 ) || 0,
+				Y : parseInt( target.css( 'top' ), 10 ) || 0,
+				pX : t.pageX,
+				pY : t.pageY
+			};
+			clipLength = ( isHorizontal ? _$clip.width() : _$clip.height() );
+			viewLength = ( isHorizontal ? _$view.outerWidth( true ) : _$view.outerHeight( true ) ) - clipLength;
+			trackLength = clipLength - handlerHeight - handlerMargin;
+
+			_$view.trigger( "scrollstart" );
+			event.preventDefault();
+			event.stopPropagation();
+
+			$( document ).bind( dragMoveEvt, function ( event ) {
+				var moveData = self.moveData,
+					handlePos = 0,
+					scrollPos = 0,
+					t = ( isTouchable ? event.originalEvent.targetTouches[0] : event );
+
+				handlePos = ( isHorizontal ? moveData.X + t.pageX - moveData.pX : moveData.Y + t.pageY - moveData.pY );
+
+				if ( handlePos < 0 ) {
+					handlePos = 0;
+				}
+
+				if ( handlePos > trackLength ) {
+					handlePos = trackLength;
+				}
+				scrollPos = - Math.round( handlePos / trackLength * viewLength );
+
+				$this.attr( "display", "none" );
+				if ( isHorizontal ) {
+					scrollview._setScrollPosition( scrollPos, 0 );
+					moveData.target.css( {
+						left : handlePos
+					});
+				} else {
+					scrollview._setScrollPosition( 0, scrollPos );
+					moveData.target.css( {
+						top : handlePos
+					});
+				}
+				$this.attr( "display", "inline" );
+
+				event.preventDefault();
+				event.stopPropagation();
+			}).bind( dragStopEvt, function ( event ) {
+				$( document ).unbind( dragMoveEvt ).unbind( dragStopEvt );
+
+				self.moveData = null;
+				_$view.trigger( "scrollstop" );
+
+				event.preventDefault();
+			});
+		});
+
+		$( document ).bind( dragMoveEvtDefault, function ( event ) {
+			var isVisible = false,
+				vclass = "ui-scrollbar-visible";
+
+			if ( scrollview._$vScrollBar ) {
+				isVisible = scrollview._$vScrollBar.hasClass( vclass );
+			} else if ( scrollview._$hScrollBar ) {
+				isVisible = scrollview._$hScrollBar.hasClass( vclass );
+			}
+
+			if ( isVisible || self.moveData !== null ) {
+				if ( handlerThumb.hasClass( "ui-handler-visible" ) ) {
+					_$view.trigger( "scrollupdate" );
+				} else {
+					_$view.trigger( "scrollstart" );
+				}
+			}
+		});
+
+		$this.bind( "scrollstart", function ( event ) {
+			if ( !scrollview.enableHandler() ) {
+				return;
+			}
+			clipLength = ( isHorizontal ? _$clip.width() : _$clip.height() );
+			viewLength = ( isHorizontal ? _$view.outerWidth( true ) : _$view.outerHeight( true ) ) - clipLength;
+			trackLength = clipLength - handlerHeight - handlerMargin;
+
+			if ( clipLength > viewLength || trackLength < ( handlerHeight * 4 / 3 ) ) {
+				return;
+			}
+
+			handlerThumb.addClass( "ui-handler-visible" );
+			handlerThumb.stop().fadeIn( 'fast' );
+
+			event.preventDefault();
+			event.stopPropagation();
+		}).bind( "scrollupdate", function ( event, data ) {
+			if ( !scrollview.enableHandler() || clipLength > viewLength || trackLength < ( handlerHeight * 4 / 3 ) ) {
+				return;
+			}
+
+			var scrollPos = scrollview.getScrollPosition(), handlerPos = 0;
+
+			handlerThumb.stop( true, true ).hide().css( "opacity", 1.0 );
+
+			if ( isHorizontal ) {
+				handlerPos = Math.round( scrollPos.x / viewLength * trackLength );
+				handlerThumb.css( "left", handlerPos );
+			} else {
+				handlerPos = Math.round( scrollPos.y / viewLength * trackLength );
+				handlerThumb.css( "top", handlerPos );
+			}
+
+			handlerThumb.show();
+
+			event.preventDefault();
+			event.stopPropagation();
+		}).bind( "scrollstop", function ( event ) {
+			if ( !scrollview.enableHandler() || clipLength > viewLength ) {
+				return;
+			}
+
+			scrollview._handlerTimer = setTimeout( function () {
+				if ( scrollview._timerID === 0 && self.moveData === null ) {
+					handlerThumb.removeClass( "ui-handler-visible" );
+					handlerThumb.stop( true, true ).fadeOut( 'fast' );
+					clearTimeout( scrollview._handlerTimer );
+					scrollview._handlerTimer = 0;
+				}
+			}, 1000 );
+
+			event.preventDefault();
+		});
+	});
+} ( jQuery, document ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays three sliders that allow the user to select the
+// hue, saturation, and value for a color.
+//
+// To apply, add the attribute data-role="hsvpicker" to a <div>
+// element inside a page. Alternatively, call hsvpicker() 
+// on an element (see below).
+//
+// Options:
+//
+//     color: String; the initial color can be specified in html using the
+//            data-color="#ff00ff" attribute or when constructed
+//            in javascript, eg
+//                $( "#myhsvpicker" ).hsvpicker({ color: "#ff00ff" });
+//            where the html might be :
+//                <div id="myhsvpicker"></div>
+//            The color can be changed post-construction like this :
+//                $( "#myhsvpicker" ).hsvpicker( "option", "color", "#ABCDEF" );
+//            Default: "#1a8039"
+//
+// Events:
+//
+//     colorchanged: Fired when the color is changed.
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.hsvpicker", $.tizen.colorwidget, {
+		options: {
+			initSelector: ":jqmData(role='hsvpicker')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='hsvpicker' class='ui-hsvpicker'>" +
+  "    <div class='hsvpicker-clrchannel-container jquery-mobile-ui-widget'>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='hue' data-location='left' data-inline='true' data-icon='reveal-left'></a>" +
+  "        </div>" +
+  "        <div class='hsvpicker-clrchannel-masks-container'>" +
+  "            <div class='hsvpicker-clrchannel-mask hsvpicker-clrchannel-mask-white'></div>" +
+  "            <div id='hsvpicker-hue-hue' class='hsvpicker-clrchannel-mask jquery-todons-colorwidget-clrlib-hue-gradient'></div>" +
+  "            <div id='hsvpicker-hue-mask-val' class='hsvpicker-clrchannel-mask hsvpicker-clrchannel-mask-black' data-event-source='hue'></div>" +
+  "            <div id='hsvpicker-hue-selector' class='hsvpicker-clrchannel-selector ui-corner-all'></div>" +
+  "        </div>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='hue' data-location='right' data-inline='true' data-icon='reveal'></a>" +
+  "        </div>" +
+  "    </div>" +
+  "    <div class='hsvpicker-clrchannel-container jquery-mobile-ui-widget'>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='sat' data-location='left' data-inline='true' data-icon='reveal-left'></a>" +
+  "        </div>" +
+  "        <div class='hsvpicker-clrchannel-masks-container'>" +
+  "            <div id='hsvpicker-sat-hue' class='hsvpicker-clrchannel-mask'></div>" +
+  "            <div id='hsvpicker-sat-gradient' class='hsvpicker-clrchannel-mask  sat-gradient'></div>" +
+  "            <div id='hsvpicker-sat-mask-val' class='hsvpicker-clrchannel-mask hsvpicker-clrchannel-mask-black' data-event-source='sat'></div>" +
+  "            <div id='hsvpicker-sat-selector' class='hsvpicker-clrchannel-selector ui-corner-all'></div>" +
+  "        </div>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='sat' data-location='right' data-inline='true' data-icon='reveal'></a>" +
+  "        </div>" +
+  "    </div>" +
+  "    <div class='hsvpicker-clrchannel-container jquery-mobile-ui-widget'>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='val' data-location='left' data-inline='true' data-icon='reveal-left'></a>" +
+  "        </div>" +
+  "        <div class='hsvpicker-clrchannel-masks-container'>" +
+  "            <div class='hsvpicker-clrchannel-mask hsvpicker-clrchannel-mask-white'></div>" +
+  "            <div id='hsvpicker-val-hue' class='hsvpicker-clrchannel-mask'></div>" +
+  "            <div id='hsvpicker-val-gradient' class='hsvpicker-clrchannel-mask val-gradient' data-event-source='val'></div>" +
+  "            <div id='hsvpicker-val-selector' class='hsvpicker-clrchannel-selector ui-corner-all'></div>" +
+  "        </div>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='val' data-location='right' data-inline='true' data-icon='reveal'></a>" +
+  "        </div>" +
+  "    </div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				container: "#hsvpicker",
+				hue: {
+					eventSource: "[data-event-source='hue']",
+					selector: "#hsvpicker-hue-selector",
+					hue: "#hsvpicker-hue-hue",
+					valMask:  "#hsvpicker-hue-mask-val"
+				},
+				sat: {
+					gradient: "#hsvpicker-sat-gradient",
+					eventSource: "[data-event-source='sat']",
+					selector: "#hsvpicker-sat-selector",
+					hue: "#hsvpicker-sat-hue",
+					valMask: "#hsvpicker-sat-mask-val"
+				},
+				val: {
+					gradient: "#hsvpicker-val-gradient",
+					eventSource: "[data-event-source='val']",
+					selector: "#hsvpicker-val-selector",
+					hue: "#hsvpicker-val-hue"
+				}
+			}
+		},
+
+		_create: function () {
+			var self = this,
+				chan,
+				hsvIdx,
+				max,
+				step;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.container );
+
+			this._ui.hue.hue.huegradient();
+
+			$.extend( this, {
+				dragging_hsv: [ 0, 0, 0],
+				selectorDraggingOffset: {
+					x : -1,
+					y : -1
+				},
+				dragging: -1
+			} );
+
+			this._ui.container.find( ".hsvpicker-arrow-btn" )
+				.buttonMarkup()
+				.bind( "vclick", function ( e ) {
+					chan = $( this).attr( "data-" + ( $.mobile.ns || "" ) + "target" );
+					hsvIdx = ( "hue" === chan ) ? 0 :
+							( "sat" === chan) ? 1 : 2;
+					max = ( 0 == hsvIdx ? 360 : 1 );
+					step = 0.05 * max;
+
+					self.dragging_hsv[hsvIdx] = self.dragging_hsv[hsvIdx] + step * ( "left" === $( this ).attr( "data-" + ( $.mobile.ns || "" ) + "location" ) ? -1 : 1);
+					self.dragging_hsv[hsvIdx] = Math.min( max, Math.max( 0.0, self.dragging_hsv[hsvIdx] ) );
+					self._updateSelectors( self.dragging_hsv );
+				} );
+
+			$( document )
+				.bind( "vmousemove", function ( event ) {
+					if ( self.dragging != -1 ) {
+						event.stopPropagation();
+						event.preventDefault();
+					}
+				} )
+				.bind( "vmouseup", function ( event ) {
+					self.dragging = -1;
+				} );
+
+			this._bindElements( "hue", 0 );
+			this._bindElements( "sat", 1 );
+			this._bindElements( "val", 2 );
+		},
+
+		_bindElements: function ( chan, idx ) {
+			var self = this;
+			this._ui[chan].selector
+				.bind( "mousedown vmousedown", function ( e ) { self._handleMouseDown( chan, idx, e, true ); } )
+				.bind( "vmousemove touchmove", function ( e ) { self._handleMouseMove( chan, idx, e, true ); } )
+				.bind( "vmouseup",             function ( e ) { self.dragging = -1; } );
+			this._ui[chan].eventSource
+				.bind( "mousedown vmousedown", function ( e ) { self._handleMouseDown( chan, idx, e, false ); } )
+				.bind( "vmousemove touchmove", function ( e ) { self._handleMouseMove( chan, idx, e, false ); } )
+				.bind( "vmouseup",             function ( e ) { self.dragging = -1; } );
+		},
+
+		_handleMouseDown: function ( chan, idx, e, isSelector ) {
+			var coords = $.mobile.tizen.targetRelativeCoordsFromEvent( e ),
+				widgetStr = ( isSelector ? "selector" : "eventSource" );
+
+			if ( coords.x >= 0 && coords.x <= this._ui[chan][widgetStr].outerWidth() &&
+					coords.y >= 0 && coords.y <= this._ui[chan][widgetStr].outerHeight() ) {
+
+				this.dragging = idx;
+
+				if ( isSelector ) {
+					this.selectorDraggingOffset.x = coords.x;
+					this.selectorDraggingOffset.y = coords.y;
+				}
+
+				this._handleMouseMove( chan, idx, e, isSelector, coords );
+			}
+		},
+
+		_handleMouseMove: function ( chan, idx, e, isSelector, coords ) {
+			if ( this.dragging === idx ) {
+				coords = ( coords || $.mobile.tizen.targetRelativeCoordsFromEvent( e ) );
+
+				var factor = ( ( 0 === idx ) ? 360 : 1 ),
+					potential = ( isSelector
+							? ( ( this.dragging_hsv[idx] / factor) +
+									( ( coords.x - this.selectorDraggingOffset.x ) / this._ui[chan].eventSource.width() ) )
+									: ( coords.x / this._ui[chan].eventSource.width() ) );
+
+				this.dragging_hsv[idx] = Math.min( 1.0, Math.max( 0.0, potential ) ) * factor;
+
+				if ( !isSelector ) {
+					this.selectorDraggingOffset.x = Math.ceil( this._ui[chan].selector.outerWidth() / 2.0 );
+					this.selectorDraggingOffset.y = Math.ceil( this._ui[chan].selector.outerHeight() / 2.0 );
+				}
+
+				this._updateSelectors( this.dragging_hsv );
+				e.stopPropagation();
+				e.preventDefault();
+			}
+		},
+
+		_updateSelectors: function ( hsv ) {
+			var clrlib = $.tizen.colorwidget.clrlib,
+				clrwidget = $.tizen.colorwidget.prototype,
+				clr = clrlib.HSVToHSL( hsv ),
+				hclr = clrlib.HSVToHSL( [hsv[0], 1.0, 1.0] ),
+				vclr = clrlib.HSVToHSL( [hsv[0], hsv[1], 1.0] );
+
+			this._ui.hue.selector.css( { left : this._ui.hue.eventSource.width() * hsv[0] / 360} );
+			clrwidget._setElementColor.call( this, this._ui.hue.selector,  clr, "background" );
+			if ( $.mobile.browser.ie ) {
+				this._ui.hue.hue.find( "*" ).css( "opacity", hsv[1] );
+			} else {
+				this._ui.hue.hue.css( "opacity", hsv[1] );
+			}
+
+			this._ui.hue.valMask.css( "opacity", 1.0 - hsv[2] );
+
+			this._ui.sat.selector.css( { left : this._ui.sat.eventSource.width() * hsv[1]} );
+			clrwidget._setElementColor.call( this, this._ui.sat.selector,  clr, "background" );
+			clrwidget._setElementColor.call( this, this._ui.sat.hue, hclr, "background" );
+			this._ui.sat.valMask.css( "opacity", 1.0 - hsv[2] );
+
+			this._ui.val.selector.css( { left : this._ui.val.eventSource.width() * hsv[2]} );
+			clrwidget._setElementColor.call( this, this._ui.val.selector,  clr, "background" );
+			clrwidget._setElementColor.call( this, this._ui.val.hue, vclr, "background" );
+			clrwidget._setColor.call( this, clrlib.RGBToHTML( clrlib.HSLToRGB(clr) ) );
+		},
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.container[value ? "addClass" : "removeClass"]( "ui-disabled" );
+			this._ui.hue.hue.huegradient( "option", "disabled", value );
+			$.tizen.colorwidget.prototype._displayDisabledState.call( this, this._ui.container );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				this.dragging_hsv = $.tizen.colorwidget.clrlib.RGBToHSV( $.tizen.colorwidget.clrlib.HTMLToRGB( this.options.color ) );
+				this._updateSelectors( this.dragging_hsv );
+			}
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.hsvpicker.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.hsvpicker();
+	} );
+
+}( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/*
+ * Notification widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'imageslider'
+ *  data-start-index: start index
+ *  data-vertical-align: set to top or middle or bottom.
+ *
+ * APIs
+ *
+ *  add(image_file): add the image (parameter: url of iamge)
+ *  del(image_index): delete the image (parameter: index of image)
+ *  refresh(): refresh the widget, should be called after add or del.
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Example
+ *
+ * <div data-role="imageslider" id="imageslider" data-start-index="3" data-vertical-align="middle">
+ *	<img src="01.jpg">
+ *	<img src="02.jpg">
+ *	<img src="03.jpg">
+ *	<img src="04.jpg">
+ *	<img src="05.jpg">
+ * </div>
+ *
+ *
+ * $('#imageslider-add').bind('vmouseup', function ( e ) {
+ *	$('#imageslider').imageslider('add', '9.jpg');
+ *	$('#imageslider').imageslider('add', '10.jpg');
+ *	$('#imageslider').imageslider('refresh');
+ * });
+ *
+ * $('#imageslider-del').bind('vmouseup', function ( e ) {
+ *	$('#imageslider').imageslider('del');
+ * });
+ *
+ */
+
+(function ( $, window, undefined ) {
+	$.widget( "tizen.imageslider", $.mobile.widget, {
+		options: {
+			photoFlicking: false
+		},
+
+		dragging: false,
+		moving: false,
+		max_width: 0,
+		max_height: 0,
+		org_x: 0,
+		org_time: null,
+		cur_img: null,
+		prev_img: null,
+		next_img: null,
+		images: [],
+		images_hold: [],
+		index: 0,
+		align_type: null,
+		direction: 1,
+		container: null,
+		interval: null,
+
+		_resize: function ( obj ) {
+			var width,
+				height,
+				margin = 40,
+				ratio,
+				img_max_width = this.max_width - margin,
+				img_max_height = this.max_height - margin;
+
+			height = obj.height();
+			width = obj.width();
+
+			ratio = height / width;
+
+			if ( width > img_max_width ) {
+				obj.width( img_max_width );
+				obj.height( img_max_width * ratio );
+			}
+
+			height = obj.height();
+
+			if ( height > img_max_height ) {
+				obj.height( img_max_height );
+				obj.width( img_max_height / ratio );
+			}
+		},
+
+		_align: function ( obj, img ) {
+			var img_top = 0;
+
+			if ( !obj.length ) {
+				return;
+			}
+
+			if ( this.align_type == "middle" ) {
+				img_top = ( this.max_height - img.height() ) / 2;
+			} else if ( this.align_type == "bottom" ) {
+				img_top = this.max_height - img.height();
+			} else {
+				img_top = 0;
+			}
+
+			obj.css( 'top', img_top + 'px' );
+		},
+
+		_detach: function ( image_index, obj ) {
+			if ( !obj.length ) {
+				return;
+			}
+			if ( image_index < 0 ) {
+				return;
+			}
+			if ( image_index >= this.images.length ) {
+				return;
+			}
+
+			this.images[image_index].detach();
+			obj.css( "display", "none" );
+		},
+
+		_attach: function ( image_index, obj ) {
+			if ( !obj.length ) {
+				return;
+			}
+			if ( image_index < 0 ) {
+				return;
+			}
+			if ( image_index >= this.images.length ) {
+				return;
+			}
+
+			obj.css( "display", "block" );
+			obj.append( this.images[image_index] );
+			this._resize( this.images[image_index] );
+			this._align( obj, this.images[image_index] );
+		},
+
+		_drag: function ( _x ) {
+			var delta,
+				coord_x;
+
+			if ( !this.dragging ) {
+				return;
+			}
+
+			if ( this.options.photoFlicking === false ) {
+				delta = this.org_x - _x;
+
+				// first image
+				if ( delta < 0 && !this.prev_img.length ) {
+					return;
+				}
+				// last image
+				if ( delta > 0 && !this.next_img.length ) {
+					return;
+				}
+			}
+
+			coord_x = _x - this.org_x;
+
+			this.cur_img.css( 'left', coord_x + 'px' );
+			if ( this.next_img.length ) {
+				this.next_img.css( 'left', coord_x + this.max_width + 'px' );
+			}
+			if ( this.prev_img.length ) {
+				this.prev_img.css( 'left', coord_x - this.max_width + 'px' );
+			}
+		},
+
+		_move: function ( _x ) {
+			var delta = this.org_x - _x,
+				flip = 0,
+				date,
+				drag_time,
+				sec,
+				self;
+
+			if ( delta == 0 ) {
+				return;
+			}
+
+			if ( delta > 0 ) {
+				flip = delta < ( this.max_width * 0.45 ) ? 0 : 1;
+			} else {
+				flip = -delta < ( this.max_width * 0.45 ) ? 0 : 1;
+			}
+
+			if ( !flip ) {
+				date = new Date();
+				drag_time = date.getTime() - this.org_time;
+
+				if ( Math.abs( delta ) / drag_time > 1 ) {
+					flip = 1;
+				}
+			}
+
+			if ( flip ) {
+				if ( delta > 0 && this.next_img.length ) {
+					/* next */
+					this._detach( this.index - 1, this.prev_img );
+
+					this.prev_img = this.cur_img;
+					this.cur_img = this.next_img;
+					this.next_img = this.next_img.next();
+
+					this.index++;
+
+					if ( this.next_img.length ) {
+						this.next_img.css( 'left', this.max_width + 'px' );
+						this._attach( this.index + 1, this.next_img );
+					}
+
+					this.direction = 1;
+
+				} else if ( delta < 0 && this.prev_img.length ) {
+					/* prev */
+					this._detach( this.index + 1, this.next_img );
+
+					this.next_img = this.cur_img;
+					this.cur_img = this.prev_img;
+					this.prev_img = this.prev_img.prev();
+
+					this.index--;
+
+					if ( this.prev_img.length ) {
+						this.prev_img.css( 'left', -this.max_width + 'px' );
+						this._attach( this.index - 1, this.prev_img );
+					}
+
+					this.direction = -1;
+				}
+			}
+
+			sec = 500;
+			self = this;
+
+			this.moving = true;
+
+			this.interval = setInterval( function () {
+				self.moving = false;
+				clearInterval( self.interval );
+			}, sec - 50 );
+
+			this.cur_img.animate( { left: 0 }, sec );
+			if ( this.next_img.length ) {
+				this.next_img.animate( { left: this.max_width }, sec );
+			}
+			if ( this.prev_img.length ) {
+				this.prev_img.animate( { left: -this.max_width }, sec );
+			}
+		},
+
+		_add_event: function () {
+			var self = this,
+				date;
+
+			this.container.bind( 'vmousemove', function ( e ) {
+				e.preventDefault();
+
+				if ( self.moving ) {
+					return;
+				}
+				if ( !self.dragging ) {
+					return;
+				}
+
+				self._drag( e.pageX );
+			} );
+
+			this.container.bind( 'vmousedown', function ( e ) {
+				e.preventDefault();
+
+				if ( self.moving ) {
+					return;
+				}
+
+				self.dragging = true;
+
+				self.org_x = e.pageX;
+
+				date = new Date();
+				self.org_time = date.getTime();
+			} );
+
+			this.container.bind( 'vmouseup', function ( e ) {
+				if ( self.moving ) {
+					return;
+				}
+
+				self.dragging = false;
+
+				self._move( e.pageX );
+			} );
+
+			this.container.bind( 'vmouseout', function ( e ) {
+				if ( self.moving ) {
+					return;
+				}
+				if ( !self.dragging ) {
+					return;
+				}
+
+				if ( ( e.pageX < 20 ) ||
+						( e.pageX > ( self.max_width - 20 ) ) ) {
+					self._move( e.pageX );
+					self.dragging = false;
+				}
+			} );
+		},
+
+		_del_event: function () {
+			this.container.unbind( 'vmousemove' );
+			this.container.unbind( 'vmousedown' );
+			this.container.unbind( 'vmouseup' );
+			this.container.unbind( 'vmouseout' );
+		},
+
+		_show: function () {
+			this.cur_img = $( 'div' ).find( '.ui-imageslider-bg:eq(' + this.index + ')' );
+			this.prev_img = this.cur_img.prev();
+			this.next_img = this.cur_img.next();
+
+			this._attach( this.index - 1, this.prev_img );
+			this._attach( this.index, this.cur_img );
+			this._attach( this.index + 1, this.next_img );
+
+			if ( this.prev_img.length ) {
+				this.prev_img.css( 'left', -this.max_width + 'px' );
+			}
+
+			this.cur_img.css( 'left', '0px' );
+
+			if ( this.next_img.length ) {
+				this.next_img.css( 'left', this.max_width + 'px' );
+			}
+		},
+
+		show: function () {
+			this._show();
+			this._add_event();
+		},
+
+		_hide: function () {
+			this._detach( this.index - 1, this.prev_img );
+			this._detach( this.index, this.cur_img );
+			this._detach( this.index + 1, this.next_img );
+		},
+
+		hide: function () {
+			this._hide();
+			this._del_event();
+		},
+
+		_get_height: function () {
+			var $page = $( '.ui-page' ),
+				$content = $page.children( '.ui-content' ),
+				$header = $page.children( '.ui-header' ),
+				$footer = $page.children( '.ui-footer' ),
+				header_h = $header.outerHeight(),
+				footer_h = $footer.outerHeight(),
+				padding = parseFloat( $content.css( 'padding-top' ) ) + parseFloat( $content.css( 'padding-bottom' ) ),
+				content_h = $( window ).height() - header_h - footer_h - padding * 2;
+
+			return content_h;
+		},
+
+		_create: function () {
+			var temp_img,
+				start_index,
+				i = 0;
+
+			$( this.element ).wrapInner( '<div class="ui-imageslider"></div>' );
+			$( this.element ).find( 'img' ).wrap( '<div class="ui-imageslider-bg"></div>' );
+
+			this.container = $( this.element ).find('.ui-imageslider');
+
+			this.max_width = $( window ).width();
+			this.max_height = this._get_height();
+			this.container.css( 'height', this.max_height );
+
+			temp_img = $( 'div' ).find( '.ui-imageslider-bg:first' );
+
+			while ( temp_img.length ) {
+				this.images[i] = temp_img.find( 'img' );
+				temp_img = temp_img.next();
+				i++;
+			}
+
+			for ( i = 0; i < this.images.length; i++ ) {
+				this.images[i].detach();
+			}
+
+			start_index = parseInt( $( this.element ).attr( 'data-start-index' ), 10 );
+			if ( start_index === undefined ) {
+				start_index = 0;
+			}
+			if ( start_index < 0 ) {
+				start_index = 0;
+			}
+			if ( start_index >= this.images.length ) {
+				start_index = this.images.length - 1;
+			}
+
+			this.index = start_index;
+
+			this.align_type = $( this.element ).attr( 'data-vertical-align' );
+		},
+
+		_update: function () {
+			var image_file,
+				bg_html,
+				temp_img;
+
+			while ( this.images_hold.length ) {
+				image_file = this.images_hold.shift();
+
+				bg_html = $( '<div class="ui-imageslider-bg"></div>' );
+				temp_img = $( '<img src="' + image_file + '"></div>' );
+
+				bg_html.append( temp_img );
+				this.container.append( bg_html );
+				this.images.push( temp_img );
+			}
+		},
+
+		refresh: function ( start_index ) {
+			this._update();
+
+			this._hide();
+
+			if ( start_index === undefined ) {
+				start_index = this.index;
+			}
+			if ( start_index < 0 ) {
+				start_index = 0;
+			}
+			if ( start_index >= this.images.length ) {
+				start_index = this.images.length - 1;
+			}
+
+			this.index = start_index;
+
+			this._show();
+		},
+
+		add: function ( image_file ) {
+			this.images_hold.push( image_file );
+		},
+
+		del: function ( image_index ) {
+			var temp_img;
+
+			if ( image_index === undefined ) {
+				image_index = this.index;
+			}
+
+			if ( image_index < 0 || image_index >= this.images.length ) {
+				return;
+			}
+
+			if ( image_index == this.index ) {
+				temp_img = this.cur_img;
+
+				if ( this.index == 0 ) {
+					this.direction = 1;
+				} else if ( this.index == this.images.length - 1 ) {
+					this.direction = -1;
+				}
+
+				if ( this.direction < 0 ) {
+					this.cur_img = this.prev_img;
+					this.prev_img = this.prev_img.prev();
+					if ( this.prev_img.length ) {
+						this.prev_img.css( 'left', -this.max_width );
+						this._attach( image_index - 2, this.prev_img );
+					}
+					this.index--;
+				} else {
+					this.cur_img = this.next_img;
+					this.next_img = this.next_img.next();
+					if ( this.next_img.length ) {
+						this.next_img.css( 'left', this.max_width );
+						this._attach( image_index + 2, this.next_img );
+					}
+				}
+
+				this.cur_img.animate( { left: 0 }, 500 );
+
+			} else if ( image_index == this.index - 1 ) {
+				temp_img = this.prev_img;
+				this.prev_img = this.prev_img.prev();
+				if ( this.prev_img.length ) {
+					this.prev_img.css( 'left', -this.max_width );
+					this._attach( image_index - 1, this.prev_img );
+				}
+				this.index--;
+
+			} else if ( image_index == this.index + 1 ) {
+				temp_img = this.next_img;
+				this.next_img = this.next_img.next();
+				if ( this.next_img.length ) {
+					this.next_img.css( 'left', this.max_width );
+					this._attach( image_index + 1, this.next_img );
+				}
+
+			} else {
+				temp_img = $( 'div' ).find( '.ui-imageslider-bg:eq(' + image_index + ')' );
+			}
+
+			this.images.splice( image_index, 1 );
+			temp_img.detach();
+		}
+	}); /* End of widget */
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( e.target ).find( ":jqmData(role='imageslider')" ).imageslider();
+	});
+
+	$( document ).bind( "pageshow", function ( e ) {
+		$( e.target ).find( ":jqmData(role='imageslider')" ).imageslider( 'show' );
+	});
+
+	$( document ).bind( "pagebeforehide", function ( e ) {
+		$( e.target ).find( ":jqmData(role='imageslider')" ).imageslider( 'hide' );
+	} );
+
+}( jQuery, this ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Horizontal/vertical box layout extension.
+//
+// This will arrange the child elements of a container in a horizontal
+// or vertical row. This only makes sense if your container is a div
+// and contains children which are also divs; the children should
+// also have a height and width set in CSS, otherwise the layout
+// manager won't know what to do with them.
+//
+// Apply it by setting data-layout="hbox" or data-layout="vbox" (vertical
+// on a container element or calling $(element).layouthbox() or
+// $(element).layoutvbox().
+//
+// Usually, you would use a div as the container to get the right effect
+// (an element with display:block).
+//
+// Options can be set programmatically:
+//
+//   $(element).layouthbox('option', 'scrollable', false)
+//   $(element).layoutvbox('option', 'scrollable', false)
+//
+// or via a data-layout-options attribute on the container:
+//
+//   <div data-layout="hbox" data-layout-options='{"hgap":5}'>
+//       <div>child 1</div>
+//       <div>child 2</div>
+//   </div>
+//
+//   <div data-layout="vbox" data-layout-options='{"vgap":5}'>
+//       <div>child 1</div>
+//       <div>child 2</div>
+//   </div>
+//
+// If you change any options after creating the widget, call
+// $(element).layout*box('refresh') to have them picked up.
+// However, note that it's currently not feasible to turn off scrolling
+// once it's on (as calling scrollview('destroy') doesn't remove the
+// scrollview custom mouse handlers).
+//
+// There is one major difference between the horizontal and
+// vertical box layouts: if scrollable=false, the horizontal layout
+// will clip children which overflow the edge of the parent container;
+// by comparison, the vertical container will grow vertically to
+// accommodate the height of its children. This mirrors the behaviour
+// of jQuery Mobile, where elements only ever expand horizontally
+// to fill the width of the window; but will expand vertically forever,
+// unless the page height is artificially constrained.
+//
+// Options:
+//
+//   {Integer} hgap (default=0)
+//   Horizontal gap (in pixels) between the child elements. Only has
+//   an effect on hbox.
+//
+//   {Integer} vgap (default=0)
+//   Vertical gap (in pixels) between the child elements. Only has
+//   an effect on vbox.
+//
+//   {Boolean} scrollable (default=true; can only be set at create time)
+//   Set to true to enable a scrollview on the
+//   container. If false, children will be clipped if
+//   they fall outside the edges of the container after
+//   layouting.
+//
+//   {Boolean} showScrollBars (default=true)
+//   Set to false to hide scrollbars on the container's scrollview.
+//   Has no effect is scrollable=false
+
+(function ( $, undefined ) {
+
+	// hbox
+	$.widget( "tizen.layouthbox", $.tizen.jlayoutadaptor, {
+		fixed: {
+			type: 'flexGrid',
+			rows: 1,
+			direction: 'x',
+			initSelector: ':jqmData(layout="hbox")'
+		},
+
+		_create: function () {
+			if ( !this.options.hgap ) {
+				this.options.hgap = 0;
+			}
+
+			$.tizen.jlayoutadaptor.prototype._create.apply( this, arguments );
+		}
+	} );
+
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( $.tizen.layouthbox.prototype.fixed.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.layouthbox();
+	} );
+
+	// vbox
+	$.widget( "tizen.layoutvbox", $.tizen.jlayoutadaptor, {
+		fixed: {
+			type: 'flexGrid',
+			columns: 1,
+			direction: 'y',
+			initSelector: ':jqmData(layout="vbox")'
+		},
+
+		_create: function () {
+			if ( !this.options.vgap ) {
+				this.options.vgap = 0;
+			}
+
+			$.tizen.jlayoutadaptor.prototype._create.apply( this, arguments );
+		}
+	} );
+
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( $.tizen.layoutvbox.prototype.fixed.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.layoutvbox();
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION - listview controls
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// This extension supplies API to toggle the "mode" in which a list
+// is displayed. The modes available is configurable, but defaults
+// to ['edit', 'view']. A list can also have a control panel associated
+// with it. The visibility of the control panel is governed by the current
+// mode (by default, it is visible in 'edit' mode); elements within
+// the listview can also be marked up to be visible in one or more of the
+// available modes.
+//
+// One example use case would be a control panel with a "Select all" checkbox
+// which, when clicked, selects all of the checkboxes in the associated
+// listview items.
+//
+// The control panel itself should be defined as a form element.
+// By default, the control panel will be hidden when the listview is
+// initialised, unless you supply mode="edit" as a
+// data-listview-controls option (when using the default modes). If you
+// want the control panel to be visible in some mode other than
+// the default, use a data-listviewcontrols-show-in="<mode>" attribute
+// on the control panel element.
+//
+// Example usage (using the default 'edit' and 'view' modes):
+//
+// <!-- this is the controls element, displayed in 'edit' mode by default -->
+// <form id="listviewcontrols-control-panel">
+//   <fieldset data-role="controlgroup">
+//     <input type="checkbox" id="listviewcontrols-demo-checkbox-uber" />
+//     <label for="listviewcontrols-demo-checkbox-uber">Select all</label>
+//   </fieldset>
+// </form>
+//
+// <!-- this is the list associated with the controls -->
+// <ul data-role="listview" data-listviewcontrols="#listviewcontrols-control-panel">
+//
+//   <li>
+//
+//     <!-- this element is only visible in 'edit' mode -->
+//     <fieldset data-role="controlgroup" data-listviewcontrols-show-in="edit">
+//       <input type="checkbox" id="listviewcontrols-demo-checkbox-1" />
+//       <label for="listviewcontrols-demo-checkbox-1">Greg</label>
+//     </fieldset>
+//
+//     <!-- this element is only visible in 'view' mode -->
+//     <span data-listviewcontrols-show-in="view">Greg</span>
+//
+//   </li>
+//
+//   ... more li elements marked up the same way ...
+//
+// </ul>
+//
+// To associate the listview with the control panel, add
+// data-listviewcontrols="..selector.." to a listview, where
+// selector selects a single element (the control panel
+// you defined). You can then call
+// listviewcontrols('option', 'mode', '<mode>') on the
+// listview to set the mode.
+//
+// Inside the listview's items, add controls to each item
+// which are only visible when in one of the modes. To do this,
+// add form elements (e.g. checkboxes) to the items as you see fit. Then,
+// mark each form element with data-listviewcontrols-show-in="<mode>".
+// The control's visibility now depends on the mode of the listviewcontrols:
+// it is only shown when its <mode> setting matches the current mode
+// of the listviewcontrols widget. You are responsible for properly
+// styling the form elements inside the listview so the listview looks
+// correct when they are hidden or visible.
+//
+// The control panel (by default, visible when in "show" mode) is flexible
+// and can contain any valid form elements (or other jqm components). It's
+// up to you to define the behaviour associated with interactions on
+// the control panel and/or controls inside list items.
+//
+// Methods:
+//
+//   visibleListItems
+//     Returns a jQuery object containing all the li elements in the
+//     listview which are currently visible and not dividers. (This
+//     is just a convenience to make operating on the list as a whole
+//     slightly simpler.)
+//
+// Options (set in options hash passed to constructor, or via the
+// option method, or declaratively by attribute described below):
+//
+//   controlPanelSelector {String}
+//     Selector string for selecting the element representing the
+//     control panel for the listview. The context for find() is the
+//     document (to give the most flexibility), so your selector
+//     should be specific. Set declaratively with
+//       data-listviewcontrols="...selector...".
+//
+//   modesAvailable {String[]; default=['edit', 'view']}
+//     An array of the modes available for these controls.
+//
+//   mode {String; default='view'}
+//     Current mode for the widget, which governs the visibility
+//     of the listview control panel and any elements marked
+//     with data-listviewcontrols-show-in="<mode>".
+//     Set declaratively with
+//       data-listviewcontrols-options='{"mode":"<mode>"}'.
+//
+//   controlPanelShowIn {String; default=modesAvailable[0]}
+//     The mode in which the control panel is visible; defaults to the
+//     first element of modesAvailable. Can be set declaratively
+//     on the listview controls element with
+//       data-listviewcontrols-show-in="<mode>"
+
+(function ($) {
+
+	$.widget( "todons.listviewcontrols", $.mobile.widget, {
+		_defaults: {
+			controlPanelSelector: null,
+			modesAvailable: ['edit', 'view'],
+			mode: 'view',
+			controlPanelShowIn: null
+		},
+
+		_listviewCssClass: 'ui-listviewcontrols-listview',
+		_controlsCssClass: 'ui-listviewcontrols-panel',
+
+		_create: function () {
+			var self = this,
+				o = this.options,
+				optionsValid = true,
+				page = this.element.closest( '.ui-page' ),
+				controlPanelSelectorAttr = 'data-' + $.mobile.ns + 'listviewcontrols',
+				controlPanelSelector = this.element.attr( controlPanelSelectorAttr ),
+				dataOptions = this.element.jqmData( 'listviewcontrols-options' ),
+				controlPanelShowInAttr;
+
+			o.controlPanelSelector = o.controlPanelSelector || controlPanelSelector;
+
+			// precedence for options: defaults < jqmData attribute < options arg
+			o = $.extend( {}, this._defaults, dataOptions, o );
+
+			optionsValid = ( this._validOption( 'modesAvailable', o.modesAvailable, o ) &&
+					this._validOption( 'controlPanelSelector', o.controlPanelSelector, o ) &&
+					this._validOption( 'mode', o.mode, o ) );
+
+			if ( !optionsValid ) {
+				return false;
+			}
+
+			// get the controls element
+			this.controlPanel = $( document ).find( o.controlPanelSelector ).first();
+
+			if ( this.controlPanel.length === 0 ) {
+				return false;
+			}
+
+			// once we have the controls element, we may need to override the
+			// mode in which controls are shown
+			controlPanelShowInAttr = this.controlPanel.jqmData( 'listviewcontrols-show-in' );
+			if ( controlPanelShowInAttr ) {
+				o.controlPanelShowIn = controlPanelShowInAttr;
+			} else if ( !o.controlPanelShowIn ) {
+				o.controlPanelShowIn = o.modesAvailable[0];
+			}
+
+			if ( !this._validOption( 'controlPanelShowIn', o.controlPanelShowIn, o ) ) {
+				return;
+			}
+
+			// done setting options
+			this.options = o;
+
+			// mark the controls and the list with a class
+			this.element.removeClass(this._listviewCssClass).addClass(this._listviewCssClass);
+			this.controlPanel.removeClass(this._controlsCssClass).addClass(this._controlsCssClass);
+
+			// show the widget
+			if ( page && !page.is( ':visible' ) ) {
+				page.bind( 'pageshow', function () { self.refresh(); } );
+			} else {
+				this.refresh();
+			}
+		},
+
+		_validOption: function ( varName, value, otherOptions ) {
+			var ok = false,
+				i = 0;
+
+			if ( varName === 'mode' ) {
+				ok = ( $.inArray( value, otherOptions.modesAvailable ) >= 0 );
+			} else if ( varName === 'controlPanelSelector' ) {
+				ok = ( $.type( value ) === 'string' );
+			} else if ( varName === 'modesAvailable' ) {
+				ok = ( $.isArray( value ) && value.length > 1 );
+
+				if ( ok ) {
+					for ( i = 0; i < value.length; i++ ) {
+						if ( value[i] === '' || $.type( value[i] ) !== 'string' ) {
+							ok = false;
+						}
+					}
+				}
+			} else if ( varName === 'controlPanelShowIn' ) {
+				ok = ( $.inArray( value, otherOptions.modesAvailable ) >= 0 );
+			}
+
+			return ok;
+		},
+
+		_setOption: function ( varName, value ) {
+			var oldValue = this.options[varName];
+
+			if ( oldValue !== value && this._validOption( varName, value, this.options ) ) {
+				this.options[varName] = value;
+				this.refresh();
+			}
+		},
+
+		visibleListItems: function () {
+			return this.element.find( 'li:not(:jqmData(role=list-divider)):visible' );
+		},
+
+		refresh: function () {
+			var self = this,
+				triggerUpdateLayout = false,
+				isVisible = null,
+				showIn,
+				modalElements;
+
+			// hide/show the control panel and hide/show controls inside
+			// list items based on their "show-in" option
+			isVisible = this.controlPanel.is( ':visible' );
+
+			if ( this.options.mode === this.options.controlPanelShowIn ) {
+				this.controlPanel.show();
+			} else {
+				this.controlPanel.hide();
+			}
+
+			if ( this.controlPanel.is( ':visible' ) !== isVisible ) {
+				triggerUpdateLayout = true;
+			}
+
+			// we only operate on elements inside list items which aren't dividers
+			modalElements = this.element
+								.find( 'li:not(:jqmData(role=list-divider))' )
+								.find( ':jqmData(listviewcontrols-show-in)' );
+
+			modalElements.each(function () {
+				showIn = $( this ).jqmData( 'listviewcontrols-show-in' );
+
+				isVisible = $( this ).is( ':visible' );
+
+				if ( showIn === self.options.mode ) {
+					$( this ).show();
+				} else {
+					$( this ).hide();
+				}
+
+				if ( $( this ).is( ':visible' ) !== isVisible ) {
+					triggerUpdateLayout = true;
+				}
+			} );
+
+			if ( triggerUpdateLayout ) {
+				this.element.trigger( 'updatelayout' );
+			}
+		}
+	} );
+
+	$( 'ul' ).live( 'listviewcreate', function () {
+		var list = $(this);
+
+		if ( list.is( ':jqmData(listviewcontrols)' ) ) {
+			list.listviewcontrols();
+		}
+	} );
+
+}( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Kangsik Kim <kangsik81.kim@samsung.com>
+*/
+
+/**
+ *	Multibuttonentry widget is a kind of button widget.
+ *	When a user inputs a text and the text gets an change event,
+ *	the text can be changed from it to a button widget.
+ *
+ *	HTML Attributes:
+ *
+ *		data-listUrl : This attribute is represent a 'id' about page.
+ *				This page is containing prepared data for provide to user.
+ *				For example, like address book.
+ *		data-label:	This attribute is providing label for user-guide. (Default : 'To : ')
+ *		data-descMessage : This attribute is managing message format.
+ *				 This message is displayed when widget status was changed to 'focusout'.
+ *
+ *	APIs:
+ *
+ *		inputtext ( void )
+ *			: Get a string from inputbox.
+ *		inputtext (  [string]  )
+ *			: If argument is not exist, will get a string from inputbox.
+ *			If argument is exist, will set a string to inputbox.
+ *		select (  [number]  )
+ *			: If argument is not exist, will act  as a getter.
+ *			Get a string of selected block.
+ *			If widget is not exist a selected button, it will return 'null'.
+ *			Select a button located on the index. (number : index of button)
+ *		add ( text, [number] )
+ *			: If second argument is not exist, will insert to a new textblock at last position.
+ *			Insert a new button at position that is pointed by index. (number : index of button)
+ *		remove ( [number] )
+ *			: If argument is not exist, will remove all buttons.
+ *			Remove a button that is pointed by index. (number : index of button)
+ *		length ( void )
+ *			: Get a number of buttons.
+ *		foucsIn ( void )
+ *			: This method change a status to 'focusin'.
+ *			This status is able to manage a widget.
+ *		focusOut ( void )
+ *			: This method change a status to 'focusout'.
+ *			This status is not able to manage a widget.
+ *
+ *
+ *	Events:
+ *
+ *		select : This event will occur when select a button.
+ *		add : This event will occur when insert new button.
+ *		remove : This event will occur when remove a button.
+ *
+ *	Examples:
+ *
+ *		<div data-role="multibuttonentry" data-label="To : " data-listUrl:"#addressbook" data-descMessage="{0} & {1} more...">
+ *		</div>
+ *
+ */
+
+( function ( $, window, document, undefined ) {
+	$.widget( "tizen.multibuttonentry", $.mobile.widget, {
+		_focusStatus : null,
+		_items : null,
+		_viewWidth : 0,
+		_reservedWidth : 0,
+		_currentWidth : 0,
+		_fontSize : 0,
+		_anchorWidth : 0,
+		_labelWidth : 0,
+		_marginWidth : 0,
+		options : {
+			label : "To : ",
+			listUrl : "#addressbook",
+			descMessage : "{0} & {1} more..."
+		},
+		_create : function () {
+			var self = this,
+				$view = this.element,
+				role = $view.jqmData( "role" ),
+				option = this.options,
+				inputbox = $( document.createElement( "input" ) ),
+				labeltag = $( document.createElement( "label" ) ),
+				moreBlock = $( document.createElement( "a" ) );
+
+			$view.hide().empty().addClass( "ui-" + role );
+
+			// create a label tag.
+			$( labeltag ).text( this.options.label ).addClass( "ui-multibuttonentry-label" );
+			$view.append( labeltag );
+
+			// create a input tag
+			$( inputbox ).text( option.label ).addClass( "ui-multibuttonentry-input" );
+			$view.append( inputbox );
+
+			// create a anchor tag.
+			$( moreBlock ).text( "+" ).attr( "href", option.listUrl ).addClass( "ui-multibuttonentry-link" );
+
+			// append default htmlelements to main widget.
+			$view.append( moreBlock );
+
+			// bind a event
+			this._bindEvents();
+			self._focusStatus = "init";
+			// display widget
+			$view.show();
+			$view.attr( "tabindex", -1 ).focusin( function ( e ) {
+				self.focusIn();
+			});
+
+			// assign global variables
+			self._viewWidth = $view.innerWidth();
+			self._reservedWidth += self._calcBlockWidth( moreBlock );
+			self._reservedWidth += self._calcBlockWidth( labeltag );
+			self._fontSize = parseInt( $( moreBlock ).css( "font-size" ), 10 );
+			self._currentWidth = self._reservedWidth;
+		},
+		// bind events
+		_bindEvents : function () {
+			var self = this,
+				$view = self.element,
+				option = self.options,
+				inputbox = $view.find( ".ui-multibuttonentry-input" ),
+				moreBlock = $view.find( ".ui-multibuttonentry-link" );
+
+			inputbox.bind( "keydown", function ( event ) {
+				// 8  : backspace
+				// 13 : Enter
+				var keyValue = event.keyCode,
+					valueString = $( inputbox ).val();
+
+				if ( keyValue == 8 ) {
+					if ( valueString.length === 0 ) {
+						self._validateTargetBlock();
+					}
+				} else if ( keyValue == 13 ) {
+					if ( valueString.length !== 0 ) {
+						self._addTextBlock( valueString );
+					}
+					inputbox.val( "" );
+				} else {
+					self._unlockTextBlock();
+				}
+			});
+
+			moreBlock.click( function () {
+				$.mobile.changePage( option.listUrl, {
+					transition: "slide",
+					reverse: false,
+					changeHash: false
+				} );
+			} );
+
+			$( document ).bind( "pagechange.mbe", function ( event ) {
+				if ( $view.innerWidth() === 0 ) {
+					return ;
+				}
+				var inputBox = $view.find( ".ui-multibuttonentry-input" );
+				if ( self._labelWidth === 0 ) {
+					self._labelWidth = $view.find( ".ui-multibuttonentry-label" ).outerWidth( true );
+					self._anchorWidth = $view.find( ".ui-multibuttonentry-link" ).outerWidth( true );
+					self._marginWidth = parseInt( ( $( inputBox ).css( "margin-left" ) ), 10 );
+					self._marginWidth += parseInt( ( $( inputBox ).css( "margin-right" ) ), 10 );
+					self._viewWidth = $view.innerWidth();
+				}
+				self._modifyInputBoxWidth();
+			});
+		},
+		// create a textbutton and append this button to parent layer.
+		// @param arg1 : string
+		// @param arg2 : index
+		_addTextBlock : function ( messages, blcokIndex ) {
+			if ( arguments.length === 0 ) {
+				return;
+			}
+
+			if ( ! messages ) {
+				return ;
+			}
+
+			var self = this,
+				$view = self.element,
+				content = messages,
+				index = blcokIndex,
+				blocks = null,
+				dataBlock = null,
+				displayText = null,
+				textBlock = null;
+
+			if ( self._viewWidth === 0 ) {
+				self._viewWidth = $view.innerWidth();
+			}
+			// save src data
+			dataBlock = $( document.createElement( 'input' ) );
+			dataBlock.val( content ).addClass( "ui-multibuttonentry-data" ).hide();
+
+			// Create a new text HTMLDivElement.
+			textBlock = $( document.createElement( 'div' ) );
+			displayText = self._ellipsisTextBlock( content ) ;
+			textBlock.text( displayText ).addClass( "ui-multibuttonentry-block" );
+			textBlock.append( dataBlock );
+			// bind a event to HTMLDivElement.
+			textBlock.bind( "vclick", function ( event ) {
+				if ( self._focusStatus === "focusOut" ) {
+					self.focusInEvent();
+					return;
+				}
+
+				if ( $( this ).hasClass( "ui-multibuttonentry-sblock" ) ) {
+					// If block is selected, it will be removed.
+					self._removeTextBlock();
+				}
+
+				var lockBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+				if ( typeof lockBlock != "undefined" ) {
+					lockBlock.removeClass( "ui-multibuttonentry-sblock" ).addClass( "ui-multibuttonentry-block" );
+				}
+				$( this ).removeClass( "ui-multibuttonentry-block" ).addClass( "ui-multibuttonentry-sblock" );
+				self._trigger( "select" );
+			});
+
+			blocks = $view.find( "div" );
+			if ( index !== null && index <= blocks.length ) {
+				$( blocks[index] ).before( textBlock );
+			} else {
+				$view.find( ".ui-multibuttonentry-input" ).before( textBlock );
+			}
+
+			self._currentWidth += self._calcBlockWidth( textBlock );
+			self._modifyInputBoxWidth();
+			self._trigger( "add" );
+		},
+		_removeTextBlock : function () {
+			var self = this,
+				$view = this.element,
+				targetBlock = null,
+				lockBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+
+			if ( lockBlock !== null && lockBlock.length > 0 ) {
+				self._currentWidth -= self._calcBlockWidth( lockBlock );
+				lockBlock.remove();
+				self._modifyInputBoxWidth();
+				this._trigger( "remove" );
+			} else {
+				$view.find( "div:last" ).removeClass( "ui-multibuttonentry-block" ).addClass( "ui-multibuttonentry-sblock" );
+			}
+		},
+		_calcBlockWidth : function ( block ) {
+			var blockWidth = 0;
+			blockWidth = $( block ).outerWidth( true );
+			return blockWidth;
+		},
+		_unlockTextBlock : function () {
+			var $view = this.element,
+				lockBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+			if ( lockBlock !== null ) {
+				lockBlock.removeClass( "ui-multibuttonentry-sblock" ).addClass( "ui-multibuttonentry-block" );
+			}
+		},
+		// call when remove text block by backspace key.
+		_validateTargetBlock : function () {
+			var self = this,
+				$view = self.element,
+				lastBlock = $view.find( "div:last" ),
+				tmpBlock = null;
+
+			if ( lastBlock.hasClass( "ui-multibuttonentry-sblock" ) ) {
+				self._removeTextBlock();
+			} else {
+				tmpBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+				tmpBlock.removeClass( "ui-multibuttonentry-sblock" ).addClass( "ui-multibuttonentry-block" );
+				lastBlock.removeClass( "ui-multibuttonentry-block" ).addClass( "ui-multibuttonentry-sblock" );
+			}
+		},
+		_ellipsisTextBlock : function ( text ) {
+			var self = this,
+				str = text,
+				length = 0,
+				maxWidth = self._viewWidth,
+				maxCharCnt = parseInt( ( self._viewWidth / self._fontSize ), 10 ) - 5,
+				ellipsisStr = null;
+			if ( str ) {
+				length = str.length ;
+				if ( length > maxCharCnt ) {
+					ellipsisStr = str.substring( 0, maxCharCnt );
+					ellipsisStr += "...";
+				} else {
+					ellipsisStr = str;
+				}
+			}
+			return ellipsisStr;
+		},
+		_modifyInputBoxWidth : function () {
+			var self = this,
+				$view = self.element,
+				labelWidth = self._labelWidth,
+				anchorWidth = self._anchorWidth,
+				inputBoxWidth = self._viewWidth - labelWidth - anchorWidth,
+				blocks = $view.find( "div" ),
+				blockWidth = 0,
+				index = 0,
+				margin = self._marginWidth,
+				inputBox = $view.find( ".ui-multibuttonentry-input" );
+
+			if ( $view.width() === 0 ) {
+				return ;
+			}
+
+			for ( index = 0; index < blocks.length; index += 1 ) {
+				blockWidth = self._calcBlockWidth( blocks[index] );
+				inputBoxWidth = inputBoxWidth - blockWidth;
+				if ( inputBoxWidth <= 0 ) {
+					if ( inputBoxWidth + anchorWidth >= 0 ) {
+						inputBoxWidth = self._viewWidth - anchorWidth;
+					} else {
+						inputBoxWidth = self._viewWidth - blockWidth - anchorWidth;
+					}
+				}
+			}
+			$( inputBox ).width( inputBoxWidth - margin - 1 );
+		},
+		_stringFormat : function ( expression ) {
+			var pattern = null,
+				message = expression,
+				i = 0;
+			for ( i = 1; i < arguments.length; i += 1 ) {
+				pattern = "{" + ( i - 1 ) + "}";
+				message = message.replace( pattern, arguments[i] );
+			}
+			return message;
+		},
+		_resizeBlock : function () {
+			var self = this,
+				$view = self.element,
+				dataBlocks = $( ".ui-multibuttonentry-data" ),
+				blocks = $view.find( "div" ),
+				srcTexts = [],
+				index = 0;
+
+			$view.hide();
+			for ( index = 0 ; index < dataBlocks.length ; index += 1 ) {
+				srcTexts[index] = $( dataBlocks[index] ).val();
+				self._addTextBlock( srcTexts[index] );
+			}
+			blocks.remove();
+			$view.show();
+		},
+
+		//----------------------------------------------------//
+		//					Public Method					//
+		//----------------------------------------------------//
+		//
+		// Focus In Event
+		//
+		focusIn : function () {
+			if ( this._focusStatus === "focusIn" ) {
+				return;
+			}
+
+			var $view = this.element;
+
+			$view.find( "label" ).show();
+			$view.find( ".ui-multibuttonentry-desclabel" ).remove();
+			$view.find( "div.ui-multibuttonentry-sblock" ).removeClass( "ui-multibuttonentry-sblock" ).addClass( "ui-multibuttonentry-block" );
+			$view.find( "div" ).show();
+			$view.find( ".ui-multibuttonentry-input" ).show();
+			$view.find( "a" ).show();
+
+			// change focus state.
+			this._modifyInputBoxWidth();
+			this._focusStatus = "focusIn";
+		},
+		focusOut : function () {
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			var self = this,
+				$view = self.element,
+				tempBlock = null,
+				statement = "",
+				index = 0,
+				lastIndex = 10,
+				label = $view.find( "label" ),
+				more = $view.find( "span" ),
+				blocks = $view.find( "div" ),
+				currentWidth = $view.outerWidth( true ) - more.outerWidth( true ) - label.outerWidth( true ),
+				textWidth = currentWidth;
+
+			$view.find( ".ui-multibuttonentry-input" ).hide();
+			$view.find( "a" ).hide();
+			blocks.hide();
+
+			// div button
+			currentWidth = currentWidth - self._reservedWidth;
+			for ( index = 0; index < blocks.length; index += 1 ) {
+				currentWidth = currentWidth - $( blocks[index] ).outerWidth( true );
+				statement += ", " + $( blocks[index] ).text();
+				if ( currentWidth <= 0 ) {
+					statement = "," + $( blocks[0] ).text();
+					statement = self._stringFormat( self.options.descMessage, statement, blocks.length - 1 );
+					break;
+				}
+				lastIndex = statement.length;
+			}
+			tempBlock = $( document.createElement( 'input' ) );
+			tempBlock.val( statement.substr( 1, statement.length ) );
+			tempBlock.addClass( "ui-multibuttonentry-desclabel" ).addClass( "ui-multibuttonentry-desclabel" );
+			tempBlock.width( textWidth - ( self._reservedWidth ) );
+			tempBlock.attr( "disabled", true );
+			$view.find( "label" ).after( tempBlock );
+			// update foucs state
+			this._focusStatus = "focusOut";
+		},
+		inputText : function ( message ) {
+			var $view = this.element;
+
+			if ( arguments.length === 0 ) {
+				return $view.find( ".ui-multibuttonentry-input" ).val();
+			}
+			$view.find( ".ui-multibuttonentry-input" ).val( message );
+			return message;
+		},
+		select : function ( index ) {
+			var $view = this.element,
+				lockBlock = null,
+				blocks = null;
+
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			if ( arguments.length === 0 ) {
+				// return a selected block.
+				lockBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+				if ( lockBlock) {
+					return lockBlock.text();
+				}
+				return null;
+			}
+			// 1. unlock all blocks.
+			this._unlockTextBlock();
+			// 2. select pointed block.
+			blocks = $view.find( "div" );
+			if ( blocks.length > index ) {
+				$( blocks[index] ).removeClass( "ui-multibuttonentry-block" ).addClass( "ui-multibuttonentry-sblock" );
+				this._trigger( "select" );
+			}
+			return null;
+		},
+		add : function ( message, position ) {
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			this._addTextBlock( message, position );
+		},
+		remove : function ( position ) {
+			var self = this,
+				$view = this.element,
+				blocks = $view.find( "div" ),
+				index = 0;
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			if ( arguments.length === 0 ) {
+				blocks.remove();
+				this._trigger( "clear" );
+			} else if ( typeof position == "number" ) {
+				// remove selected button
+				index = ( ( position < blocks.length ) ? position : ( blocks.length - 1 ) );
+				$( blocks[index] ).remove();
+				this._trigger( "remove" );
+			}
+			self._modifyInputBoxWidth();
+		},
+		length : function () {
+			return this.element.find( "div" ).length;
+		},
+		refresh : function () {
+			var self = this;
+			self.element.hide();
+			self.element.show();
+		},
+		destory : function () {
+			var $view = this.element;
+
+			$view.find( "label" ).remove();
+			$view.find( "div" ).unbind( "vclick" ).remove();
+			$view.find( "a" ).remove();
+			$view.find( ".ui-multibuttonentry-input" ).unbind( "keydown" ).remove();
+
+			this._trigger( "destory" );
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function () {
+		$( ":jqmData(role='multibuttonentry')" ).multibuttonentry();
+	});
+
+	$( window ).bind( "resize", function () {
+		$( ":jqmData(role='multibuttonentry')" ).multibuttonentry( "refresh" );
+	});
+} ( jQuery, window, document ) );
+/*
+ * Authors: Yonghwi Park <yonghwi0324.park@samsung.com>
+ *		 Wonseop Kim <wonseop.kim@samsung.com>
+ */
+
+/**
+ * MultiMediaView is a widget that provides an audio or a video content handling features.
+ * A multi-media content handled with this widget can be played with HTML5's <audio> or <video> tag.
+ * If a user wants to play a music file, he should use "<audio>" tag.
+ * And he should use "<video>" tag to play a video file.
+ *
+ * HTML Attributes:
+ *			data-theme : Set a theme of widget.
+ *				If this value is not defined, widget will use parent`s theme. (optional)
+ *			data-controls : If this value is 'true', widget will use belonging controller.
+ *				If this value is 'false', widget will use browser`s controller.
+ *				Default value is 'true'.
+ *			data-fullscreen : Set a status that fullscreen when inital start.
+ *				Default value is 'false'.
+ *
+ * APIs:
+ *			width( [number] )
+ *					: Get or set a widget of widget.
+ *			height( [number] )
+ *					: Get or set a height of widget.
+ *			size( number, number )
+ *					: Set a size of widget and resize a widget.
+ *					 First argument is width and second argument is height.
+ *			fullscreen( [boolean] )
+ *					: Set a status that fullscreen.
+ *
+ * Events:
+ *
+ *			create :  triggered when a multimediaview is created.
+ *
+ * Examples:
+ *
+ *			VIDEO :
+ *				<video data-controls="true" style="width:100%;">
+ *					<source src="media/oceans-clip.mp4" type="video/mp4" />
+ *					Your browser does not support the video tag.
+ *				</video>
+ *
+ *			AUDIO :
+ *				<audio data-controls="true" style="width:100%;">
+ *					<source src="media/Over the horizon.mp3" type="audio/mp3" />
+ *					Your browser does not support the audio tag.
+ *				</audio>
+ *
+ */
+
+( function ( $, document, window, undefined ) {
+	$.widget( "tizen.multimediaview", $.mobile.widget, {
+		options : {
+			theme : null,
+			controls : true,
+			fullscreen : false,
+			initSelector : "video, audio"
+		},
+		_create : function () {
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				option = self.options,
+				role = "multimediaview",
+				control = null;
+
+			$.extend( this, {
+				role : null,
+				isControlHide : false,
+				controlTimer : null,
+				isVolumeHide : true,
+				isVertical : true,
+				backupView : null
+			});
+
+			self.role = role;
+			view.addClass( "ui-multimediaview" );
+			control = self._createControl();
+
+			if ( view[0].nodeName === "AUDIO" ) {
+				control.addClass( "ui-multimediaview-audio" );
+			}
+
+			control.hide();
+			view.wrap( "<div class='ui-multimediaview-wrap'>" ).after( control );
+			if ( option.controls ) {
+				if ( view.attr("controls") ) {
+					view.removeAttr( "controls" );
+				}
+			}
+
+			self._addEvent();
+
+			$( document ).bind( "pagechange.multimediaview", function ( e ) {
+				var $page = $( e.target );
+				if ( $page.find( view ).length > 0 && viewElement.autoplay ) {
+					viewElement.play();
+				}
+
+				if ( option.controls ) {
+					control.show();
+					self._resize();
+				}
+			}).bind( "pagebeforechange.multimediaview", function ( e ) {
+				if ( viewElement.played.length !== 0 ) {
+					viewElement.pause();
+					control.hide();
+				}
+			});
+			$( window ).bind( "resize.multimediaview orientationchange.multimediaview", function ( e ) {
+				if ( !option.controls ) {
+					return;
+				}
+				var $page = $( e.target ),
+					$scrollview = view.parents( ".ui-scrollview-clip" );
+
+				$scrollview.each( function ( i ) {
+					if ( $.data( this, "scrollview" ) ) {
+						$( this ).scrollview( "scrollTo", 0, 0 );
+					}
+				});
+
+				// for maintaining page layout
+				if ( !option.fullscreen ) {
+					$( ".ui-footer:visible" ).show();
+				} else {
+					$( ".ui-footer" ).hide();
+					self._fitContentArea( $page );
+				}
+
+				self._resize();
+			});
+		},
+		_resize : function () {
+			var view = this.element,
+				parent = view.parent(),
+				control = parent.find( ".ui-multimediaview-control" ),
+				viewWidth = 0,
+				viewHeight = 0,
+				viewOffset = null;
+
+			this._resizeFullscreen( this.options.fullscreen );
+			viewWidth = ( ( view[0].nodeName === "VIDEO" ) ? view.width() : parent.width() );
+			viewHeight = ( ( view[0].nodeName === "VIDEO" ) ? view.height() : control.height() );
+			viewOffset = view.offset();
+
+			this._resizeControl( viewOffset, viewWidth, viewHeight );
+
+			this._updateSeekBar();
+			this._updateVolumeState();
+		},
+		_resizeControl : function ( offset, width, height ) {
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				buttons = control.find( ".ui-button" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationLabel = control.find( ".ui-durationlabel" ),
+				controlWidth = width,
+				controlHeight = control.outerHeight( true ),
+				availableWidth = 0,
+				controlOffset = null;
+
+			if ( control ) {
+				if ( view[0].nodeName === "VIDEO" ) {
+					controlOffset = control.offset();
+					controlOffset.left = offset.left;
+					controlOffset.top = offset.top + height - controlHeight;
+					control.offset( controlOffset );
+				}
+
+				control.width( controlWidth );
+			}
+
+			if ( seekBar ) {
+				availableWidth = control.width() - ( buttons.outerWidth( true ) * buttons.length );
+				availableWidth -= ( parseInt( buttons.eq( 0 ).css( "margin-left" ), 10 ) + parseInt( buttons.eq( 0 ).css( "margin-right" ), 10 ) ) * buttons.length;
+				if ( !self.isVolumeHide ) {
+					availableWidth -= volumeControl.outerWidth( true );
+				}
+				seekBar.width( availableWidth );
+			}
+
+			if ( durationLabel && !isNaN( viewElement.duration ) ) {
+				durationLabel.find( "p" ).text( self._convertTimeFormat( viewElement.duration ) );
+			}
+
+			if ( viewElement.autoplay && viewElement.paused === false ) {
+				playpauseButton.removeClass( "ui-play-icon" ).addClass( "ui-pause-icon" );
+			}
+		},
+		_resizeFullscreen : function ( isFullscreen ) {
+			var self = this,
+				view = self.element,
+				parent = view.parent(),
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				timestampLabel = control.find( ".ui-timestamplabel" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationBar = seekBar.find( ".ui-duration" ),
+				currenttimeBar = seekBar.find( ".ui-currenttime" ),
+				docWidth = 0,
+				docHeight = 0;
+
+			if ( isFullscreen ) {
+				if ( !self.backupView ) {
+					self.backupView = {
+						width : view[0].style.getPropertyValue( "width" ) || "",
+						height : view[0].style.getPropertyValue( "height" ) || "",
+						position : view.css( "position" ),
+						zindex : view.css( "z-index" )
+					};
+				}
+				docWidth = $( "body" )[0].clientWidth;
+				docHeight = $( "body" )[0].clientHeight;
+
+				view.width( docWidth ).height( docHeight - 1 );
+				view.addClass( "ui-" + self.role + "-fullscreen" );
+				view.offset( {
+					top : 0,
+					left : 0
+				});
+			} else {
+				if ( !self.backupView ) {
+					return;
+				}
+
+				view.removeClass( "ui-" + self.role + "-fullscreen" );
+				view.css( {
+					"width" : self.backupView.width,
+					"height" : self.backupView.height,
+					"position": self.backupView.position,
+					"z-index": self.backupView.zindex
+				});
+				self.backupView = null;
+			}
+			parent.show();
+		},
+		_addEvent : function () {
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				timestampLabel = control.find( ".ui-timestamplabel" ),
+				durationLabel = control.find( ".ui-durationlabel" ),
+				volumeButton = control.find( ".ui-volumebutton" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				volumeBar = volumeControl.find( ".ui-volumebar" ),
+				volumeGuide = volumeControl.find( ".ui-guide" ),
+				volumeHandle = volumeControl.find( ".ui-handler" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationBar = seekBar.find( ".ui-duration" ),
+				currenttimeBar = seekBar.find( ".ui-currenttime" );
+
+			view.bind( "loadedmetadata.multimediaview", function ( e ) {
+				if ( !isNaN( viewElement.duration ) ) {
+					durationLabel.find( "p" ).text( self._convertTimeFormat( viewElement.duration ) );
+				}
+				self._resize();
+			}).bind( "timeupdate.multimediaview", function ( e ) {
+				self._updateSeekBar();
+			}).bind( "play.multimediaview", function ( e ) {
+				playpauseButton.removeClass( "ui-play-icon" ).addClass( "ui-pause-icon" );
+			}).bind( "pause.multimediaview", function ( e ) {
+				playpauseButton.removeClass( "ui-pause-icon" ).addClass( "ui-play-icon" );
+			}).bind( "ended.multimediaview", function ( e ) {
+				if ( typeof viewElement.loop == "undefined" || viewElement.loop === "" ) {
+					self.stop();
+				}
+			}).bind( "volumechange.multimediaview", function ( e ) {
+				if ( viewElement.volume < 0.1 ) {
+					viewElement.muted = true;
+					volumeButton.removeClass( "ui-volume-icon" ).addClass( "ui-mute-icon" );
+				} else {
+					viewElement.muted = false;
+					volumeButton.removeClass( "ui-mute-icon" ).addClass( "ui-volume-icon" );
+				}
+
+				if ( !self.isVolumeHide ) {
+					self._updateVolumeState();
+				}
+			}).bind( "durationchange.multimediaview", function ( e ) {
+				if ( !isNaN( viewElement.duration ) ) {
+					durationLabel.find( "p" ).text( self._convertTimeFormat( viewElement.duration ) );
+				}
+				self._resize();
+			}).bind( "error.multimediaview", function ( e ) {
+				switch ( e.target.error.code ) {
+				case e.target.error.MEDIA_ERR_ABORTED :
+					window.alert( 'You aborted the video playback.' );
+					break;
+				case e.target.error.MEDIA_ERR_NETWORK :
+					window.alert( 'A network error caused the video download to fail part-way.' );
+					break;
+				case e.target.error.MEDIA_ERR_DECODE :
+					window.alert( 'The video playback was aborted due to a corruption problem or because the video used features your browser did not support.' );
+					break;
+				case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED :
+					window.alert( 'The video could not be loaded, either because the server or network failed or because the format is not supported.' );
+					break;
+				default :
+					window.alert( 'An unknown error occurred.' );
+					break;
+				}
+			}).bind( "vclick.multimediaview", function ( e ) {
+				if ( !self.options.controls ) {
+					return;
+				}
+
+				control.fadeToggle( "fast", function () {
+					var offset = control.offset();
+					self.isControlHide = !self.isControlHide;
+					if ( self.options.mediatype == "video" ) {
+						self._startTimer();
+					}
+				});
+				self._resize();
+			});
+
+			playpauseButton.bind( "vclick.multimediaview", function () {
+				self._endTimer();
+
+				if ( viewElement.paused ) {
+					viewElement.play();
+				} else {
+					viewElement.pause();
+				}
+
+				if ( self.options.mediatype == "video" ) {
+					self._startTimer();
+				}
+			});
+
+			fullscreenButton.bind( "vclick.multimediaview", function () {
+				self.fullscreen( !self.options.fullscreen );
+				control.fadeIn( "fast" );
+				self._endTimer();
+			});
+
+			seekBar.bind( "vmousedown.multimediaview", function ( e ) {
+				var x = e.clientX,
+					duration = viewElement.duration,
+					durationOffset = durationBar.offset(),
+					durationWidth = durationBar.width(),
+					timerate = ( x - durationOffset.left ) / durationWidth,
+					time = duration * timerate;
+
+				viewElement.currentTime = time;
+
+				self._endTimer();
+
+				e.preventDefault();
+				e.stopPropagation();
+
+				$( document ).bind( "vmousemove.multimediaview", function ( e ) {
+					var x = e.clientX,
+						timerate = ( x - durationOffset.left ) / durationWidth;
+
+					viewElement.currentTime = duration * timerate;
+
+					e.preventDefault();
+					e.stopPropagation();
+				}).bind( "vmouseup.multimediaview", function () {
+					$( document ).unbind( "vmousemove.multimediaview vmouseup.multimediaview" );
+					if ( viewElement.paused ) {
+						viewElement.pause();
+					} else {
+						viewElement.play();
+					}
+				});
+			});
+
+			volumeButton.bind( "vclick.multimediaview", function () {
+				if ( self.isVolumeHide ) {
+					var view = self.element,
+						volume = viewElement.volume;
+
+					self.isVolumeHide = false;
+					self._resize();
+					volumeControl.fadeIn( "fast" );
+					self._updateVolumeState();
+					self._updateSeekBar();
+				} else {
+					self.isVolumeHide = true;
+					volumeControl.fadeOut( "fast", function () {
+						self._resize();
+					});
+					self._updateSeekBar();
+				}
+			});
+
+			volumeBar.bind( "vmousedown.multimediaview", function ( e ) {
+				var baseX = e.clientX,
+					volumeGuideLeft = volumeGuide.offset().left,
+					volumeGuideWidth = volumeGuide.width(),
+					volumeBase = volumeGuideLeft + volumeGuideWidth,
+					handlerOffset = volumeHandle.offset(),
+					volumerate = ( baseX - volumeGuideLeft ) / volumeGuideWidth,
+					currentVolume = ( baseX - volumeGuideLeft ) / volumeGuideWidth;
+
+				self._endTimer();
+				self._setVolume( currentVolume.toFixed( 2 ) );
+
+				e.preventDefault();
+				e.stopPropagation();
+
+				$( document ).bind( "vmousemove.multimediaview", function ( e ) {
+					var currentX = e.clientX,
+						currentVolume = ( currentX - volumeGuideLeft ) / volumeGuideWidth;
+
+					self._setVolume( currentVolume.toFixed( 2 ) );
+
+					e.preventDefault();
+					e.stopPropagation();
+				}).bind( "vmouseup.multimediaview", function () {
+					$( document ).unbind( "vmousemove.multimediaview vmouseup.multimediaview" );
+
+					if ( self.options.mediatype == "video" ) {
+						self._startTimer();
+					}
+				});
+			});
+		},
+		_removeEvent : function () {
+			var self = this,
+				view = self.element,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				volumeBar = volumeControl.find( ".ui-volumebar" ),
+				volumeHandle = volumeControl.find( ".ui-handler" );
+
+			view.unbind( ".multimediaview" );
+			playpauseButton.unbind( ".multimediaview" );
+			fullscreenButton.unbind( ".multimediaview" );
+			seekBar.unbind( ".multimediaview" );
+			volumeBar.unbind( ".multimediaview" );
+			volumeHandle.unbind( ".multimediaview" );
+		},
+		_createControl : function () {
+			var self = this,
+				view = self.element,
+				control = $( "<span></span>" ),
+				playpauseButton = $( "<span></span>" ),
+				seekBar = $( "<span></span>" ),
+				timestampLabel = $( "<span><p>00:00:00</p></span>" ),
+				durationLabel = $( "<span><p>00:00:00</p></span>" ),
+				volumeButton = $( "<span></span>" ),
+				volumeControl = $( "<span></span>" ),
+				volumeBar = $( "<div></div>" ),
+				volumeGuide = $( "<span></span>" ),
+				volumeValue = $( "<span></span>" ),
+				volumeHandle = $( "<span></span>" ),
+				fullscreenButton = $( "<span></span>" ),
+				durationBar = $( "<span></span>" ),
+				currenttimeBar = $( "<span></span>" );
+
+			control.addClass( "ui-" + self.role + "-control" );
+			playpauseButton.addClass( "ui-playpausebutton ui-button" );
+			seekBar.addClass( "ui-seekbar" );
+			timestampLabel.addClass( "ui-timestamplabel" );
+			durationLabel.addClass( "ui-durationlabel" );
+			volumeButton.addClass( "ui-volumebutton ui-button" );
+			fullscreenButton.addClass( "ui-fullscreenbutton ui-button" );
+			durationBar.addClass( "ui-duration" );
+			currenttimeBar.addClass( "ui-currenttime" );
+			volumeControl.addClass( "ui-volumecontrol" );
+			volumeBar.addClass( "ui-volumebar" );
+			volumeGuide.addClass( "ui-guide" );
+			volumeValue.addClass( "ui-value" );
+			volumeHandle.addClass( "ui-handler" );
+
+			seekBar.append( durationBar ).append( currenttimeBar ).append( durationLabel ).append( timestampLabel );
+
+			playpauseButton.addClass( "ui-play-icon" );
+			if ( view[0].muted ) {
+				$( volumeButton ).addClass( "ui-mute-icon" );
+			} else {
+				$( volumeButton ).addClass( "ui-volume-icon" );
+			}
+
+			volumeBar.append( volumeGuide ).append( volumeValue ).append( volumeHandle );
+			volumeControl.append( volumeBar );
+
+			control.append( playpauseButton ).append( seekBar ).append( volumeControl ).append( volumeButton );
+
+			if ( self.element[0].nodeName === "VIDEO" ) {
+				$( fullscreenButton ).addClass( "ui-fullscreen-on" );
+				control.append( fullscreenButton );
+			}
+			volumeControl.hide();
+
+			return control;
+		},
+		_startTimer : function ( duration ) {
+			this._endTimer();
+
+			if ( !duration ) {
+				duration = 3000;
+			}
+
+			var self = this,
+				view = self.element,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				volumeControl = control.find( ".ui-volumecontrol" );
+
+			self.controlTimer = setTimeout( function () {
+				self.isVolumeHide = true;
+				self.isControlHide = true;
+				self.controlTimer = null;
+				volumeControl.hide();
+				control.fadeOut( "fast" );
+			}, duration );
+		},
+		_endTimer : function () {
+			if ( this.controlTimer ) {
+				clearTimeout( this.controlTimer );
+				this.controlTimer = null;
+			}
+		},
+		_convertTimeFormat : function ( systime ) {
+			var ss = parseInt( systime % 60, 10 ).toString(),
+				mm = parseInt( ( systime / 60 ) % 60, 10 ).toString(),
+				hh = parseInt( systime / 3600, 10 ).toString(),
+				time =	( ( hh.length < 2  ) ? "0" + hh : hh ) + ":" +
+						( ( mm.length < 2  ) ? "0" + mm : mm ) + ":" +
+						( ( ss.length < 2  ) ? "0" + ss : ss );
+
+			return time;
+		},
+		_updateSeekBar : function ( currenttime ) {
+			var self = this,
+				view = self.element,
+				duration = view[0].duration,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				seekBar = control.find(  ".ui-seekbar"  ),
+				durationBar = seekBar.find( ".ui-duration" ),
+				currenttimeBar = seekBar.find( ".ui-currenttime" ),
+				timestampLabel = control.find( ".ui-timestamplabel" ),
+				durationOffset = durationBar.offset(),
+				durationWidth = durationBar.width(),
+				durationHeight = durationBar.height(),
+				timebarWidth = 0;
+
+			if ( typeof currenttime == "undefined" ) {
+				currenttime = view[0].currentTime;
+			}
+			timebarWidth = parseInt( currenttime / duration * durationWidth, 10 );
+			durationBar.offset( durationOffset );
+			currenttimeBar.offset( durationOffset ).width( timebarWidth );
+			timestampLabel.find( "p" ).text( self._convertTimeFormat( currenttime ) );
+		},
+		_updateVolumeState : function () {
+			var self = this,
+				view = self.element,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				volumeButton = control.find( ".ui-volumebutton" ),
+				volumeBar = volumeControl.find( ".ui-volumebar" ),
+				volumeGuide = volumeControl.find( ".ui-guide" ),
+				volumeValue = volumeControl.find( ".ui-value" ),
+				volumeHandle = volumeControl.find( ".ui-handler" ),
+				handlerWidth = volumeHandle.width(),
+				handlerHeight = volumeHandle.height(),
+				volumeGuideHeight = volumeGuide.height(),
+				volumeGuideWidth = volumeGuide.width(),
+				volumeGuideTop = 0,
+				volumeGuideLeft = 0,
+				volumeBase = 0,
+				handlerOffset = null,
+				volume = view[0].volume;
+
+			volumeGuideTop = parseInt( volumeGuide.offset().top, 10 );
+			volumeGuideLeft = parseInt( volumeGuide.offset().left, 10 );
+			volumeBase = volumeGuideLeft;
+			handlerOffset = volumeHandle.offset();
+			handlerOffset.top = volumeGuideTop - parseInt( ( handlerHeight - volumeGuideHeight ) / 2, 10 );
+			handlerOffset.left = volumeBase + parseInt( volumeGuideWidth * volume, 10 ) - parseInt( handlerWidth / 2, 10 );
+			volumeHandle.offset( handlerOffset );
+			volumeValue.width( parseInt( volumeGuideWidth * ( volume ), 10 ) );
+		},
+		_setVolume : function ( value ) {
+			var viewElement = this.element[0];
+
+			if ( value < 0.0 || value > 1.0 ) {
+				return;
+			}
+
+			viewElement.volume = value;
+		},
+		_fitContentArea: function ( page, parent ) {
+			if ( typeof parent == "undefined" ) {
+				parent = window;
+			}
+
+			var $page = $( page ),
+				$content = $( ".ui-content:visible:first" ),
+				hh = $( ".ui-header:visible" ).outerHeight() || 0,
+				fh = $( ".ui-footer:visible" ).outerHeight() || 0,
+				pt = parseFloat( $content.css( "padding-top" ) ),
+				pb = parseFloat( $content.css( "padding-bottom" ) ),
+				wh = ( ( parent === window ) ? window.innerHeight : $( parent ).height() ),
+				height = wh - ( hh + fh ) - ( pt + pb );
+
+			$content.offset( {
+				top : ( hh + pt )
+			}).height( height );
+		},
+		width : function ( value ) {
+			var self = this,
+				args = arguments,
+				view = self.element;
+
+			if ( args.length === 0 ) {
+				return view.width();
+			}
+			if ( args.length === 1 ) {
+				view.width( value );
+				self._resize();
+			}
+		},
+		height : function ( value ) {
+			var self = this,
+				view = self.element,
+				args = arguments;
+
+			if ( args.length === 0 ) {
+				return view.height();
+			}
+			if ( args.length === 1 ) {
+				view.height( value );
+				self._resize();
+			}
+		},
+		size : function ( width, height ) {
+			var self = this,
+				view = self.element;
+
+			view.width( width ).height( height );
+			self._resize();
+		},
+		fullscreen : function ( value ) {
+			var self = this,
+				view = self.element,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				args = arguments,
+				option = self.options,
+				currentPage = $( ".ui-page-active" );
+
+			if ( args.length === 0 ) {
+				return option.fullscreen;
+			}
+			if ( args.length === 1 ) {
+				view.parents( ".ui-content" ).scrollview( "scrollTo", 0, 0 );
+
+				this.options.fullscreen = value;
+				if ( value ) {
+					currentPage.children( ".ui-header" ).hide();
+					currentPage.children( ".ui-footer" ).hide();
+					this._fitContentArea( currentPage );
+					fullscreenButton.removeClass( "ui-fullscreen-on" ).addClass( "ui-fullscreen-off" );
+				} else {
+					currentPage.children( ".ui-header" ).show();
+					currentPage.children( ".ui-footer" ).show();
+					this._fitContentArea( currentPage );
+					fullscreenButton.removeClass( "ui-fullscreen-off" ).addClass( "ui-fullscreen-on" );
+				}
+				self._resize();
+			}
+		},
+		refresh : function () {
+			this._resize();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.multimediaview.prototype.enhanceWithin( e.target );
+	});
+} ( jQuery, document, window ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/*
+ * nocontents widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'nocontents'.
+ *  data-text1: top message.
+ *  data-text2: bottom message.
+ *  data-type: type of nocontents. You can set text, picture, multimedia and unnamed.
+ *
+ * APIs
+ *
+ *  N/A
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Examples
+ *
+ * Text Type
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2" data-type="text"></div>
+ *
+ * Picture Type
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2" data-type="picture"></div>
+ *
+ * Multimedia Type
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2" data-type="multimedia"></div>
+ *
+ * Unnamed Type
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2"></div>
+ * or
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2" data-type="unnamed"></div>
+ *
+ */
+
+(function ( $, window, undefined ) {
+	$.widget( "tizen.nocontents", $.mobile.widget, {
+
+		max_height: 0,
+		container: null,
+		icon_img: null,
+		text0_bg: null,
+		text1_bg: null,
+
+		_get_height: function () {
+			var $page = $('.ui-page'),
+				$content = $page.children('.ui-content'),
+				$header = $page.children('.ui-header'),
+				$footer = $page.children('.ui-footer'),
+				header_h = $header.outerHeight() || 0,
+				footer_h = $footer.outerHeight() || 0,
+				padding_t = parseFloat( $content.css('padding-top') ) || 0,
+				padding_b = parseFloat( $content.css('padding-bottom') ) || 0,
+				content_h = $(window).height() - header_h - footer_h -
+					(padding_t + padding_b) * 2,
+				container_h = this.container.height();
+
+			return ( content_h < container_h ? container_h : content_h );
+		},
+
+		_align: function () {
+			var content_height = this._get_height(),
+				icon_height = this.icon_img.height(),
+				icon_width = this.icon_img.width(),
+				content_gap = 46,
+				text0_height = this.text0_bg.height() || 0,
+				text1_height = this.text1_bg.height() || 0,
+				text_top = 0,
+				icon_top = (content_height -
+					(icon_height + content_gap +
+					 text0_height + text1_height)) / 2;
+
+			if ( icon_top < content_gap ) {
+				icon_top = content_gap;
+			}
+
+			this.container.height( content_height );
+
+			this.icon_img.css( 'left',
+				($(window).width() - icon_width) / 2 );
+			this.icon_img.css( 'top', icon_top );
+
+			text_top = icon_top + icon_height + content_gap;
+
+			this.text0_bg.css( 'top', text_top );
+			this.text1_bg.css( 'top', text_top + text0_height );
+		},
+
+		_create: function () {
+			var icon_type = $( this.element ).jqmData('type'),
+				text = new Array(2);
+
+			if ( icon_type === undefined ||
+					(icon_type !== "picture" &&
+					 icon_type !== "multimedia" &&
+					 icon_type !== "text") ) {
+				icon_type = "unnamed";
+			}
+
+			text[0] = $( this.element ).jqmData('text1');
+			text[1] = $( this.element ).jqmData('text2');
+
+			if ( text[0] === undefined ) {
+				text[0] = "";
+			}
+
+			if ( text[1] === undefined ) {
+				text[1] = "";
+			}
+
+			this.container = $('<div class="ui-nocontents"/>');
+			this.icon_img = $('<div class="ui-nocontents-icon-' +
+					icon_type + '"/>');
+
+			this.text0_bg = $('<div class="ui-nocontents-text">' +
+					text[0] + '<div>');
+			this.text1_bg = $('<div class="ui-nocontents-text">' +
+					text[1] + '<div>');
+
+			this.container.append( this.icon_img );
+			this.container.append( this.text0_bg );
+			this.container.append( this.text1_bg );
+
+			$( this.element ).append( this.container );
+
+			this._align();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( e.target ).find(":jqmData(role='nocontents')").nocontents();
+	});
+} ( jQuery, this ));
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/*
+ * Notification widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'notification'.
+ *  data-type: 'ticker' or 'popup'.
+ *  data-text1: top text for tickernoti, text to show for smallpopup.
+ *  data-text2: bottom text for tickernoti, smallpopup will ignore this text.
+ *  data-param: parameter for 'tapped' event.
+ *  data-interval: time to showing. If don't set, will show infinitely.
+ *
+ * APIs
+ *
+ *  show(): show the notification.
+ *  hide(): hide the notification.
+ *
+ * Events
+ *
+ *  tapped: When you tap or click the smallpopup, this event will be raised.
+ *
+ * Examples
+ *
+ * // tickernoti
+ * <div data-role="notification" id="notification" data-type="ticker" data-text1="text1" data-text2="text2" data-param="parameters" data-interval="3000"></div>
+ *
+ * // smallpopup
+ * <div data-role="notification" id="notification" data-type="popup" data-text1="text1" data-param="parameters" data-interval="3000"></div>
+ *
+ * // event
+ * $('#notification-demo').bind('tapped', function (e, m) {
+ *	alert('notification is tapped\nparameter:"' + m + '"');
+ * });
+ *
+ */
+
+(function ( $, window ) {
+	$.widget( "tizen.notification", $.mobile.widget, {
+		btn: null,
+		param: null,
+		interval: null,
+		seconds: null,
+		running: false,
+
+		_refresh: function () {
+			this._del_event();
+			this._update();
+			this._add_event();
+
+			$( this.html ).addClass("fix");
+		},
+
+		show: function () {
+			if ( this.running ) {
+				this._refresh();
+				return;
+			}
+
+			this._update();
+
+			this._add_event();
+
+			this.running = true;
+			$( this.html ).addClass("show");
+		},
+
+		hide: function () {
+			if ( !this.running ) {
+				return;
+			}
+
+			$( this.html ).addClass("hide");
+			$( this.html ).removeClass("show").removeClass("fix");
+			this._del_event();
+
+			this.running = false;
+		},
+
+		close: function () {
+			$( this.html ).removeClass("show").removeClass("hide").removeClass("fix");
+			this._del_event();
+
+			this.running = false;
+		},
+
+		_get_container: function () {
+			if ( this.type === 'ticker' ) {
+				return $( this.element ).find(".ui-ticker");
+			}
+
+			return $( this.element ).find(".ui-smallpopup");
+		},
+
+		_add_event: function () {
+			var self = this,
+				container = this._get_container();
+
+			if ( this.type === 'ticker' ) {
+				container.find(".ui-ticker-btn").append( this.btn );
+
+				this.btn.bind( "vmouseup", function () {
+					self.hide();
+				});
+			}
+
+			container.bind( 'vmouseup', function () {
+				self.element.trigger( 'tapped', self.param );
+				self.hide();
+			});
+
+			if ( this.seconds !== undefined && this.second !== 0 ) {
+				this.interval = setInterval( function () {
+					self.hide();
+				}, this.seconds );
+			}
+		},
+
+		_del_event: function () {
+			var container = this._get_container();
+
+			if ( this.type === 'ticker' ) {
+				this.btn.unbind("vmouseup");
+			}
+			container.unbind('vmouseup');
+			clearInterval( this.interval );
+		},
+
+		_set_position: function () {
+			var container = this._get_container(),
+				container_h = parseFloat( container.css('height') ),
+				$page = $('.ui-page'),
+				$footer = $page.children('.ui-footer'),
+				footer_h = $footer.outerHeight() || 0,
+				position = $(window).height() - container_h - footer_h;
+
+			container.css( 'top', position );
+		},
+
+		_update: function () {
+			var text = new Array(2);
+
+			if ( this.html ) {
+				this.html.detach();
+			}
+
+			text[0] = $(this.element).jqmData('text1');
+			text[1] = $(this.element).jqmData('text2');
+			this.param = $(this.element).jqmData('param');
+			this.seconds = $(this.element).jqmData('interval');
+			this.type = $(this.element).jqmData('type') || 'popup';
+
+			if ( this.type === 'ticker' ) {
+				this.html = $('<div class="ui-ticker">' +
+						'<div class="ui-ticker-icon"></div>' +
+						'<div class="ui-ticker-text1-bg">' +
+						text[0] + '</div>' +
+						'<div class="ui-ticker-text2-bg">' +
+						text[1] + '</div>' +
+						'<div class="ui-ticker-body"></div>' +
+						'<div class="ui-ticker-btn"></div>' +
+						'</div>');
+
+				$( this.element ).append( this.html );
+			} else {
+				this.html = $('<div class="ui-smallpopup">' +
+						'<div class="ui-smallpopup-text-bg">' +
+						text[0] + '</div>' +
+						'</div>');
+
+				$( this.element ).append( this.html );
+
+				this._set_position();
+			}
+		},
+
+		_create: function () {
+			this.btn = $("<a href='#' class='ui-input-cancel' title='close' data-theme='s'>Close</a>")
+				.tap( function ( event ) {
+					event.preventDefault();
+				})
+				.buttonMarkup({
+					inline: true,
+					corners: true,
+					shadow: true
+				});
+
+			this._update();
+			this.running = false;
+		}
+	}); // End of widget
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( e.target ).find(":jqmData(role='notification')").notification();
+	});
+
+	$( document ).bind( "pagebeforehide", function ( e ) {
+		$( e.target ).find(":jqmData(role='notification')").notification('close');
+	});
+}( jQuery, this ));
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// optionheader provides a collapsible toolbar for buttons and
+// segmented controls directly under the title bar. It
+// wraps a jQuery Mobile grid in a collapsible container; clicking
+// on the container, or on one of the buttons inside the container,
+// will collapse it.
+//
+// To add an option header to a page, mark up the header with a
+// data-role="optionheader" attribute, as shown in this example:
+//
+// <div data-role="header">
+//     <h1>Option header - 3 buttons example</h1>
+//     <div data-role="optionheader">
+//        <div class="ui-grid-b">
+//             <div class="ui-block-a"><a data-role="button">Previous</a></div>
+//             <div class="ui-block-b"><a data-role="button">Cancel</a></div>
+//             <div class="ui-block-c"><a data-role="button">Next</a></div>
+//        </div>
+//     </div>
+// </div>
+//
+// The optionheader can also be used inline (e.g. in a content block or
+// a widget).
+//
+// Alternatively, use $('...').optionheader() to apply programmatically.
+//
+// The grid inside the optionheader should be marked up as for
+// a standard jQuery Mobile grid. (The widget has been tested with one
+// or two rows of 2-4 columns each.)
+//
+// Note that if you use this with fixed headers, you may find that
+// expanding the option header increases the page size so that scrollbars
+// appear (jQuery Mobile's own collapsible content areas cause the
+// same issue). You can alleviate this somewhat by calling the show() method
+// on the page toolbars each time the size of the header changes.
+//
+// The widget is configurable via a data-options attribute on the same
+// div as the data-role="optionheader" attribute, e.g.
+//
+// <div data-role="header">
+//     <h1>Option header - configured</h1>
+//     <div data-role="optionheader" data-options='{"collapsed":true, "duration":1.5}'>
+//        <div class="ui-grid-b">
+//             <div class="ui-block-a"><a data-role="button">Previous</a></div>
+//             <div class="ui-block-b"><a data-role="button">Cancel</a></div>
+//             <div class="ui-block-c"><a data-role="button">Next</a></div>
+//        </div>
+//     </div>
+// </div>
+//
+// Options can also be set with $(...).optionheader('option', 'name', value).
+// However, if you do this, you'll need to call $(...).optionheader('refresh')
+// afterwards for the new values to take effect (note that optionheader()
+// can be applied multiple times to an element without side effects).
+//
+// See below for the available options.
+//
+// Theme: by default, gets a 'b' swatch; override with data-theme="X"
+// as per usual
+//
+// Options (can be set with a data-options attribute):
+//
+//   {Boolean} [showIndicator=true] Set to true (the default) to show
+//   the upward-pointing arrow indicator on top of the title bar.
+//   {Boolean} [startCollapsed=false] Sets the appearance when the option
+//   header is first displayed; defaults to false (i.e. show the header
+//   expanded on first draw). NB setting this option later has no
+//   effect: use collapse() to collapse a widget which is already
+//   drawn.
+//   {Boolean} [expandable=true] Sets whether the header will expand
+//   in response to clicks; default = true.
+//   {Float} [duration=0.25] Duration of the expand/collapse animation.
+//
+// Methods (see below for docs):
+//
+//   toggle(options)
+//   expand(options)
+//   collapse(options)
+//
+// Events:
+//
+//   expand: Triggered when the option header is expanded
+//   collapse: Triggered when the option header is collapsed
+//
+
+
+(function ($, undefined) {
+	$.widget("tizen.optionheader", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(role='optionheader')",
+			showIndicator: true,
+			theme: 's',
+			startCollapsed: false,
+			expandable: true,
+			duration: 0.25,
+			collapseOnInit : true,
+			default_font_size : $('html').css('font-size')
+		},
+		collapsedHeight: '5px',
+
+		_create: function () {
+			var options,
+				theme,
+				self = this,
+				elementHeight = 106,
+				parentPage,
+				dataOptions = this.element.jqmData( 'options' ),
+				page = this.element.closest( ':jqmData(role="page")' );
+			// parse data-options
+			$.extend( this.options, dataOptions );
+
+			this.isCollapsed = this.options.collapseOnInit;
+			this.expandedHeight = null;
+
+			// parse data-theme and reset options.theme if it's present
+			theme = this.element.jqmData( 'theme' ) || this.options.theme;
+			this.options.theme = theme;
+
+			this.element.closest( ':jqmData(role="header")' ).addClass( "ui-option-header-resizing" );
+
+			// set up the click handler; it's done here so it can
+			// easily be removed, as there should only be one instance
+			// of the handler function for each class instance
+			this.clickHandler = function () {
+				self.toggle();
+			};
+
+			/* Apply REM scaling */
+			elementHeight = elementHeight / ( 36 / parseInt(this.option.default_font_size) );
+
+			if ( this.element.height() < elementHeight ) {
+				this.element.css( "height", elementHeight );
+			}
+
+			// get the element's dimensions
+			// and to set its initial collapse state;
+			// either do it now (if the page is visible already)
+			// or on pageshow
+
+			if ( page.is(":visible") ) {
+				self.refresh();
+				self._realize();
+			} else {
+				self.refresh();
+
+				page.bind( "pagebeforeshow", function () {
+					self._setArrowLeft();
+					self._realize();
+				});
+			}
+			self._setArrowLeft();
+	//        this.refresh();
+		},
+
+		_realize: function () {
+			if ( !this.expandedHeight ) {
+				this.expandedHeight = this.element.height();
+			}
+
+			if ( this.isCollapsed ) {
+	//        if (this.options.startCollapsed) {
+				this.collapse( {duration: 0} );
+			}
+		},
+
+		_setArrowLeft: function () {
+			var matchingBtn = $( this.element ).jqmData( "for" ),
+				arrowCenter = 14,
+				btn2Position = 10,
+				btn3Position = 144,
+				matchBtn = $( this.element ).parents( ".ui-page" ).find( "#" + matchingBtn ),
+				buttonRight = matchBtn.nextAll().is( "a" ) ? btn3Position : btn2Position;
+				/* Apply REM scaling */
+				scaleFactor = ( 36 / parseInt(this.option.default_font_size) );
+
+			if ( $(this.element).parents(".ui-page").find( "#" + matchingBtn ).length != 0 ) {
+
+				if ( this.options.expandable ) {
+					matchBtn.bind( 'vclick', this.clickHandler );
+				} else {
+					matchBtn.unbind( 'vclick', this.clickHandler );
+				}
+
+				// decide arrow Button position
+				if ( matchBtn.css( "left" ) && matchBtn.css( "left" ) != "auto" ) {
+					$( ".ui-triangle-image" ).css( "left", matchBtn.width() / 2 + parseInt(matchBtn.css( "left" ), 10) - ( arrowCenter / scaleFactor ) + "px" );
+				} else if ( matchBtn.css("right") ) {
+					$( ".ui-triangle-image" ).css( "left", document.documentElement.clientWidth - matchBtn.width() / 2 - ( ( buttonRight - arrowCenter ) / scaleFactor ) + "px" );
+				}
+			} else {
+				$( ".ui-triangle-image" ).css( "left", document.documentElement.clientWidth / 2 - ( arrowCenter / scaleFactor ) + "px" );
+			}
+		},
+		// Draw the option header, according to current options
+		refresh: function () {
+			var el = this.element,
+				arrow = $( '<div class="ui-option-header-triangle-arrow"></div>' ),
+				optionHeaderClass = 'ui-option-header',
+				gridRowSelector = '.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d,.ui-grid-e',
+				theme = this.options.theme,
+				numRows,
+				rowsClass,
+				themeClass,
+				klass,
+				o = $.extend( {grid: null} ),
+				$kids = el.find( "div" ).eq( 0 ).children().children(),
+				letter,
+				gridCols = {solo: 1, a: 2, b: 3, c: 4, d: 5},
+				grid = o.grid;
+
+			if ( !grid ) {
+				if ( $kids.length <= 5 ) {
+					for ( letter in gridCols ) {
+						if ( gridCols[ letter ] === $kids.length ) {
+							grid = letter;
+						}
+					}
+					numRows = $kids.length / gridCols[grid];
+				} else {
+					numRows = 2;
+				}
+			}
+
+	        // count ui-grid-* elements to get number of rows
+	//        numRows = el.find(gridRowSelector).length;
+
+	        // ...at least one row
+	//        numRows = Math.max(1, numRows);
+
+	        // add classes to outer div:
+	        //   ui-option-header-N-row, where N = options.rows
+	        //   ui-bar-X, where X = options.theme (defaults to 'c')
+	        //   ui-option-header
+			rowsClass = 'ui-option-header-' + numRows + '-row';
+			themeClass = 'ui-body-' + this.options.theme;
+
+			el.removeClass( rowsClass ).addClass( rowsClass );
+			el.removeClass( themeClass ).addClass( themeClass );
+			el.removeClass( optionHeaderClass ).addClass( optionHeaderClass );
+
+			// remove any arrow currently visible
+			el.prev( '.ui-option-header-triangle-arrow' ).remove();
+	//        el.prev('.ui-triangle-container').remove();
+
+			// if there are elements inside the option header
+			// and this.options.showIndicator,
+			// insert a triangle arrow as the first element inside the
+			// optionheader div to show the header has hidden content
+			if ( this.options.showIndicator ) {
+				el.before( arrow );
+				arrow.append("<div class='ui-triangle-image'></div>");
+	//            arrow.triangle({"color": el.css('background-color'), offset: "50%"});
+			}
+
+	        // if expandable, bind clicks to the toggle() method
+			if ( this.options.expandable ) {
+	//            el.unbind('vclick', this.clickHandler).bind('vclick', this.clickHandler);
+	//            arrow.unbind('vclick', this.clickHandler).bind('vclick', this.clickHandler);
+				el.bind( 'vclick', this.clickHandler );
+				arrow.bind( 'vclick', this.clickHandler );
+
+			} else {
+				el.unbind( 'vclick', this.clickHandler );
+				arrow.unbind( 'vclick', this.clickHandler );
+			}
+
+			// for each ui-grid-a element, add a class ui-option-header-row-M
+			// to it, where M is the xpath position() of the div
+	/*        el.find(gridRowSelector).each(function (index) {
+	            var klass = 'ui-option-header-row-' + (index + 1);
+	            $(this).removeClass(klass).addClass(klass);
+	        });*/
+			klass = 'ui-option-header-row-' + ( numRows );
+			el.find( "div" ).eq( 0 ).removeClass( klass ).addClass( klass );
+
+			// redraw the buttons (now that the optionheader has the right
+			// swatch)
+			el.find( '.ui-btn' ).each(function () {
+				$( this ).attr( 'data-' + $.mobile.ns + 'theme', theme );
+
+				// hack the class of the button to remove the old swatch
+				var klass = $( this ).attr( 'class' );
+				klass = klass.replace(/ui-btn-up-\w{1}\s*/, '');
+				klass = klass + ' ui-btn-up-' + theme;
+				$( this ).attr( 'class', klass );
+			});
+		},
+
+		_setHeight: function ( height, isCollapsed, options ) {
+			var self = this,
+				elt = this.element.get( 0 ),
+				duration,
+				commonCallback,
+				callback,
+				handler;
+
+			options = options || {};
+
+			// set default duration if not specified
+			duration = options.duration;
+			if ( typeof duration == 'undefined' ) {
+				duration = this.options.duration;
+			}
+
+			// the callback to always call after expanding or collapsing
+			commonCallback = function () {
+				self.isCollapsed = isCollapsed;
+
+				if ( isCollapsed ) {
+					self.element.trigger( 'collapse' );
+				} else {
+					self.element.trigger( 'expand' );
+				}
+			};
+
+			// combine commonCallback with any user-specified callback
+			if ( options.callback ) {
+				callback = function () {
+					options.callback();
+					commonCallback();
+				};
+			} else {
+				callback = function () {
+					commonCallback();
+				};
+			}
+
+			// apply the animation
+			if ( duration > 0 && $.support.cssTransitions ) {
+				// add a handler to invoke a callback when the animation is done
+
+				handler = {
+					handleEvent: function ( e ) {
+						elt.removeEventListener( 'webkitTransitionEnd', this );
+						self.element.css( '-webkit-transition', null );
+						callback();
+					}
+				};
+
+				elt.addEventListener( 'webkitTransitionEnd', handler, false );
+
+				// apply the transition
+				this.element.css( '-webkit-transition', 'height ' + duration + 's ease-out' );
+				this.element.css( 'height', height );
+			} else {
+			// make sure the callback gets called even when there's no
+			// animation
+				this.element.css( 'height', height );
+				callback();
+			}
+		},
+
+		/**
+		* Toggle the expanded/collapsed state of the widget.
+		* {Object} [options] Configuration for the expand/collapse
+		* {Integer} [options.duration] Duration of the expand/collapse;
+		* defaults to this.options.duration
+		* {Function} options.callback Function to call after toggle completes
+		*/
+
+		toggle: function ( options ) {
+			var toggle_header = this.element.parents( ":jqmData(role='header')" ),
+				toggle_content = this.element.parents( ":jqmData(role='page')" ).find( ".ui-content" ),
+				CollapsedTop = 110,
+				ExpandedTop = 206,
+				CalculateTime,
+				/* Apply REM scaling */
+				scaleFactor = ( 36 / parseInt($('html').css('font-size')));
+			if ( toggle_header.children().is( ".input-search-bar" ) ) {
+				CollapsedTop = 218;
+				ExpandedTop = 314;
+			}
+
+			/* Scale Factor */
+			CollapsedTop = ( CollapsedTop / scaleFactor );
+			ExpandedTop = ( ExpandedTop / scaleFactor );
+
+			if ( $( window ).scrollTop() <= CollapsedTop ) {
+				toggle_header.css( "position", "relative" );
+				toggle_content.css( "top", "0px" );
+			}
+
+			if ( this.isCollapsed ) {
+				this.expand( options );
+
+				if ( $( window ).scrollTop() <= ExpandedTop ) {
+					CalculateTime = setTimeout( function () {
+						toggle_header.css( 'position', 'fixed' );
+						toggle_content.css( 'top', ExpandedTop + "px" );
+					}, 500 );
+				} else {
+					//   Need to move scroll top
+					toggle_header.css( 'position', 'fixed' );
+					toggle_content.css( 'top', ExpandedTop + "px" );
+				}
+				this.options.collapseOnInit = false;
+			} else {
+				this.collapse( options );
+				if ( $(window).scrollTop() <= ExpandedTop ) {
+					CalculateTime = setTimeout( function () {
+						toggle_header.css( 'position', 'fixed' );
+						toggle_content.css( 'top', CollapsedTop + "px" );
+					}, 500 );
+				} else {
+					toggle_header.css( 'position', 'fixed' );
+					toggle_content.css( 'top', CollapsedTop + "px" );
+				}
+			}
+			this.options.collapseOnInit = true;
+		},
+
+		_setDisabled: function ( value ) {
+			$.Widget.prototype._setOption.call( this, "disabled", value );
+			this.element.add( this.element.prev( ".ui-triangle-container" ) )[value ? "addClass" : "removeClass"]("ui-disabled");
+		},
+		/**
+		* Takes the same options as toggle()
+		*/
+		collapse: function ( options ) {
+			var collapsedBarHeight = 10,
+			scaleFactor = ( 36 / parseInt($('html').css('font-size')));
+
+			collapsedBarHeight = collapsedBarHeight / scaleFactor;
+
+	//        if (!this.isCollapsed) {
+			this._setHeight( collapsedBarHeight + "px", true, options );
+	//        }
+		},
+
+		/**
+		* Takes the same options as toggle()
+		*/
+		expand: function ( options ) {
+	//        if (this.isCollapsed) {
+			this._setHeight( this.expandedHeight, false, options );
+	//        }
+		}
+	});
+
+	// auto self-init widgets
+	$(document).bind("pagecreate create", function ( e ) {
+	    $($.tizen.optionheader.prototype.options.initSelector, e.target)
+			.not(":jqmData(role='none'), :jqmData(role='nojs')")
+			.optionheader();
+	});
+
+}(jQuery) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Youmin Ha <youmin.ha@samsung.com>
+ */
+
+/**
+ * Pagecontrol widget shows number bullets, receives touch event for each bullet,
+ * and runs your callback for each touch event.
+ *
+ * HTML Attributes:
+ *
+ *		Pagecontrol widget uses <div> element as an element itself. It takes following attributes.
+ *
+ *		data-role:	This widget must have 'pagecontrol' as data-role value.
+ *		data-max:	Maximum nimber of pagecontrol bullets. This property must not exceed 10.
+ *		data-initVal:	Initially selected value of the pagecontrol widget. Must between 1 and data-max. If this attribute is not given, initial value is set to 1.
+ *
+ * APIs:
+ *
+ *		setValue( value )
+ *			: Set current value. Actually triggers 'change' event to the widget with given value.
+ *			@param[in] value	A value to be changed.
+ *
+ *		getValue( )
+ *			: Get current value.
+ *			@return		Current value.
+ *
+ * Events:
+ *
+ *		change:	Raised when a value is changed, by setting it by javascript, or by user's touch event.
+ *
+ * Examples:
+ *
+ *		<div id="foo" data-role="pagecontrol" data-max="10"></div>
+ *		...
+ *		<script language="text/javascript">
+ *
+ *		// Bind callback to value change
+ *		$('foo').bind('change', function (event, value) {
+ *			// event: 'change'
+ *			// value: changed value
+ *		});
+ *
+ *		// Set a value to 3
+ *		$('foo').trigger('change', 3);
+ *		</script>
+ */
+
+(function ($, undefined) {
+	$.widget( "tizen.pagecontrol", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(role='pagecontrol')"
+		},
+
+		_create: function ( ) {
+		},
+
+		_init: function ( ) {
+			var self = this,
+				e = this.element,
+				maxVal = e.data( "max" ),
+				currentVal = e.attr( "data-initVal" ),
+				i = 0,
+				btn = null,
+				buf = null,
+				page_margin_class = 'page_n_margin_44';
+
+
+			// Set default values
+			if ( ! maxVal ) {
+				maxVal = 1;
+			} else if ( maxVal > 10 ) {
+				maxVal = 10;
+			}
+			e.data( "max", maxVal );
+
+			if ( ! currentVal ) {
+				currentVal = 1;
+			}
+			e.data( "current", currentVal );
+
+			// Set pagecontrol class
+			e.addClass( 'pagecontrol' );
+
+			// Set empty callback variable
+			self.changeCallback = null;
+
+			// Calculate left/right margin
+			if ( maxVal <= 7 ) {
+				page_margin_class = 'page_n_margin_44';
+			} else if ( maxVal == 8 ) {
+				page_margin_class = 'page_n_margin_35';
+			} else if ( maxVal == 9 ) {
+				page_margin_class = 'page_n_margin_26';
+			} else {
+				page_margin_class = 'page_n_margin_19';
+			}
+
+			// subroutine: find a child by value
+			function getBtn( value ) {
+				return e.children( ":jqmData(value='" + value + "')" );
+			}
+
+			// subroutine: change active button by value
+			function changeActiveBtn( newNum ) {
+				var oldNum = e.data( 'current' );
+
+				// Check value
+				if ( newNum < 1 || newNum > e.max ) {
+					return false;
+				}
+
+				getBtn( oldNum ).removeClass( 'page_n_' + oldNum )
+						.addClass( 'page_n_dot' );
+				getBtn( newNum ).removeClass( 'page_n_dot' )
+						.addClass( 'page_n_' + newNum );
+			}
+
+			function triggerChange( event ) {
+				// Trigger change event
+				e.trigger( 'change', $( this ).data( 'value' ) );
+			}
+
+			// Add dot icons
+			for ( i = 1; i <= maxVal; i++ ) {
+				btn = $( '<div class="page_n page_n_dot ' + page_margin_class + '" data-value="' + i + '"></div>' );
+				e.append( btn );
+				if ( i == currentVal ) {
+					btn.removeClass( 'page_n_dot' )
+						.addClass( 'page_n_' + i );
+				}
+				// bind vclick event to each icon
+				btn.bind( 'vclick', triggerChange );
+			}
+
+			// pagecontrol element's change event
+			e.bind( 'change', function ( event, value ) {
+				// 1. Change activated button
+				changeActiveBtn( value );
+
+				// 2. Store new value (DO NOT change this order!)
+				e.data( 'current', value );
+
+			});
+		}
+	});	// end: $.widget()
+
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.pagecontrol.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.pagecontrol( );
+	});
+
+} ( jQuery ) );
+
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// pagelist widget
+//
+// Given an element, this widget collects all links contained in the descendants of the element and constructs
+// a popupwindow widget containing numbered buttons for each encountered link.
+//
+// You can mark any one element in your document with "data-pagelist='true'" and a pagelist will be created that
+// will allow the user to navigate between the pages linked to within the element.
+//
+// Currently, only one pagelist can exist in a document and, once created, it cannot be modified.
+
+(function ( $, undefined ) {
+
+	window.ensureNS( "jQuery.mobile.tizen" );
+
+	$.widget( "tizen.pagelist", $.tizen.widgetex, {
+		_htmlProto: {
+source:
+
+$("<div><div id='pagelist' class='ui-pagelist' data-role='popupwindow' data-shadow='false' data-overlayTheme=''>" +
+  "    <a id='pagelist-button' data-role='button' data-inline='true'></a>" +
+  "    <br id='pagelist-rowbreak'></br>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				pageList: "#pagelist",
+				button:   "#pagelist-button",
+				rowBreak: "#pagelist-rowbreak"
+			}
+		},
+		_create: function () {
+			var self = this,
+				popPageList = false,
+				idx = 0;
+
+			this._ui.button.remove();
+			this._ui.rowBreak.remove();
+			this._ui.pageList
+				.appendTo( $( "body" ) )
+				.popupwindow()
+				.bind( "vclick", function ( e ) {
+					$( this ).popupwindow( "close" );
+				} );
+
+			this.element.find( "a[href]" ).each( function ( elemIdx, elem ) {
+				if ( idx > 0 && ( ( idx % 10 ) != 0 ) ) {
+					self._ui.pageList.append( self._ui.rowBreak.clone() );
+				}
+
+				self._ui.button
+					.clone()
+					.attr( "href", $( elem ).attr( "href" ) )
+					.text( ++idx )
+					.appendTo( self._ui.pageList )
+					.buttonMarkup()
+					.bind( "vclick", function () { self._ui.pageList.popupwindow( "close" ); } )
+					.find( ".ui-btn-inner" )
+					.css( { padding: 2 } );
+			} );
+
+			$( document ).bind( "keydown", function ( e ) {
+				popPageList = ( e.keyCode === $.mobile.keyCode.CONTROL );
+			} );
+			$( document ).bind( "keyup", function ( e ) {
+				if ( e.keyCode === $.mobile.keyCode.CONTROL && popPageList ) {
+					var maxDim = { cx: 0, cy: 0 };
+					self._ui.pageList.popupwindow( "open", undefined, 0 );
+					self._ui.pageList.find( "a" )
+						.each( function () {
+							var btn = $( this ),
+								dim = {
+									cx: btn.outerWidth( true ),
+									cy: btn.outerHeight( true )
+								};
+
+							// Make sure things will be even later, because padding cannot have decimals - apparently :-S
+							if ( dim.cx % 2 ) {
+								btn.css( "padding-left", parseInt( btn.css( "padding-left" ), 10 ) + 1 );
+							}
+							if ( dim.cy % 2 ) {
+								btn.css( "padding-bottom", parseInt( btn.css( "padding-bottom" ), 10 ) + 1 );
+							}
+
+							maxDim.cx = Math.max( maxDim.cx, dim.cx );
+							maxDim.cy = Math.max( maxDim.cy, dim.cy );
+						} )
+						.each( function () {
+							var padding = {
+									h: Math.max( 0, ( maxDim.cx - $( this ).outerWidth( true ) ) / 2 ),
+									v: Math.max( 0, ( maxDim.cy - $( this ).outerHeight( true ) ) / 2 )
+								},
+								btn = $( this ),
+								inner = btn.find( ".ui-btn-inner" );
+
+							inner.css( {
+								"padding-left"		: parseInt( inner.css( "padding-left" ), 10 ) + padding.h,
+								"padding-top"		: parseInt( inner.css( "padding-top" ), 10 ) + padding.v,
+								"padding-right"		: parseInt( inner.css( "padding-right" ), 10 ) + padding.h,
+								"padding-bottom"	: parseInt( inner.css( "padding-bottom" ), 10 ) + padding.v
+							} );
+							btn[( ( btn.attr( "href" ) === "#" + $.mobile.activePage.attr( "id" ) ) ? "addClass" : "removeClass" )]( "ui-btn-active" );
+						} );
+					e.stopPropagation();
+					e.preventDefault();
+				}
+				popPageList = false;
+			} );
+		}
+	} );
+
+	// Look for an element marked as a pagelist and assign $.mobile.tizen.pagelist with a newly created pagelist.
+	// If $.mobile.tizen.pagelist is already assigned, ignore any new "data-pagelist='true'" designations.
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( ":jqmData(pagelist='true')", e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.each( function () {
+				if ( $.mobile.tizen.pagelist === undefined ) {
+					$.extend( $.mobile.tizen, {
+						pagelist: $( this ).pagelist()
+					} );
+				}
+				return false;
+			} );
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>,
+ *          Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Shows other elements inside a popup window.
+//
+// To apply, add the attribute data-role="popupwindow" to a <div> element inside
+// a page. Alternatively, call popupwindow()
+// on an element, eg :
+//
+//     $("#mypopupwindowContent").popupwindow();
+// where the html might be :
+//     <div id="mypopupwindowContent"></div>
+//
+// To trigger the popupwindow to appear, it is necessary to make a call to its
+// 'open()' method. This is typically done by binding a function to an event
+// emitted by an input element, such as a the clicked event emitted by a button
+// element. The open() method takes two arguments, specifying the x and y
+// screen coordinates of the center of the popup window.
+
+// You can associate a button with a popup window like this:
+//      <div id="mypopupContent" style="display: table;" data-role="popupwindow">
+//          <table>
+//              <tr> <td>Eenie</td>   <td>Meenie</td>  <td>Mynie</td>   <td>Mo</td>  </tr>
+//              <tr> <td>Catch-a</td> <td>Tiger</td>   <td>By-the</td>  <td>Toe</td> </tr>
+//              <tr> <td>If-he</td>   <td>Hollers</td> <td>Let-him</td> <td>Go</td>  </tr>
+//              <tr> <td>Eenie</td>   <td>Meenie</td>  <td>Mynie</td>   <td>Mo</td>  </tr>
+//          </table>
+//      </div>
+// <a href="#myPopupContent" data-rel="popupwindow" data-role="button">Show popup</a>
+//
+// Options:
+//
+//     theme: String; the theme for the popupwindow contents
+//                   Default: null
+//
+//     overlayTheme: String; the theme for the popupwindow
+//                   Default: null
+//
+//     shadow: Boolean; display a shadow around the popupwindow
+//             Default: true
+//
+//     corners: Boolean; display a shadow around the popupwindow
+//             Default: true
+//
+//     fade: Boolean; fades the opening and closing of the popupwindow
+//
+//     transition: String; the transition to use when opening or closing
+//                 a popupwindow
+//                 Default: $.mobile.defaultDialogTransition
+//
+// Events:
+//     close: Emitted when the popupwindow is closed.
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.popupwindow", $.tizen.widgetex, {
+		options: {
+			theme: null,
+			overlayTheme: "s",
+			style: "custom",
+			disabled: false,
+			shadow: true,
+			corners: true,
+			fade: true,
+			widthRatio: 0.8612,
+			transition: $.mobile.defaultDialogTransition,
+			initSelector: ":jqmData(role='popupwindow')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div>" +
+  "    <div id='popupwindow-screen' class='ui-selectmenu-screen ui-screen-hidden ui-popupwindow-screen'></div>" +
+  "    <div id='popupwindow-container' class='ui-popupwindow ui-popupwindow-padding ui-selectmenu-hidden ui-overlay-shadow ui-corner-all'></div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				screen:    "#popupwindow-screen",
+				container: "#popupwindow-container"
+			}
+		},
+
+		_create: function () {
+			var thisPage = this.element.closest(":jqmData(role='page')"),
+				self = this,
+				popup = this.element,
+				o = this.options,
+				style = popup.attr( 'data-style' );
+
+			if (thisPage.length === 0) {
+				thisPage = $("body");
+			}
+
+			// Drop a placeholder into the location from which we shall rip out the popup window contents
+			this._ui.placeholder =
+					$("<div><!-- placeholder" +
+									(this.element.attr("id") === undefined
+									 ? ""
+									 : " for " + this.element.attr("id")) + " --></div>")
+					.css("display", "none")
+					.insertBefore(this.element);
+
+			// Apply the proto
+			thisPage.append(this._ui.screen);
+			this._ui.container.insertAfter(this._ui.screen);
+			this._ui.container.append(this.element);
+
+			// Define instance variables
+			$.extend( self, {
+				_isOpen: false
+			});
+
+			//Data Style Start
+			if (style) {
+				o.style = style;
+			}
+
+			popup.addClass( o.style );
+			popup.find( ":jqmData(role='title')" )
+					.wrapAll( "<div class='popup-title'></div>" );
+			popup.find( ":jqmData(role='text')" )
+					.wrapAll( "<div class='popup-text'></div>" );
+			popup.find( ":jqmData(role='button-bg')" )
+					.wrapAll( "<div class='popup-button-bg'></div>" );
+			popup.find( ":jqmData(role='check-bg')" )
+					.wrapAll( "<div class='popup-check-bg'></div>" );
+			popup.find( ":jqmData(role='scroller-bg')" )
+					.wrapAll( "<div class='popup-scroller-bg'></div>" );
+			popup.find( ":jqmData(role='text-bottom-bg')" )
+					.wrapAll( "<div class='popup-text-bottom-bg'></div>" );
+			popup.find( ":jqmData(role='text-left')" )
+					.wrapAll( "<div class='popup-text-left'></div>" );
+			popup.find( ":jqmData(role='text-right')" )
+					.wrapAll( "<div class='popup-text-right'></div>" );
+			popup.find( ":jqmData(role='progress-bg')" )
+					.wrapAll( "<div class='popup-progress-bg'></div>" );
+			//Data Style End
+
+			// Events on "screen" overlay
+			this._ui.screen.bind( "vclick", function (event) {
+				self.close();
+			});
+		},
+
+		_realSetTheme: function (dst, theme) {
+
+			var classes = (dst.attr("class") || "").split(" "),
+				alreadyAdded = true,
+				currentTheme = null,
+				matches;
+
+			while (classes.length > 0) {
+				currentTheme = classes.pop();
+				matches = currentTheme.match(/^ui-body-([a-z])$/);
+				if (matches && matches.length > 1) {
+					currentTheme = matches[1];
+					break;
+				} else {
+					currentTheme = null;
+				}
+			}
+
+			dst.removeClass("ui-body-" + currentTheme);
+			if ((theme || "").match(/[a-z]/)) {
+				dst.addClass("ui-body-" + theme);
+			}
+		},
+
+		_setTheme: function (value) {
+			this._realSetTheme(this.element, value);
+			this.options.theme = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "theme", value);
+		},
+
+		_setOverlayTheme: function (value) {
+			this._realSetTheme(this._ui.container, value);
+			// The screen must always have some kind of background for fade to work, so, if the theme is being unset,
+	// set the background to "a".
+			this._realSetTheme(this._ui.screen, (value === "" ? "a" : value));
+			this.options.overlayTheme = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "overlay-theme", value);
+		},
+
+		_setShadow: function (value) {
+			this.options.shadow = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "shadow", value);
+			this._ui.container[value ? "addClass" : "removeClass"]("ui-overlay-shadow");
+		},
+
+		_setCorners: function (value) {
+			this.options.corners = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "corners", value);
+			this._ui.container[value ? "addClass" : "removeClass"]("ui-corner-all");
+		},
+
+		_setFade: function (value) {
+			this.options.fade = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "fade", value);
+		},
+
+		_setTransition: function (value) {
+			this._ui.container
+				.removeClass((this.options.transition || ""))
+				.addClass(value);
+			this.options.transition = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "transition", value);
+		},
+
+		_setDisabled: function (value) {
+			$.Widget.prototype._setOption.call(this, "disabled", value);
+			if (value) {
+				this.close();
+			}
+		},
+
+		_placementCoords: function (x, y, cx, cy) {
+			// Try and center the overlay over the given coordinates
+			var ret,
+				scrollTop = $(window).scrollTop(),
+				screenHeight = $(window).height(),
+				screenWidth = $(window).width(),
+				halfheight = cy / 2,
+				maxwidth = parseFloat( this._ui.container.css( "max-width" ) ),
+				roomtop = y - scrollTop,
+				roombot = scrollTop + screenHeight - y,
+				newtop,
+				newleft;
+
+			if ( roomtop > cy / 2 && roombot > cy / 2 ) {
+				newtop = y - halfheight;
+			} else {
+				// 30px tolerance off the edges
+				newtop = roomtop > roombot ? scrollTop + screenHeight - cy - 30 : scrollTop + 30;
+			}
+
+			// If the menuwidth is smaller than the screen center is
+			if ( cx < maxwidth ) {
+				newleft = ( screenWidth - cx ) / 2;
+			} else {
+				//otherwise insure a >= 30px offset from the left
+				newleft = x - cx / 2;
+
+				// 10px tolerance off the edges
+				if ( newleft < 10 ) {
+					newleft = 10;
+				} else if ( ( newleft + cx ) > screenWidth ) {
+					newleft = screenWidth - cx - 10;
+				}
+			}
+
+			return { x : newleft, y : newtop };
+		},
+
+		destroy: function () {
+		// Put the element back where we ripped it out from
+			this.element.insertBefore(this._ui.placeholder);
+
+			// Clean up
+			this._ui.placeholder.remove();
+			this._ui.container.remove();
+			this._ui.screen.remove();
+			this.element.triggerHandler("destroyed");
+			$.Widget.prototype.destroy.call(this);
+		},
+
+		open: function (x_where, y_where) {
+			if (!(this._isOpen || this.options.disabled)) {
+				var self = this,
+					x = (undefined === x_where ? $(window).width()  / 2 : x_where),
+					y = (undefined === y_where ? $(window).height() / 2 : y_where),
+					coords,
+					zIndexMax = 0,
+					ctxpopup = this.element.data("ctxpopup"),
+					popupWidth,
+					menuHeight,
+					menuWidth,
+					scrollTop,
+					screenHeight,
+					screenWidth,
+					roomtop,
+					roombot,
+					halfheight,
+					maxwidth,
+					newtop,
+					newleft;
+
+				if ( !ctxpopup ) {
+					popupWidth = $(window).width() * this.options.widthRatio;
+					this._ui.container.css("width", popupWidth);
+					// If the width of the popup exceeds the width of the window, we need to limit the width here,
+					// otherwise outer{Width,Height}(true) below will happily report the unrestricted values, causing
+					// the popup to get placed wrong.
+					if (this._ui.container.outerWidth(true) > $(window).width()) {
+						this._ui.container.css({"max-width" : $(window).width() - 30});
+					}
+				}
+
+				coords = this._placementCoords(x, y,
+					this._ui.container.outerWidth(true),
+					this._ui.container.outerHeight(true));
+
+				$(document)
+					.find("*")
+					.each(function () {
+						var el = $(this),
+							zIndex = parseInt(el.css("z-index"), 10);
+						if (!(el.is(self._ui.container) || el.is(self._ui.screen) || isNaN(zIndex))) {
+							zIndexMax = Math.max(zIndexMax, zIndex);
+						}
+					});
+
+				this._ui.screen
+					.height($(document).height())
+					.removeClass("ui-screen-hidden");
+
+				if (this.options.fade) {
+					this._ui.screen.animate({opacity: 0.5}, "fast");
+				} else {
+					this._ui.screen.css({opacity: 0.0});
+				}
+
+				//Recalculate popup position
+				menuHeight = this._ui.container.innerHeight(true);
+				menuWidth = this._ui.container.innerWidth(true);
+				scrollTop = $(window).scrollTop();
+				screenHeight = $(window).height();
+				screenWidth = $(window).width();
+				roomtop = y - scrollTop;
+				roombot = scrollTop + screenHeight - y;
+				halfheight = menuHeight / 2;
+				maxwidth = parseFloat( this._ui.container.css( "max-width" ) );
+				newtop = (screenHeight - menuHeight) / 2 + scrollTop;
+
+				if ( menuWidth < maxwidth ) {
+					newleft = ( screenWidth - menuWidth ) / 2;
+				} else {
+					//otherwise insure a >= 30px offset from the left
+					newleft = x - menuWidth / 2;
+
+					// 30px tolerance off the edges
+					if ( newleft < 30 ) {
+						newleft = 30;
+					} else if ( ( newleft + menuWidth ) > screenWidth ) {
+						newleft = screenWidth - menuWidth - 30;
+					}
+				}
+				//Recalculate popup position End
+				if ( ctxpopup ) {
+					newtop = coords.y;
+					newleft = coords.x;
+				}
+
+				this._ui.container
+					.removeClass("ui-selectmenu-hidden")
+					.css({
+						top: newtop,
+						left: newleft
+					})
+					.addClass("in")
+					.animationComplete(function () {
+						self._ui.screen.height($(document).height());
+					});
+
+				this._isOpen = true;
+			}
+		},
+
+		close: function () {
+			if (this._isOpen) {
+				var self = this,
+					hideScreen = function () {
+						self._ui.screen.addClass("ui-screen-hidden");
+						self._isOpen = false;
+						self.element.trigger("closed");
+					};
+
+				this._ui.container
+					.removeClass("in")
+					.addClass("reverse out")
+					.animationComplete(function () {
+						self._ui.container
+							.removeClass("reverse out")
+							.addClass("ui-selectmenu-hidden")
+							.removeAttr("style");
+					});
+
+				if (this.options.fade) {
+					this._ui.screen.animate({opacity: 0.0}, "fast", hideScreen);
+				} else {
+					hideScreen();
+				}
+			}
+		}
+	});
+
+	$.tizen.popupwindow.bindPopupToButton = function (btn, popup) {
+		if (btn.length === 0 || popup.length === 0) {
+			return;
+		}
+
+		var btnVClickHandler = function (e) {
+			// When /this/ button causes a popup, align the popup's theme with that of the button, unless the popup has a theme pre-set
+			if (!popup.jqmData("overlay-theme-set")) {
+				popup.popupwindow("option", "overlayTheme", btn.jqmData("theme"));
+			}
+			popup.popupwindow("open",
+				btn.offset().left + btn.outerWidth()  / 2,
+				btn.offset().top  + btn.outerHeight() / 2);
+
+			// Swallow event, because it might end up getting picked up by the popup window's screen handler, which
+			// will in turn cause the popup window to close - Thanks Sasha!
+			if (e.stopPropagation) {
+				e.stopPropagation();
+			}
+			if (e.preventDefault) {
+				e.preventDefault();
+			}
+		};
+
+		// If the popup has a theme set, prevent it from being clobbered by the associated button
+		if ((popup.popupwindow("option", "overlayTheme") || "").match(/[a-z]/)) {
+			popup.jqmData("overlay-theme-set", true);
+		}
+
+		btn
+			.attr({
+				"aria-haspopup": true,
+				"aria-owns": btn.attr("href")
+			})
+			.removeAttr("href")
+			.bind("vclick", btnVClickHandler);
+
+		popup.bind("destroyed", function () {
+			btn.unbind("vclick", btnVClickHandler);
+		});
+	};
+
+	$(document).bind("pagecreate create", function (e) {
+		$($.tizen.popupwindow.prototype.options.initSelector, e.target)
+			.not(":jqmData(role='none'), :jqmData(role='nojs')")
+			.popupwindow();
+
+		$("a[href^='#']:jqmData(rel='popupwindow')", e.target).each(function () {
+			$.tizen.popupwindow.bindPopupToButton($(this), $($(this).attr("href")));
+		});
+	});
+
+}(jQuery));
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// This widget is implemented in an extremely ugly way. It should derive from $.tizen.popupwindow, but it doesn't
+// because there's a bug in jquery.ui.widget.js which was fixed in jquery-ui commit
+// b9153258b0f0edbff49496ed16d2aa93bec07d95. Once a version of jquery-ui containing that commit is released
+// (probably >= 1.9m5), and jQuery Mobile picks up the widget from there, this widget needs to be rewritten properly.
+// The problem is that, when a widget inherits from a superclass and declares an object in its prototype identical in key
+// to one in the superclass, upon calling $.widget the object is overwritten in both the prototype of the superclass and
+// the prototype of the subclass. The prototype of the superclass should remain unchanged.
+
+(function ( $, undefined ) {
+	$.widget( "tizen.ctxpopup", $.tizen.widgetex, {
+		options: $.extend( {}, $.tizen.popupwindow.prototype.options, {
+			initSelector: ":not(:not(" + $.tizen.popupwindow.prototype.options.initSelector + ")):not(:not(:jqmData(show-arrow='true'), :jqmData(show-arrow)))"
+		} ),
+
+		_htmlProto: {
+source:
+
+$("<div><div id='outer' class='ui-ctxpopup'>" +
+  "    <div id='top' class='ui-ctxpopup-row' data-role='triangle' data-location='top'></div>" +
+  "    <div class='ui-ctxpopup-row'>" +
+  "        <div id='left' class='ui-ctxpopup-cell' data-role='triangle' data-location='left'></div>" +
+  "        <div id='container' class='ui-ctxpopup-cell'></div>" +
+  "        <div id='right' class='ui-ctxpopup-cell' data-role='triangle' data-location='right'></div>" +
+  "    </div>" +
+  "    <div id='bottom' class='ui-ctxpopup-row' data-role='triangle' data-location='bottom'></div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				outer		: "#outer",
+				container	: "#container", // the key has to have the name "container"
+				arrow		: {
+					all		: ":jqmData(role='triangle')",
+					l		: "#left",
+					t		: "#top",
+					r		: "#right",
+					b		: "#bottom"
+				}
+			}
+		},
+
+		_create: function () {
+			if ( !this.element.data( "popupwindow" ) ) {
+				this.element.popupwindow();
+			}
+
+			this.element.data( "popupwindow" )
+				._ui.container
+				.removeClass( "ui-popupwindow-padding" )
+				.append( this._ui.outer );
+			this._ui.outer.trigger( "create" ); // Creates the triangle widgets
+			this._ui.container
+				.addClass( "ui-popupwindow-padding" )
+				.append( this.element );
+		},
+
+		_setOption: function ( key, value ) {
+			$.tizen.popupwindow.prototype._setOption.apply( this.element.data( "popupwindow" ), arguments );
+			this.options[key] = value;
+		}
+	} );
+
+	var origOpen = $.tizen.popupwindow.prototype.open,
+		orig_setOption = $.tizen.popupwindow.prototype._setOption,
+		orig_placementCoords = $.tizen.popupwindow.prototype._placementCoords;
+
+	$.tizen.popupwindow.prototype._setOption = function ( key, value ) {
+		var ctxpopup = this.element.data( "ctxpopup" ),
+			needsApplying = true,
+			origContainer;
+		if ( ctxpopup ) {
+			if ( "shadow" === key || "overlayTheme" === key || "corners" === key ) {
+				origContainer = this._ui.container;
+
+				this._ui.container = ctxpopup._ui.container;
+				orig_setOption.apply( this, arguments );
+				this._ui.container = origContainer;
+				needsApplying = false;
+			}
+			ctxpopup.options[key] = value;
+		}
+
+		if ( needsApplying ) {
+			orig_setOption.apply(this, arguments);
+		}
+	};
+
+	$.tizen.popupwindow.prototype._placementCoords = function ( x, y, cx, cy ) {
+		var ctxpopup = this.element.data( "ctxpopup" ),
+			self = this,
+			coords = {},
+			minDiff,
+			minDiffIdx;
+
+		function getCoords( arrow, x_factor, y_factor ) {
+			// Unhide the arrow we want to test to take it into account
+			ctxpopup._ui.arrow.all.hide();
+			ctxpopup._ui.arrow[arrow].show();
+
+			var isHorizontal = ( "b" === arrow || "t" === arrow ),
+			// Names of keys used in calculations depend on whether things are horizontal or not
+				coord = ( isHorizontal
+						? { point: "x", size: "cx", beg: "left", outerSize: "outerWidth",  niceSize: "width", triangleSize : "height" }
+						: { point: "y", size: "cy", beg: "top",  outerSize: "outerHeight", niceSize: "height", triangleSize : "width" } ),
+				size = {
+					cx : self._ui.container.width(),
+					cy : self._ui.container.height()
+				},
+				halfSize = {
+					cx : size.cx / 2,
+					cy : size.cy / 2
+				},
+				desired = {
+					"x" : x + halfSize.cx * x_factor,
+					"y" : y + halfSize.cy * y_factor
+				},
+				orig = orig_placementCoords.call( self, desired.x, desired.y, size.cx, size.cy ),
+
+			// The triangleOffset must be clamped to the range described below:
+			//
+			//                          +-------...
+			//                          |   /\
+			//                          |  /  \
+			//                   ----+--+-,-----...
+			//lowerDiff       -->____|  |/ <-- possible rounded corner
+			//triangle size   -->    | /|
+			//                   ____|/ |
+			//                    ^  |\ | <-- lowest possible offset for triangle
+			// actual range of    |  | \| 
+			// arrow offset       |  |  | 
+			// values due to      |  .  . Payload table cell looks like
+			// possible rounded   |  .  . a popup window, and it may have
+			// corners and arrow  |  .  . arbitrary things like borders,
+			// triangle size -    |  |  | shadows, and rounded corners.
+			// our clamp range    |  | /|
+			//                   _v__|/ |
+			//triangle size   -->    |\ | <-- highest possible offset for triangle
+			//                   ____| \|
+			//upperDiff       -->    |  |\ <-- possible rounded corner
+			//                   ----+--+-'-----...
+			//                          |  \  /
+			//                          |   \/
+			//                          +-------...
+			//
+			// We calculate lowerDiff and upperDiff by considering the offset and width of the payload (this.element)
+			// versus the offset and width of the element enclosing the triangle, because the payload is inside
+			// whatever decorations (such as borders, shadow, rounded corners) and thus can give a reliable indication
+			// of the thickness of the combined decorations
+
+				arrowBeg = ctxpopup._ui.arrow[arrow].offset()[coord.beg],
+				arrowSize = ctxpopup._ui.arrow[arrow][coord.outerSize]( true ),
+				payloadBeg = self.element.offset()[coord.beg],
+				payloadSize = self.element[coord.outerSize]( true ),
+				triangleSize = ctxpopup._ui.arrow[arrow][coord.triangleSize](),
+				triangleOffset =
+					Math.max(
+						triangleSize // triangle size
+							+ Math.max( 0, payloadBeg - arrowBeg ), // lowerDiff
+						Math.min(
+								arrowSize // bottom
+									- triangleSize // triangle size
+									- Math.max( 0, arrowBeg + arrowSize - ( payloadBeg + payloadSize ) ), // upperDiff
+								arrowSize / 2 // arrow unrestricted offset
+									+ desired[coord.point]
+									- orig[coord.point]
+									- halfSize[coord.size] 
+							)
+					),
+					// Triangle points here
+				final = {
+					"x": orig.x + ( isHorizontal ? triangleOffset : 0) + ("r" === arrow ? size.cx : 0),
+					"y": orig.y + (!isHorizontal ? triangleOffset : 0) + ("b" === arrow ? size.cy : 0)
+				},
+				ret = {
+					actual			: orig,
+					triangleOffset	: triangleOffset,
+					absDiff			: Math.abs( x - final.x ) + Math.abs( y - final.y )
+				};
+
+			// Hide it back
+			ctxpopup._ui.arrow[arrow].hide();
+
+			return ret;
+		}
+
+		if ( ctxpopup ) {
+			// Returns:
+			// {
+			//    absDiff: int
+			//    triangleOffset: int
+			//    actual: { x: int, y: int }
+			// }
+
+			coords = {
+				l : getCoords( "l", 1, 0 ),
+				r : getCoords( "r", -1, 0 ),
+				t : getCoords( "t", 0, 1 ),
+				b : getCoords( "b", 0, -1 )
+			};
+
+			$.each( coords, function ( key, value ) {
+				if ( minDiff === undefined || value.absDiff < minDiff ) {
+					minDiff = value.absDiff;
+					minDiffIdx = key;
+				}
+			} );
+
+			// Side-effect: show the appropriate arrow and move it to the right offset
+			ctxpopup._ui.arrow[minDiffIdx]
+				.show()
+				.triangle( "option", "offset", coords[minDiffIdx].triangleOffset );
+			return coords[minDiffIdx].actual;
+		}
+
+		return orig_placementCoords.call( this, x, y, cx, cy );
+	};
+
+	$.tizen.popupwindow.prototype.open = function ( x, y ) {
+		var ctxpopup = this.element.data( "ctxpopup" );
+
+		if ( ctxpopup ) {
+			this._setShadow( false );
+			this._setCorners( false );
+			this._setOverlayTheme( null );
+			this._setOption( "overlayTheme", ctxpopup.options.overlayTheme );
+			ctxpopup._ui.arrow.all.triangle( "option", "color", ctxpopup._ui.container.css( "background-color" ) );
+
+			// temporary
+			$( '.ui-popupwindow' ).css( 'background', 'none' );
+		}
+
+		origOpen.call( this, x, y );
+	};
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		var ctxpopups = $( $.tizen.ctxpopup.prototype.options.initSelector, e.target );
+		$.tizen.ctxpopup.prototype.enhanceWithin( e.target );
+	} );
+}( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+// progress
+(function ( $, window, undefined) {
+	$.widget( "tizen.progress", $.mobile.widget, {
+		options: {
+			style: "circle",
+			running: false
+		},
+
+		_show: function () {
+			if ( !this.init ) {
+				$( this.element ).append( this.html );
+				this.init = true;
+			}
+			var style = this.options.style;
+			$( this.element ).addClass( "ui-progress-container-" + style + "-bg" );
+			$( this.element )
+				.find( ".ui-progress-" + style )
+				.addClass( this.runningClass );
+		},
+
+		_hide: function () {
+			$( this.element )
+				.find( ".ui-progress-" + this.options.style )
+				.removeClass( this.runningClass );
+		},
+
+		running: function ( newRunning ) {
+			// get value
+			if ( newRunning === undefined ) {
+				return this.options.running;
+			}
+
+			// set value
+			this._setOption( "running", newRunning );
+			return this;
+		},
+
+		_setOption: function ( key, value ) {
+			if ( key === "running" ) {
+				// normalize invalid value
+				if ( typeof value !== "boolean" ) {
+					window.alert( "running value MUST be boolean type!" );
+					return;
+				}
+				this.options.running = value;
+				this._refresh();
+			}
+		},
+
+		_refresh: function () {
+			if ( this.options.running ) {
+				this._show();
+			} else {
+				this._hide();
+			}
+		},
+
+		_create: function () {
+			var self = this,
+				element = this.element,
+				style = element.jqmData( "style" ),
+				runningClass;
+
+			if ( style ) {
+				this.options.style = style;
+			}
+
+			this.html = $( '<div class="ui-progress-container-' + style + '">' +
+					'<div class="ui-progress-' + style + '"></div>' +
+					'</div>' );
+
+			runningClass = "ui-progress-" + style + "-running";
+
+			$.extend( this, {
+				init: false,
+				runningClass: runningClass
+			} );
+			this._refresh();
+		}
+	} ); /* End of widget */
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( e.target ).find( ":jqmData(role='progress')" ).progress();
+	} );
+}(jQuery, this));
+/*
+ * jQuery UI Progressbar @VERSION
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ * Original file:
+ *   jquery.ui.progressbar.js
+ */
+/* This is from jquery ui plugin - progressbar 11/16/2011 */
+
+(function ( $, window, undefined ) {
+
+	$.widget( "tizen.progressbar", $.mobile.widget, {
+		options: {
+			value: 0,
+			max: 100
+		},
+
+		min: 0,
+
+		_create: function () {
+			this.element
+				.addClass( "ui-progressbar" )
+				.attr( {
+					role: "progressbar",
+					"aria-valuemin": this.min,
+					"aria-valuemax": this.options.max,
+					"aria-valuenow": this._value()
+				} );
+
+			this.valueDiv = $( "<div class='ui-progressbar-value'></div>" )
+				.appendTo( this.element );
+
+			this.oldValue = this._value();
+			this._refreshValue();
+		},
+
+		_destroy: function () {
+			this.element
+				.removeClass( "ui-progressbar" )
+				.removeAttr( "role" )
+				.removeAttr( "aria-valuemin" )
+				.removeAttr( "aria-valuemax" )
+				.removeAttr( "aria-valuenow" );
+
+			this.valueDiv.remove();
+		},
+
+		value: function ( newValue ) {
+			if ( newValue === undefined ) {
+				return this._value();
+			}
+
+			this._setOption( "value", newValue );
+			return this;
+		},
+
+		_setOption: function ( key, value ) {
+			if ( key === "value" ) {
+				this.options.value = value;
+				this._refreshValue();
+				if ( this._value() === this.options.max ) {
+					this._trigger( "complete" );
+				}
+			}
+			// jquery.ui.widget.js MUST be updated to new version!
+			//this._super( "_setOption", key, value );
+		},
+
+		_value: function () {
+			var val = this.options.value;
+			// normalize invalid value
+			if ( typeof val !== "number" ) {
+				val = 0;
+			}
+			return Math.min( this.options.max, Math.max( this.min, val ) );
+		},
+
+		_percentage: function () {
+			return 100 * this._value() / this.options.max;
+		},
+
+		_refreshValue: function () {
+			var value = this.value(),
+				percentage = this._percentage();
+
+			if ( this.oldValue !== value ) {
+				this.oldValue = value;
+				this._trigger( "change" );
+			}
+
+			this.valueDiv
+				.toggle( value > this.min )
+				.width( percentage.toFixed(0) + "%" );
+			this.element.attr( "aria-valuenow", value );
+		}
+	} );
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( e.target ).find( ":jqmData(role='progressbar')" ).progressbar();
+	} );
+
+}( jQuery, this ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+/*
+* jQuery Mobile Framework : "textinput" plugin for text inputs, textareas
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT or GPL Version 2 licenses.
+* http://jquery.org/license
+* Authors: Jinhyuk Jun <jinhyuk.jun@samsung.com>
+*          Wongi Lee <wongi11.lee@samsung.com>
+*/
+
+/**
+ * Searchbar can be created using <input> element with type=search
+ * <input type="search" name="search" id="search1" value=""  />
+ *
+ * Searchbar can be inserted 3 cases
+ * content : seachbar behave same as content element
+ * header : searchbar placed below title(header), It doesn't move when scrolling page
+ * inside optionheader : Searchbar placed inside optionheader, searchbar can be seen only expand optionheader
+ *
+ * Examples:
+ *
+ *	HTML markup for creating Searchbar
+ *		<input type="search"/>
+ *
+ *	How to make searchbar in content
+ *		<input type="search" name="" id="" value=""  />
+ *
+ *	How to make searchbar in title
+ *		<div data-role="header" data-position ="fixed" >
+ *			<h1>Searchbar</h1>
+ *			<input type="search" name="" id="" value=""  />
+ *		</div>
+ *
+ *	How to make searchbar inside optionheader
+ *		<div data-role="header" data-position ="fixed" >
+ *			<h1>Searchbar</h1>
+ *			<div id="myoptionheader2" data-role="optionheader">
+ *				<input type="search" name="" id="" value=""  />
+ *			</div>
+ *		</div>
+*/
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.searchbar", $.mobile.widget, {
+		options: {
+			theme: null,
+			initSelector: "input[type='search'],:jqmData(type='search'), input[type='tizen-search'],:jqmData(type='tizen-search')"
+		},
+
+		_create: function () {
+			var input = this.element,
+				o = this.options,
+				theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
+				themeclass  = " ui-body-" + theme,
+				focusedEl,
+				clearbtn,
+				currentPage = input.closest( ".ui-page" ),
+				searchicon,
+				cancelbtn,
+				defaultText,
+				defaultTextClass,
+				trimedText,
+				newClassName,
+				newStyle,
+				newDiv,
+				inputedText,
+				extraLineHeight,
+				keyupTimeoutBuffer,
+				keyup,
+				keyupTimeout;
+
+			function toggleClear() {
+				if ( !input.val() ) {
+					clearbtn.addClass( "ui-input-clear-hidden" );
+				} else {
+					clearbtn.removeClass( "ui-input-clear-hidden" );
+				}
+			}
+
+			function showCancel() {
+				focusedEl
+					.addClass( "ui-input-search-default" )
+					.removeClass( "ui-input-search-wide" );
+				cancelbtn
+					.addClass( "ui-btn-cancel-show" )
+					.removeClass( "ui-btn-cancel-hide" );
+				searchicon.hide();
+			}
+
+			function hideCancel() {
+				focusedEl
+					.addClass( "ui-input-search-wide" )
+					.removeClass( "ui-input-search-default" );
+				cancelbtn
+					.addClass( "ui-btn-cancel-hide" )
+					.removeClass( "ui-btn-cancel-show" );
+
+				if ( input.val() == "" ) {
+					searchicon.show();
+				}
+
+				toggleClear();
+			}
+
+			$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+			focusedEl = input.addClass( "ui-input-text ui-body-" + theme );
+
+			// XXX: Temporary workaround for issue 785 (Apple bug 8910589).
+			//      Turn off autocorrect and autocomplete on non-iOS 5 devices
+			//      since the popup they use can't be dismissed by the user. Note
+			//      that we test for the presence of the feature by looking for
+			//      the autocorrect property on the input element. We currently
+			//      have no test for iOS 5 or newer so we're temporarily using
+			//      the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas
+			if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) {
+				// Set the attribute instead of the property just in case there
+				// is code that attempts to make modifications via HTML.
+				input[0].setAttribute( "autocorrect", "off" );
+				input[0].setAttribute( "autocomplete", "off" );
+			}
+
+			focusedEl = input.wrap( "<div class='ui-input-search ui-shadow-inset ui-corner-all ui-btn-shadow" + themeclass + "'></div>" ).parent();
+			clearbtn = $( "<a href='#' class='ui-input-clear' title='clear text'>clear text</a>" )
+				.tap( function ( event ) {
+					event.preventDefault();
+					event.stopPropagation();
+
+					input.val( "" )
+						.blur()
+						.focus()
+						.trigger( "change" )
+						.trigger( "input" );
+					clearbtn.addClass( "ui-input-clear-hidden" );
+				} )
+				.appendTo( focusedEl )
+				.buttonMarkup({
+					icon: "deleteSearch",
+					iconpos: "notext",
+					corners: true,
+					shadow: true
+				} );
+
+			toggleClear();
+
+			input.keyup( toggleClear );
+
+			input.bind( 'paste cut keyup focus change blur', toggleClear );
+
+			//SLP --start search bar with cancel button
+			focusedEl.wrapAll( "<div class='input-search-bar'></div>" );
+
+			input.tap( function ( event ) {
+				inputedText = input.val();
+				input
+					.blur()
+					.focus();
+			} );
+
+			searchicon = $("<div class='ui-image-search ui-image-searchfield'></div>");
+			searchicon
+				.tap( function ( event ) {
+					searchicon.hide();
+
+					input
+						.blur()
+						.focus();
+				} )
+				.appendTo( focusedEl );
+
+			cancelbtn = $( "<a href='#' class='ui-input-cancel' title='clear text'>Cancel</a>" )
+				.tap(function ( event ) {
+					event.preventDefault();
+					event.stopPropagation();
+
+					input
+						.val( "" )
+						.blur()
+						.trigger( "change" );
+
+					hideCancel();
+				} )
+				.appendTo( focusedEl.parent() )
+				.buttonMarkup( {
+					iconpos: "cancel",
+					corners: true,
+					shadow: true
+				} );
+
+			// Input Focused
+			input.focus( function () {
+				showCancel();
+				focusedEl.addClass( "ui-focus" );
+			} );
+
+			// Input Blured
+			/* When user touch on page, it's same to blur */
+			$( "div.input-search-bar" ).tap( function ( event ) {
+				input.focus();
+				event.stopPropagation();
+			} );
+
+			$( currentPage ).bind("tap", function ( e ) {
+				focusedEl.removeClass( "ui-focus" );
+				hideCancel();
+				input.trigger( "change" );
+			} );
+
+			// Autogrow
+			if ( input.is( "textarea" ) ) {
+				extraLineHeight = 15;
+				keyupTimeoutBuffer = 100;
+				keyup = function () {
+					var scrollHeight = input[ 0 ].scrollHeight,
+						clientHeight = input[ 0 ].clientHeight;
+
+					if ( clientHeight < scrollHeight ) {
+						input.height(scrollHeight + extraLineHeight);
+					}
+				};
+
+				input.keyup( function () {
+					clearTimeout( keyupTimeout );
+					keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer );
+				});
+
+				// binding to pagechange here ensures that for pages loaded via
+				// ajax the height is recalculated without user input
+				$( document ).one( "pagechange", keyup );
+
+				// Issue 509: the browser is not providing scrollHeight properly until the styles load
+				if ( $.trim( input.val() ) ) {
+					// bind to the window load to make sure the height is calculated based on BOTH
+					// the DOM and CSS
+					$( window ).load( keyup );
+				}
+			}
+
+			// Default Text
+			defaultText = input.jqmData( "default-text" );
+
+			if ( ( defaultText != undefined ) && ( defaultText.length > 0 ) ) {
+				defaultTextClass = "ui-input-default-text";
+				trimedText = defaultText.replace(/\s/g, "");
+
+				/* Make new class for default text string */
+				newClassName = defaultTextClass + "-" + trimedText;
+				newStyle = $( "<style>" + '.' + newClassName + ":after" + "{content:" + "'" + defaultText + "'" + "}" + "</style>" );
+				$( 'html > head' ).append( newStyle );
+
+				/* Make new empty <DIV> for default text */
+				newDiv = $( "<div></div>" );
+
+				/* Add class and append new div */
+				newDiv.addClass( defaultTextClass );
+				newDiv.addClass( newClassName );
+				newDiv.tap( function ( event ) {
+					input.blur();
+					input.focus();
+				} );
+
+				input.parent().append( newDiv );
+
+				/* When focus, default text will be hide. */
+				input
+					.focus( function () {
+						input.parent().find( "div.ui-input-default-text" ).addClass( "ui-input-default-hidden" );
+					} )
+					.blur( function () {
+						var inputedText = input.val();
+						if ( inputedText.length > 0 ) {
+							input.parent().find( "div.ui-input-default-text" ).addClass( "ui-input-default-hidden" );
+						} else {
+							input.parent().find( "div.ui-input-default-text" ).removeClass( "ui-input-default-hidden" );
+						}
+					} );
+			}
+		},
+
+		disable: function () {
+			this.element.attr( "disabled", true );
+			this.element.parent().addClass( "ui-disabled" );
+		},
+
+		enable: function () {
+			this.element.attr( "disabled", false );
+			this.element.parent().removeClass( "ui-disabled" );
+		}
+	} );
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.searchbar.prototype.enhanceWithin( e.target );
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// shortcutscroll is a scrollview controller, which binds
+// a scrollview to a a list of short cuts; the shortcuts are built
+// from the text on dividers in the list. Clicking on a shortcut
+// instantaneously jumps the scrollview to the selected list divider;
+// mouse movements on the shortcut column move the scrollview to the
+// list divider matching the text currently under the touch; a popup
+// with the text currently under the touch is also displayed.
+//
+// To apply, add the attribute data-shortcutscroll="true" to a listview
+// (a <ul> or <ol> element inside a page). Alternatively, call
+// shortcutscroll() on an element.
+//
+// The closest element with class ui-scrollview-clip is used as the
+// scrollview to be controlled.
+//
+// If a listview has no dividers or a single divider, the widget won't
+// display.
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.shortcutscroll", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(shortcutscroll)"
+		},
+
+		_create: function () {
+			var $el = this.element,
+				self = this,
+				$popup,
+				page = $el.closest( ':jqmData(role="page")' ),
+				jumpToDivider;
+
+			this.scrollview = $el.closest( '.ui-scrollview-clip' );
+			this.shortcutsContainer = $( '<div class="ui-shortcutscroll"/>' );
+			this.shortcutsList = $( '<ul></ul>' );
+
+			// popup for the hovering character
+			this.shortcutsContainer.append($( '<div class="ui-shortcutscroll-popup"></div>' ) );
+			$popup = this.shortcutsContainer.find( '.ui-shortcutscroll-popup' );
+
+			this.shortcutsContainer.append( this.shortcutsList );
+			this.scrollview.append( this.shortcutsContainer );
+
+			// find the bottom of the last item in the listview
+			this.lastListItem = $el.children().last();
+
+			// remove scrollbars from scrollview
+			this.scrollview.find( '.ui-scrollbar' ).hide();
+
+			jumpToDivider = function ( divider ) {
+				// get the vertical position of the divider (so we can scroll to it)
+				var dividerY = $( divider ).position().top,
+					// find the bottom of the last list item
+					bottomOffset = self.lastListItem.outerHeight( true ) + self.lastListItem.position().top,
+					scrollviewHeight = self.scrollview.height(),
+
+				// check that after the candidate scroll, the bottom of the
+				// last item will still be at the bottom of the scroll view
+				// and not some way up the page
+					maxScroll = bottomOffset - scrollviewHeight,
+					dstOffset;
+
+				dividerY = ( dividerY > maxScroll ? maxScroll : dividerY );
+
+				// don't apply a negative scroll, as this means the
+				// divider should already be visible
+				dividerY = Math.max( dividerY, 0 );
+
+				// apply the scroll
+				self.scrollview.scrollview( 'scrollTo', 0, -dividerY );
+
+				dstOffset = self.scrollview.offset();
+				$popup
+					.text( $( divider ).text() )
+					.offset( { left : dstOffset.left + ( self.scrollview.width()  - $popup.width() ) / 2,
+								top  : dstOffset.top  + ( self.scrollview.height() - $popup.height() ) / 2 } )
+					.show();
+			};
+
+			this.shortcutsList
+			// bind mouse over so it moves the scroller to the divider
+				.bind( 'touchstart mousedown vmousedown touchmove vmousemove vmouseover ', function ( e ) {
+					// Get coords relative to the element
+					var coords = $.mobile.tizen.targetRelativeCoordsFromEvent( e ),
+						shortcutsListOffset = self.shortcutsList.offset();
+
+					// If the element is a list item, get coordinates relative to the shortcuts list
+					if ( e.target.tagName.toLowerCase() === "li" ) {
+						coords.x += $( e.target ).offset().left - shortcutsListOffset.left;
+						coords.y += $( e.target ).offset().top  - shortcutsListOffset.top;
+					}
+
+					// Hit test each list item
+					self.shortcutsList.find( 'li' ).each( function () {
+						var listItem = $( this ),
+							l = listItem.offset().left - shortcutsListOffset.left,
+							t = listItem.offset().top  - shortcutsListOffset.top,
+							r = l + Math.abs(listItem.outerWidth( true ) ),
+							b = t + Math.abs(listItem.outerHeight( true ) );
+
+						if ( coords.x >= l && coords.x <= r && coords.y >= t && coords.y <= b ) {
+							jumpToDivider( $( listItem.data( 'divider' ) ) );
+							return false;
+						}
+						return true;
+					} );
+
+					e.preventDefault();
+					e.stopPropagation();
+				} )
+				// bind mouseout of the shortcutscroll container to remove popup
+				.bind( 'touchend mouseup vmouseup vmouseout', function () {
+					$popup.hide();
+				} );
+
+			if ( page && !( page.is( ':visible' ) ) ) {
+				page.bind( 'pageshow', function () { self.refresh(); } );
+			} else {
+				this.refresh();
+			}
+
+			// refresh the list when dividers are filtered out
+			$el.bind( 'updatelayout', function () {
+				self.refresh();
+			} );
+		},
+
+		refresh: function () {
+			var self = this,
+				shortcutsTop,
+				minClipHeight,
+				dividers,
+				listItems;
+
+			this.shortcutsList.find( 'li' ).remove();
+
+			// get all the dividers from the list and turn them into shortcuts
+			dividers = this.element.find( '.ui-li-divider' );
+
+			// get all the list items
+			listItems = this.element.find( 'li:not(.ui-li-divider)) ');
+
+			// only use visible dividers
+			dividers = dividers.filter( ':visible' );
+			listItems = listItems.filter( ':visible' );
+
+			if ( dividers.length < 2 ) {
+				this.shortcutsList.hide();
+				return;
+			}
+
+			this.shortcutsList.show();
+
+			this.lastListItem = listItems.last();
+
+			dividers.each( function ( index, divider ) {
+				self.shortcutsList
+					.append( $( '<li>' + $( divider ).text() + '</li>' )
+						.data( 'divider', divider ) );
+			} );
+
+			// position the shortcut flush with the top of the first list divider
+			shortcutsTop = dividers.first().position().top;
+			this.shortcutsContainer.css( 'top', shortcutsTop );
+
+			// make the scrollview clip tall enough to show the whole of the shortcutslist
+			minClipHeight = shortcutsTop + this.shortcutsContainer.outerHeight() + 'px';
+			this.scrollview.css( 'min-height', minClipHeight );
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.shortcutscroll.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.shortcutscroll();
+	} );
+
+} ( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Max Waterman <max.waterman@intel.com>
+ * Authors: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/**
+ * tizenslider modifies the JQuery Mobile slider and is created in the same way.
+ *
+ * See the JQuery Mobile slider widget for more information :
+ *     http://jquerymobile.com/demos/1.0a4.1/docs/forms/forms-slider.html
+ *
+ * The JQuery Mobile slider option:
+ *     theme: specify the theme using the 'data-theme' attribute
+ *
+ * Options:
+ *     theme: string; the theme to use if none is specified using the 'data-theme' attribute
+ *            default: 'c'
+ *     popupEnabled: boolean; controls whether the popup is displayed or not
+ *                   specify if the popup is enabled using the 'data-popupEnabled' attribute
+ *                   set from javascript using .tizenslider('option','popupEnabled',newValue)
+ *
+ * Events:
+ *     changed: triggers when the value is changed (rather than when the handle is moved)
+ *
+ * Examples:
+ *
+ *     <a href="#" id="popupEnabler" data-role="button" data-inline="true">Enable popup</a>
+ *     <a href="#" id="popupDisabler" data-role="button" data-inline="true">Disable popup</a>
+ *     <div data-role="fieldcontain">
+ *         <input id="mySlider" data-theme='a' data-popupenabled='false' type="range" name="slider" value="7" min="0" max="9" />
+ *     </div>
+ *     <div data-role="fieldcontain">
+ *         <input id="mySlider2" type="range" name="slider" value="77" min="0" max="777" />
+ *     </div>
+ *
+ *     // disable popup from javascript
+ *     $('#mySlider').tizenslider('option','popupEnabled',false);
+ *
+ *     // from buttons
+ *     $('#popupEnabler').bind('vclick', function() {
+ *         $('#mySlider').tizenslider('option','popupEnabled',true);
+ *     });
+ *     $('#popupDisabler').bind('vclick', function() {
+ *         $('#mySlider').tizenslider('option','popupEnabled',false);
+ *     });
+ */
+
+(function ($, window, undefined) {
+	$.widget("tizen.tizenslider", $.mobile.widget, {
+		options: {
+			popupEnabled: true
+		},
+
+		popup: null,
+		handle: null,
+		handleText: null,
+
+		_create: function () {
+			this.currentValue = null;
+			this.popupVisible = false;
+
+			var self = this,
+				inputElement = $(this.element),
+				slider,
+				showPopup,
+				hidePopup,
+				positionPopup,
+				updateSlider,
+				slider_bar,
+				handle_press,
+				popupEnabledAttr,
+				icon;
+
+			// apply jqm slider
+			inputElement.slider();
+
+			// hide the slider input element proper
+			inputElement.hide();
+
+			self.popup = $('<div class="ui-slider-popup"></div>');
+
+			// set the popupEnabled according to the html attribute
+			popupEnabledAttr = inputElement.attr('data-popupenabled');
+			if ( popupEnabledAttr !== undefined ) {
+				self.options.popupEnabled = (popupEnabledAttr === 'true');
+			}
+
+			// get the actual slider added by jqm
+			slider = inputElement.next('.ui-slider');
+
+			icon = inputElement.attr('data-icon');
+
+			// wrap the background
+			if ( icon === undefined ) {
+				slider.wrap('<div class="ui-slider-bg"></div>');
+			} else {
+				slider.wrap('<div class="ui-slider-icon-bg"></div>');
+			}
+
+			// get the handle
+			self.handle = slider.find('.ui-slider-handle');
+
+			// remove the rounded corners from the slider and its children
+			slider.removeClass('ui-btn-corner-all');
+			slider.find('*').removeClass('ui-btn-corner-all');
+
+			// add icon
+
+			switch ( icon ) {
+			case 'bright':
+			case 'volume':
+				slider.before( $('<div class="ui-slider-left-' +
+							icon + '"></div>') );
+				slider.after( $('<div class="ui-slider-right-' +
+							icon + '"></div>') );
+				break;
+
+			case 'text':
+				slider.before( $('<div class="ui-slider-left-text">' +
+					'<span style="position:relative;top:0.4em;">' +
+					inputElement.attr('data-text-left') +
+					'</span></div>') );
+				slider.after( $('<div class="ui-slider-right-text">' +
+					'<span style="position:relative;top:0.4em;">' +
+					inputElement.attr('data-text-right') +
+					'</span></div>') );
+				break;
+			}
+
+			// slider bar
+			slider.append($('<div class="ui-slider-bar"></div>'));
+			self.slider_bar = slider.find('.ui-slider-bar');
+
+			// handle press
+			slider.append($('<div class="ui-slider-handle-press"></div>'));
+			self.handle_press = slider.find('.ui-slider-handle-press');
+			self.handle_press.css('display', 'none');
+
+			// add a popup element (hidden initially)
+			slider.before(self.popup);
+			self.popup.hide();
+
+			// get the element where value can be displayed
+			self.handleText = slider.find('.ui-btn-text');
+			if ( inputElement.attr('max') > 999 ) {
+				self.handleText.css('font-size', '0.8em');
+			}
+
+			// set initial value
+			self.updateSlider();
+
+			// bind to changes in the slider's value to update handle text
+			this.element.bind('change', function () {
+				self.updateSlider();
+			});
+
+			// bind clicks on the handle to show the popup
+			self.handle.bind('vmousedown', function () {
+				self.showPopup();
+			});
+
+			// watch events on the document to turn off the slider popup
+			slider.add(document).bind('vmouseup', function () {
+				self.hidePopup();
+			});
+		},
+
+		_handle_press_show: function () {
+			this.handle_press.css('display', '');
+		},
+
+		_handle_press_hide: function () {
+			this.handle_press.css('display', 'none');
+		},
+
+		// position the popup
+		positionPopup: function () {
+			var dstOffset = this.handle.offset();
+
+			this.popup.offset({
+				left: dstOffset.left + (this.handle.width() - this.popup.width()) / 2,
+				top: dstOffset.top  - this.popup.outerHeight() + 15
+			});
+
+			this.handle_press.offset({
+				left: dstOffset.left,
+				top: dstOffset.top
+			});
+		},
+
+		// show value on the handle and in popup
+		updateSlider: function () {
+			if ( this.popupVisible ) {
+				this.positionPopup();
+			}
+
+			// remove the title attribute from the handle (which is
+			// responsible for the annoying tooltip); NB we have
+			// to do it here as the jqm slider sets it every time
+			// the slider's value changes :(
+			this.handle.removeAttr('title');
+
+			this.slider_bar.width(this.handle.css('left'));
+
+			var newValue = this.element.val();
+
+			if ( newValue === this.currentValue ) {
+				return;
+			}
+
+			this.currentValue = newValue;
+			this.handleText.text(newValue);
+			this.popup.html(newValue);
+
+			this.element.trigger('update', newValue);
+		},
+
+		// show the popup
+		showPopup: function () {
+			if ( !(this.options.popupEnabled && !this.popupVisible) ) {
+				return;
+			}
+
+			this.handleText.hide();
+			this.popup.show();
+			this.popupVisible = true;
+			this._handle_press_show();
+		},
+
+		// hide the popup
+		hidePopup: function () {
+			if ( !(this.options.popupEnabled && this.popupVisible) ) {
+				return;
+			}
+
+			this.handleText.show();
+			this.popup.hide();
+			this.popupVisible = false;
+			this._handle_press_hide();
+		},
+
+		_setOption: function (key, value) {
+			var needToChange = ( value !== this.options[key] );
+
+			if ( !needToChange ) {
+				return;
+			}
+
+			switch ( key ) {
+			case 'popupEnabled':
+				this.options.popupEnabled = value;
+
+				if ( this.options.popupEnabled ) {
+					this.updateSlider();
+				} else {
+					this.hidePopup();
+				}
+
+				break;
+			}
+		}
+	});
+
+	// stop jqm from initialising sliders
+	$(document).bind("pagebeforecreate", function ( e ) {
+		if ($.data(window, "jqmSliderInitSelector") === undefined ) {
+			$.data(window, "jqmSliderInitSelector",
+				$.mobile.slider.prototype.options.initSelector);
+			$.mobile.slider.prototype.options.initSelector = null;
+		}
+	});
+
+	// initialise sliders with our own slider
+	$(document).bind("pagecreate", function ( e ) {
+		var jqmSliderInitSelector = $.data(window, "jqmSliderInitSelector");
+		$(e.target).find(jqmSliderInitSelector).not('select').tizenslider();
+		$(e.target).find(jqmSliderInitSelector).filter('select').slider();
+	});
+
+}( jQuery, this ));
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Kalyan Kondapally <kalyan.kondapally@intel.com>,
+ *          Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Widget which turns a list into a "swipe list":
+// i.e. each list item has a sliding "cover" which can be swiped
+// to the right (to reveal buttons underneath) or left (to
+// cover the buttons again). Clicking on a button under a swipelist
+// also moves the cover back to the left.
+//
+// To create a swipelist, you need markup like this:
+//
+// <pre>
+// &lt;ul data-role="swipelist"&gt;<br/>
+//     &lt;li&gt;<br/>
+//         &lt;div class="ui-grid-b"&gt;<br/>
+//             &lt;div class="ui-block-a"&gt;<br/>
+//                 &lt;a href="#" data-role="button" data-theme="a"&gt;Twitter&lt;/a&gt;<br/>
+//             &lt;/div&gt;<br/>
+//             &lt;div class="ui-block-b"&gt;<br/>
+//                 &lt;a href="#" data-role="button" data-theme="b"&gt;FaceBook&lt;/a&gt;<br/>
+//             &lt;/div&gt;<br/>
+//             &lt;div class="ui-block-c"&gt;<br/>
+//                 &lt;a href="#" data-role="button" data-theme="c"&gt;Google+&lt;/a&gt;<br/>
+//             &lt;/div&gt;<br/>
+//         &lt;/div&gt;<br/>
+//         &lt;div data-role="swipelist-item-cover"&gt;Nigel&lt;/div&gt;<br/>
+//     &lt;/li&gt;<br/>
+//     ...<br/>
+// &lt;/ul&gt;
+// </pre>
+//
+// In this case, the cover is over a grid of buttons;
+// but it is should also be possible to use other types of markup under the
+// list items.
+//
+// Note the use of a separate div, parented by the li element, marked
+// up with data-role="swipelist-item-cover". This div will usually
+// contain text. If you want other elements in your swipelist covers,
+// you may need to style them yourself. Because the covers aren't
+// technically list items, you may need to do some work to make them
+// look right.
+//
+// WARNING: This doesn't work well inside a scrollview widget, as
+// the touch events currently interfere with each other badly (e.g.
+// a swipe will work but cause a scroll as well).
+//
+// Theme: default is to use the theme on the target element,
+// theme passed in options, parent theme, or 'c' if none of the above.
+// If list items are themed individually, the cover will pick up the
+// theme of the list item which is its parent.
+//
+// Events:
+//
+//   animationComplete: Triggered by a cover when it finishes sliding
+//                      (to either the right or left).
+(function ($) {
+
+	$.widget("tizen.swipelist", $.mobile.widget, {
+		options: {
+			theme: null
+		},
+
+		_create: function () {
+			// use the theme set on the element, set in options,
+			// the parent theme, or 'c' (in that order of preference)
+			var theme = this.element.jqmData('theme') ||
+				this.options.theme ||
+				this.element.parent().jqmData('theme') ||
+				'c';
+
+			this.options.theme = theme;
+			this.refresh();
+		},
+
+		refresh: function () {
+			this._cleanupDom();
+
+			var self = this,
+				defaultCoverTheme,
+				covers;
+
+			defaultCoverTheme = 'ui-body-' + this.options.theme;
+
+			// swipelist is a listview
+			if (!this.element.hasClass('ui-listview')) {
+				this.element.listview();
+			}
+
+			this.element.addClass('ui-swipelist');
+
+			// get the list item covers
+			covers = this.element.find(':jqmData(role="swipelist-item-cover")');
+
+			covers.each(function () {
+				var cover = $(this),
+					coverTheme = defaultCoverTheme,
+				// get the parent li element and add classes
+					item = cover.closest('li'),
+					itemHasThemeClass;
+
+				// add swipelist CSS classes
+				item.addClass('ui-swipelist-item');
+				cover.addClass('ui-swipelist-item-cover');
+
+				// set swatch on cover: if the nearest list item has
+				// a swatch set on it, that will be used; otherwise, use
+				// the swatch set for the swipelist
+				itemHasThemeClass = item.attr('class')
+					.match(/ui\-body\-[a-z]|ui\-bar\-[a-z]/);
+
+				if (itemHasThemeClass) {
+					coverTheme = itemHasThemeClass[0];
+				}
+
+				cover.addClass(coverTheme);
+
+				// wrap inner HTML (so it can potentially be styled)
+				if (cover.has('.ui-swipelist-item-cover-inner').length === 0) {
+					cover.wrapInner($('<span/>').addClass('ui-swipelist-item-cover-inner'));
+				}
+
+				// bind to swipe events on the cover and the item
+				if (!(cover.data('animateRight') && cover.data('animateLeft'))) {
+					cover.data('animateRight', function () {
+						self._animateCover(cover, 100);
+					});
+
+					cover.data('animateLeft', function () {
+						self._animateCover(cover, 0);
+					});
+				}
+
+				// bind to synthetic events
+				item.bind('swipeleft', cover.data('animateLeft'));
+				cover.bind('swiperight', cover.data('animateRight'));
+
+				// any clicks on buttons inside the item also trigger
+				// the cover to slide back to the left
+				item.find('.ui-btn').bind('vclick', cover.data('animateLeft'));
+			});
+		},
+
+		_cleanupDom: function () {
+
+			var self = this,
+				defaultCoverTheme,
+				covers;
+
+			defaultCoverTheme = 'ui-body-' + this.options.theme;
+
+			this.element.removeClass('ui-swipelist');
+
+			// get the list item covers
+			covers = this.element.find(':jqmData(role="swipelist-item-cover")');
+
+			covers.each(function () {
+				var cover = $(this),
+					coverTheme = defaultCoverTheme,
+					text,
+					wrapper,
+					// get the parent li element and add classes
+					item = cover.closest('li'),
+					itemClass,
+					itemHasThemeClass;
+
+					// remove swipelist CSS classes
+				item.removeClass('ui-swipelist-item');
+				cover.removeClass('ui-swipelist-item-cover');
+
+				// remove swatch from cover: if the nearest list item has
+				// a swatch set on it, that will be used; otherwise, use
+				// the swatch set for the swipelist
+				itemClass = item.attr('class');
+				itemHasThemeClass = itemClass &&
+					itemClass.match(/ui\-body\-[a-z]|ui\-bar\-[a-z]/);
+
+				if (itemHasThemeClass) {
+					coverTheme = itemHasThemeClass[0];
+				}
+
+				cover.removeClass(coverTheme);
+
+				// remove wrapper HTML
+				wrapper = cover.find('.ui-swipelist-item-cover-inner');
+				wrapper.children().unwrap();
+				text = wrapper.text();
+
+				if (text) {
+					cover.append(text);
+					wrapper.remove();
+				}
+
+				// unbind swipe events
+				if (cover.data('animateRight') && cover.data('animateLeft')) {
+					cover.unbind('swiperight', cover.data('animateRight'));
+					item.unbind('swipeleft', cover.data('animateLeft'));
+
+					// unbind clicks on buttons inside the item
+					item.find('.ui-btn').unbind('vclick', cover.data('animateLeft'));
+
+					cover.data('animateRight', null);
+					cover.data('animateLeft', null);
+				}
+			});
+		},
+
+		// NB I tried to use CSS animations for this, but the performance
+		// and appearance was terrible on Android 2.2 browser;
+		// so I reverted to jQuery animations
+		//
+		// once the cover animation is done, the cover emits an
+		// animationComplete event
+		_animateCover: function (cover, leftPercentage) {
+			var animationOptions = {
+				easing: 'linear',
+				duration: 'fast',
+				queue: true,
+				complete: function () {
+					cover.trigger('animationComplete');
+				}
+			};
+
+			cover.stop();
+			cover.clearQueue();
+			cover.animate({left: leftPercentage + '%'}, animationOptions);
+		},
+
+		destroy: function () {
+			this._cleanupDom();
+		}
+
+	});
+
+	$(document).bind("pagecreate", function (e) {
+		$(e.target).find(":jqmData(role='swipelist')").swipelist();
+	});
+
+}(jQuery));
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays a simple two-state switch.
+//
+// To apply, add the attribute data-role="switch" to a <div>
+// element inside a page. Alternatively, call switch()
+// on an element, like this :
+//
+//     $( "#myswitch" ).toggleswitch();
+// where the html might be :
+//     <div id="myswitch"></div>
+//
+// Options:
+//     checked: Boolean; the state of the switch
+//     Default: true (up)
+//
+// Events:
+//     changed: Emitted when the switch is changed
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.toggleswitch", $.tizen.widgetex, {
+		options: {
+			onText			: "On",
+			offText			: "Off",
+			checked			: true,
+			initSelector	: ":jqmData(role='toggleswitch')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='outer' class='ui-btn ui-btn-corner-all ui-btn-inline ui-shadow ui-toggleswitch'>" +
+  "    <div class='ui-btn ui-btn-corner-all ui-btn-up-c toggleswitch-background'></div>" +
+  "    <div class='ui-btn ui-btn-corner-all ui-btn-up-c toggleswitch-background ui-btn-active' id='bg'></div>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-floating-button toggleswitch-mover' id='normal'>" +
+  "       <span data-normal-text='true'></span>" +
+  "    </a>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-floating-button toggleswitch-mover ui-btn-active' id='active'>" +
+  "       <span data-active-text='true'></span>" +
+  "    </a>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-sizer'>" +
+  "       <span data-normal-text='true'></span>" +
+  "    </a>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-sizer'>" +
+  "       <span data-active-text='true'></span>" +
+  "    </a>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-floating-button' id='button'>" +
+  "       <span id='btn-span'></span>" +
+  "    </a>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				outer		: "#outer",
+				bg			: "#bg",
+				txtMovers	: {
+					normal	: "#normal",
+					active	: "#active"
+				},
+				btn			: "#button",
+				btnSpan		: "#btn-span",
+				txt			: {
+					normal	: "[data-normal-text]",
+					active	: "[data-active-text]"
+				}
+			}
+		},
+
+		_value: {
+			attr: "data-" + ( $.mobile.ns || "" ) + "checked",
+			signal: "changed"
+		},
+
+		_create: function () {
+			var self = this;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.outer );
+
+			this._ui.outer.find( "a" ).buttonMarkup();
+			this._ui.txtMovers.normal
+				.add( this._ui.txtMovers.active )
+				.find( "*" )
+				.css( { "border-color": "transparent" } );
+			this._ui.btn.addClass( "toggleswitch-button" );
+/*
+		// Crutches for IE: It does not seem to understand opacity specified in a class, nor that opacity of an element
+		// affects all its children
+		if ($.mobile.browser.ie) {
+			// Remove this class, because it has no effect in IE :-S
+			this._ui.outer.find( "*" ).removeClass( "toggleswitch-button-transparent" );
+			// After adding the button markup, make everything transparent
+			this._ui.normalBackground.find( "*" ).css( "opacity", 0.0);
+			this._ui.activeBackground.find( "*" ).css( "opacity", 0.0);
+			this._ui.refButton.add( this._ui.refButton.find( "*" )).css( "opacity", 0.0);
+			this._ui.realButton.add( this._ui.realButton.find( "*" )).css( "opacity", 0.0);
+			// ... except the buttons that display the inital position of the switch
+			this._ui.initButtons
+				.add( this._ui.initButtons.find( "*" ))
+				.add( this._ui.fButton.find( "*" ))
+				.add( this._ui.fButton)
+				.css( "opacity", 1.0);
+		}
+*/
+			$.extend( this, {
+				_initial: true
+			} );
+
+			this._ui.btn
+				.add( this._ui.outer )
+				.bind( "vclick", function ( e ) {
+					self._setChecked( !( self.options.checked ) );
+					e.stopPropagation();
+				} );
+		},
+/*
+		_makeTransparent: function (obj, b) {
+			if ($.mobile.browser.ie)
+				obj.add(obj.find( "*" )).css( "opacity", b ? 0.0 : 1.0);
+			else
+				obj[b ? "addClass" : "removeClass"]( "toggleswitch-button-transparent" );
+		},
+*/
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.outer[value ? "addClass" : "removeClass"]( "ui-disabled" );
+		},
+
+		_updateBtnText: function () {
+			var noText = ( ( ( this.options.offText || "" ) === "" &&
+					( this.options.onText || "" ) === "" ) );
+			this._ui.btnSpan.html( ( noText ? "" : "&nbsp;" ) );
+			this._ui.outer.find( "a" )[( noText ? "addClass" : "removeClass" )]( "ui-btn-icon-notext" );
+		},
+
+		_setOnText: function ( value ) {
+			this._ui.txt.active.text( value );
+			this.options.onText = value;
+			this.element.attr( "data-" + ( $.mobile.ns || "" ) + "on-text", value );
+			this._updateBtnText();
+		},
+
+		_setOffText: function ( value ) {
+			this._ui.txt.normal.text( value );
+			this.options.offText = value;
+			this.element.attr( "data-" + ($.mobile.ns || "" ) + "off-text", value );
+			this._updateBtnText();
+		},
+
+		_setChecked: function ( checked ) {
+			if ( this.options.checked != checked ) {
+				var dst = checked
+					? { bg:  "0%", normalTop: "-50%", activeBot: "0%" }
+					: { bg: "50%", normalTop: "0%", activeBot: "-50%" },
+					method = ( this._initial ? "css" : "animate" );
+
+				this._ui.btn.add( this._ui.bg )[method]( { top: dst.bg } );
+				this._ui.txtMovers.normal[method]( { top: dst.normalTop } );
+				this._ui.txtMovers.active[method]( { bottom: dst.activeBot } );
+
+				this._initial = false;
+
+				this.options.checked = checked;
+				this.element.attr( "data-" + ( $.mobile.ns || "" ) + "checked", checked );
+				this._setValue( checked );
+			}
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.toggleswitch.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.toggleswitch();
+	} );
+
+}( jQuery ) );
+/*
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+( function ($, undefined) {
+
+	$.widget( "tizen.triangle", $.tizen.widgetex, {
+		options: {
+			extraClass: "",
+			offset: null,
+			color: null,
+			location: "top",
+			initSelector: ":jqmData(role='triangle')"
+		},
+
+		_create: function () {
+			var triangle = $( "<div></div>", {"class" : "ui-triangle"} );
+
+			$.extend(this, {
+				_triangle: triangle
+			});
+
+			this.element.addClass( "ui-triangle-container" ).append( triangle );
+		},
+
+		_doCSS: function () {
+			var location = ( this.options.location || "top" ),
+				offsetCoord = ( ($.inArray(location, ["top", "bottom"]) === -1) ? "top" : "left"),
+				cssArg = {
+					"border-bottom-color" : "top"    === location ? this.options.color : "transparent",
+					"border-top-color"    : "bottom" === location ? this.options.color : "transparent",
+					"border-left-color"   : "right"  === location ? this.options.color : "transparent",
+					"border-right-color"  : "left"   === location ? this.options.color : "transparent"
+				};
+
+			cssArg[offsetCoord] = this.options.offset;
+
+			this._triangle.removeAttr( "style" ).css( cssArg );
+		},
+
+		_setOffset: function ( value ) {
+			this.options.offset = value;
+			this.element.attr( "data-" + ($.mobile.ns || "") + "offset", value );
+			this._doCSS();
+		},
+
+		_setExtraClass: function ( value ) {
+			this._triangle.addClass( value );
+			this.options.extraClass = value;
+			this.element.attr( "data-" + ($.mobile.ns || "") + "extra-class", value );
+		},
+
+		_setColor: function ( value ) {
+			this.options.color = value;
+			this.element.attr( "data-" + ($.mobile.ns || "") + "color", value );
+			this._doCSS();
+		},
+
+		_setLocation: function ( value ) {
+			this.element
+				.removeClass( "ui-triangle-container-" + this.options.location )
+				.addClass( "ui-triangle-container-" + value );
+			this._triangle
+				.removeClass( "ui-triangle-" + this.options.location )
+				.addClass( "ui-triangle-" + value );
+
+			this.options.location = value;
+			this.element.attr( "data-" + ($.mobile.ns || "") + "location", value );
+
+			this._doCSS();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+	    $($.tizen.triangle.prototype.options.initSelector, e.target)
+	        .not(":jqmData(role='none'), :jqmData(role='nojs')")
+	        .triangle();
+	});
+
+}(jQuery) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Kangsik Kim <kangsik81.kim@samsung.com>
+*/
+
+/**
+ * Virtual Grid Widget for unlimited data.
+ * To support more then 1,000 items, special grid widget developed.
+ * Fast initialize and light DOM tree.
+ *
+ * HTML Attributes:
+ *
+ *		data-role:  virtualgridview
+ *		data-template : jQuery.template ID that populate into virtual list
+ *		data-dbtable : DB Table name. It used as window[DB NAME]. Loaded data should be converted as window object.
+ *		data-dbkey : Unique key of DB Table. To sync each element on virtual list with DB table.
+ *		data-column : Set a number of column. (Default : 3)
+ *		data-row : Set a number of row. (Default : 10)
+ *
+ *		ID : <UL> element that has "data-role=virtualgrid" must have ID attribute.
+ *		Class : <UL> element that has "data-role=virtualgrid" should have "vgLoadSuccess" class to guaranty DB loading is completed.
+ *
+ * APIs:
+ *
+ *		create ( void )
+ *			: API to call _create method. API for AJAX or DB loading callback.
+ *
+ * Events:
+ *
+ *
+ * Examples:
+ *
+ *			<script id="tizen-demo-namecard" type="text/x-jquery-tmpl">
+ *				<div class="ui-demo-namecard">
+ *					<div class="ui-demo-namecard-pic">
+ *						<img class="ui-demo-namecard-pic-img" src="${TEAM_LOGO}"  />
+ *					</div>
+ *					<div class="ui-demo-namecard-contents">
+ *						<span class="name ui-li-text-main">${NAME}</span>
+ *						<span class="active ui-li-text-sub">${ACTIVE}</span>
+ *						<span class="from ui-li-text-sub">${FROM}</span>
+ *					</div>
+ *				</div>
+ *			</script>
+ *			<div id="virtualgrid-demo" data-role="virtualgrid" data-column="3" data-row="60" data-template="tizen-demo-namecard" data-dbtable="JSON_DATA" >
+ *			</div>
+ *
+ */
+
+( function ( $, window, undefined ) {
+	$.widget( "tizen.virtualgrid", $.mobile.widget, {
+		options : {
+			id : "",
+			column : 3,
+			dbtable : "",
+			template : "",
+			row : 20,
+			dbkey : false
+		},
+		create : function () {
+			this._create();
+		},
+		_create : function () {
+			$.extend( this, {
+				NO_SCROLL : 0,
+				SCROLL_DOWN : 1,
+				SCROLL_UP : -1,
+				_titleHeight : 0,
+				_blockHeight : 0,
+				_bufferSize : 0,
+				_columnWidth : 0,
+				_totalItemCnt : 0,
+				_totalRowCnt : 0,
+				_currentIndex : 0,
+				_remainCount : 0,
+				_viewHeight : 0,
+				_direction : 0,
+				_firstIndex : 0,
+				_lastIndex : 0,
+				_prevPos : 0,
+				_numTopItems : 0
+			});
+
+			var opts = this.options, widget = this;
+			opts.id = "#" + this.element.attr( 'id' );
+
+			if ( $( opts.id ).hasClass( "vgLoadSuccess" ) ) {
+				$( opts.id ).empty();
+				// validation row, column count
+				// initialize global value.
+				widget._lastIndex = opts.row;
+				widget._bufferSize = ( parseInt( ( opts.row / 4 ), 10 ) );
+				widget._totalItemCnt = $( window[opts.dbtable] ).size();
+				widget._pushData( ( opts.template ), window[opts.dbtable] );
+				widget._reposition();
+				widget._addEvents();
+			}
+		},
+		_pushData : function ( template, data ) {
+			var widget = this,
+				opts = this.options,
+				dataTable = data,
+				myTemplate = $( "#" + template ),
+				viewcount = opts.row * opts.column,
+				lastIndex = viewcount,
+				index = 0,
+				rowIndex = 0,
+				colIndex = 0,
+				wrapBlock = null;
+
+			for ( rowIndex = 0; rowIndex < opts.row; rowIndex += 1 ) {
+				wrapBlock = widget._makeWrapBlock( myTemplate, dataTable );
+				$( wrapBlock ).attr( "id", "block_" + rowIndex );
+				$( opts.id ).append( wrapBlock );
+			}
+			widget._blockHeight = $( wrapBlock ).outerHeight();
+		},
+		// make a single row block
+		_makeWrapBlock : function ( myTemplate, dataTable ) {
+			var widget = this,
+				opts = widget.options,
+				index = widget._currentIndex,
+				htmlData = null,
+				colIndex = 0,
+				wrapBlock = document.createElement( "div" );
+
+			$( wrapBlock ).addClass( "ui-virtualgrid-wrapblock" );
+			for ( colIndex = 0; colIndex < opts.column; colIndex++ ) {
+				htmlData = myTemplate.tmpl( dataTable[index] );
+				$( wrapBlock ).append( htmlData );
+				index = index <= widget._totalItemCnt ? index + 1 : 0;
+			}
+			widget._currentIndex = index;
+			return wrapBlock;
+		},
+		_reposition : function () {
+			var widget = this,
+				$view = widget.element,
+				opts = this.options,
+				wrapsBlocks = null,
+				childBlocks = null,
+				blockCount = 0,
+				index = 0,
+				subIndex = 0,
+				firstBlock = $( ".ui-virtualgrid-wrapblock:first" ),
+				subBlocks = firstBlock.children();
+
+			widget._blockHeight = firstBlock.outerHeight();
+			widget._titleHeight = firstBlock.position().top;
+
+			if ( subBlocks[0] ) {
+				widget._columnWidth = $( subBlocks[0] ).outerWidth();
+			}
+
+			wrapsBlocks = $( ".ui-virtualgrid-wrapblock" );
+			blockCount = wrapsBlocks.length;
+			for ( index = 0; index < blockCount; index += 1 ) {
+				$( wrapsBlocks[index] ).css( "top", widget._titleHeight + ( index * widget._blockHeight  ) );
+				childBlocks = $( wrapsBlocks[index] ).children();
+				for ( subIndex = 0; subIndex < childBlocks.length; subIndex += 1 ) {
+					$( childBlocks[subIndex] ).css( "left", ( subIndex * widget._columnWidth ) + 'px' );
+				}
+			}
+			// check total row count and setup total height
+			widget._totalRowCnt = ( widget._totalItemCnt % opts.column ) === 0 ? ( widget._totalItemCnt / opts.column ) : ( parseInt( ( widget._totalItemCnt / opts.column ), 10 ) + 1 );
+			$( opts.id ).height( widget._totalRowCnt * widget._blockHeight );
+		},
+
+		_addEvents : function () {
+			var widget = this;
+
+			$( document ).bind( "scrollupdate.virtualgrid", function ( event ) {
+				widget._doScrollEvent(event);
+			});
+
+			$( document ).bind( "scrollstop.virtualgrid", function ( event ) {
+				widget._doScrollEvent(event);
+			});
+		},
+
+		_doScrollEvent : function ( event ) {
+			var widget = this,
+				$view = this.element,
+				opts = widget.options,
+				dataList = window [opts.dbtable],
+				filterCondition = 0,
+				replaceRowCnt = 0,
+				replacedCount = 0,
+				$scrollview = $view.closest (".ui-scrollview-view"),
+				transformValue = null,
+				curWindowTop = 0;
+
+			transformValue = widget._matrixToArray ($scrollview.css ("-webkit-transform"));
+			curWindowTop = Math.abs (transformValue [5]);
+			if (widget._prevPos > curWindowTop) {
+				widget._direction = widget.SCROLL_UP;
+			} else if (widget._prevPos < curWindowTop) {
+				widget._direction = widget.SCROLL_DOWN;
+			}
+
+			if (widget._direction == widget.SCROLL_DOWN) {
+				filterCondition = (curWindowTop - widget._blockHeight );
+				replaceRowCnt = $ (".ui-virtualgrid-wrapblock").filter (function () {
+					return (parseInt (($ (this).position ().top ), 10) < filterCondition );
+				}).size ();
+				if (replaceRowCnt > widget._bufferSize) {
+					$ (document).bind ("touchstart.virtualgrid", function (event) {
+						event.preventDefault ();
+					});
+
+					replaceRowCnt = replaceRowCnt - widget._bufferSize;
+					replacedCount = widget._moveTopBottom (widget._firstIndex, widget._lastIndex, replaceRowCnt, opts.dbkey);
+					widget._firstIndex += replacedCount;
+					widget._lastIndex += replacedCount;
+					widget._numTopItems -= replacedCount;
+					$ (document).unbind ("touchstart.virtualgrid");
+				}
+			} else if (widget._direction == widget.SCROLL_UP) {
+				filterCondition = (curWindowTop + widget._viewHeight + ( widget._blockHeight * 3) );
+				replaceRowCnt = $ (".ui-virtualgrid-wrapblock").filter (function () {
+					return (parseInt (($ (this).position ().top ), 10) > filterCondition );
+				}).size ();
+				if (replaceRowCnt > widget._bufferSize) {
+					$ (document).bind ("touchstart.virtualgrid", function (event) {
+						event.preventDefault ();
+					});
+
+					replaceRowCnt = replaceRowCnt - widget._bufferSize;
+					replacedCount = widget._moveBottomTop (widget._firstIndex, widget._lastIndex, replaceRowCnt, opts.dbkey);
+					widget._firstIndex -= replacedCount;
+					widget._lastIndex -= replacedCount;
+					widget._numTopItems += replacedCount;
+					$ (document).unbind ("touchstart.virtualgrid");
+				}
+			}
+			// save preve position information.
+			widget._prevPos = curWindowTop;
+		},
+
+		/* Matrix to Array function written by Blender@stackoverflow.nnikishi@emich.edu*/
+		_matrixToArray : function ( matrix ) {
+			var contents = matrix.substr( 7 );
+			contents = contents.substr( 0, contents.length - 1 );
+			return contents.split( ', ' );
+		},
+		//Move older item to bottom
+		_moveTopBottom : function ( v_firstIndex, v_lastIndex, num, key ) {
+			if ( v_firstIndex < 0 ) {
+				return;
+			}
+
+			if ( num < 1 ) {
+				return;
+			}
+
+			var widget = this,
+				opts = widget.options,
+				dataList = window[opts.dbtable],
+				dataIndex = ( ( v_lastIndex ) * opts.column ),
+				count = 0,
+				curBlock = null,
+				cur_item = null,
+				myTemplate = null,
+				htmlData = null,
+				i = 0,
+				j = 0,
+				contentsBlocks = null;
+
+			// wrap block count
+			// print argument value
+			for ( i = 0; i < num; i += 1 ) {
+				if ( v_lastIndex >= widget._totalRowCnt ) {
+					break;
+				}
+
+				// select block
+				curBlock = $( "#block_" + ( v_firstIndex + i ) );
+				if ( !curBlock ) {
+					break;
+				}
+
+				contentsBlocks = curBlock.children();
+
+				for ( j = 0; j < opts.column; j += 1 ) {
+					cur_item = contentsBlocks[j];
+					myTemplate = $( "#" + opts.template );
+					htmlData = myTemplate.tmpl( dataList[dataIndex] );
+					widget._replace( cur_item, htmlData, key );
+					dataIndex += 1;
+				}
+
+				curBlock.css( "top", widget._titleHeight + widget._blockHeight * ( ( v_lastIndex ) ) ).css( "left", 0 );
+
+				contentsBlocks.css( "top", widget._titleHeight + widget._blockHeight * ( ( v_lastIndex ) ) );
+				curBlock.attr( "id", "block_" + ( v_lastIndex ) );
+
+				v_lastIndex++;
+				count++;
+			}
+			return count;
+		},
+		_moveBottomTop : function ( v_firstIndex, v_lastIndex, num, key ) {
+			if ( v_firstIndex < 0 ) {
+				return;
+			}
+
+			if ( num < 1 ) {
+				return;
+			}
+
+			var widget = this,
+				opts = widget.options,
+				dataList = window[opts.dbtable],
+				dataIndex = ( ( v_firstIndex - 1 ) * opts.column ),
+				targetBlock = $( ".ui-virtualgrid-wrapblock:first" ),
+				curBlock = null,
+				contentsBlocks = null,
+				cur_item = null,
+				myTemplate = null,
+				htmlData = null,
+				i = 0,
+				j = 0,
+				count = 0;
+
+			// print argument value
+			for ( i = 0; i < num; i += 1 ) {
+				if ( v_firstIndex - 1 < 0 ) {
+					break;
+				}
+
+				// select block
+				curBlock = $( "#block_" + ( ( v_lastIndex - 1 ) - i ) );
+				if ( !curBlock ) {
+					break;
+				}
+
+				dataIndex = ( ( v_firstIndex - 1 ) * opts.column );
+
+				contentsBlocks = curBlock.children();
+				for ( j = 0; j < opts.column; j += 1 ) {
+					cur_item = contentsBlocks[j];
+					myTemplate = $( "#" + opts.template );
+					htmlData = myTemplate.tmpl( dataList[dataIndex] );
+					widget._replace( cur_item, htmlData, key );
+					dataIndex++;
+				}
+				curBlock.css( "top", widget._titleHeight + widget._blockHeight * ( ( v_firstIndex - 1 ) ) ).css( "left", 0 );
+				curBlock.attr( "id", "block_" + ( v_firstIndex - 1 ) );
+				contentsBlocks.css( "top", widget._titleHeight + widget._blockHeight * ( ( v_firstIndex - 1 ) ) );
+
+				v_firstIndex -= 1;
+				count++;
+			}
+			return count;
+		},
+		/* Text & image src replace function */
+		// @param oldItem   : prev HtmlDivElement
+		// @param newItem   : new HtmlDivElement for replace
+		// @param key       :
+		_replace : function ( oldItem, newItem, key ) {
+			$( oldItem ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).each( function ( index ) {
+				var oldObj = $( this ),
+					newText = $( newItem ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).eq( index ).text();
+
+				$( oldObj ).contents().filter( function () {
+					return ( this.nodeType == 3 );
+				}).get( 0 ).data = newText;
+			});
+
+			$( oldItem ).find( "img" ).each( function ( imgIndex ) {
+				var oldObj = $( this ),
+					newImg = $( newItem ).find( "img" ).eq( imgIndex ).attr( "src" );
+
+				$( oldObj ).attr( "src", newImg );
+			});
+			if ( key ) {
+				$( oldItem ).data( key, $( newItem ).data( key ) );
+			}
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function () {
+		$( ":jqmData(role='virtualgrid')" ).virtualgrid();
+	});
+
+} ( jQuery, window ) );
+
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Wongi Lee <wongi11.lee@samsung.com>
+ */
+
+/**
+ * Virtual List Widget for unlimited data.
+ * To support more then 1,000 items, special list widget developed. 
+ * Fast initialize and light DOM tree.
+ * DB connection and works like DB cursor.     
+ * 
+ * HTML Attributes:
+ *
+ *		data-role:	virtuallistview
+ *		data-template : jQuery.template ID that populate into virtual list 
+ *		data-dbtable : DB Table name. It used as window[DB NAME]. Loaded data should be converted as window object.
+ *		data-dbkey : Unique key of DB Table. To sync each element on virtual list with DB table. 
+ *		data-row : Optional. Set number of <li> elements that are used for data handling. 
+ *		
+ *		ID : <UL> element that has "data-role=virtuallist" must have ID attribute.
+ *		Class : <UL> element that has "data-role=virtuallist" should have "vlLoadSuccess" class to guaranty DB loading is completed. 
+ *
+ * * APIs:
+ *
+ *		create ( void )
+ *			: API to call _create method. API for AJAX or DB loading callback.
+ *
+ *		recreate ( Array )
+ *			: Update virtual list with new data array. For example, update with search result. 
+ *
+ * Events:
+ *
+ *		touchstart : Temporary preventDefault applied on touchstart event to avoid broken screen.
+ *
+ * Examples:
+ *
+ *		<script id="tmp-3-2-7" type="text/x-jquery-tmpl">
+ *			<li class="ui-li-3-2-7">
+ *				<span class="ui-li-text-main">${NAME}</span>
+ *				<img src="00_winset_icon_favorite_on.png" class="ui-li-icon-sub">
+ *				<span class="ui-li-text-sub">${ACTIVE}</span>
+ *				<span class="ui-li-text-sub2">${FROM}</span>
+ *			</li>
+ *		</script>
+ *
+ *		<ul id="virtuallist-normal_3_2_7_ul" data-role="virtuallistview" data-template="tmp-3-2-7" data-dbtable="JSON_DATA" data-row="100">
+ *		</ul>
+ *
+ */
+
+
+(function ( $, undefined ) {
+
+	/* Code for Virtual List Demo */
+	var listCountPerPage = {},	/* Keeps track of the number of lists per page UID. This allows support for multiple nested list in the same page. https://github.com/jquery/jquery-mobile/issues/1617 */
+		TOTAL_ITEMS = 0,
+		LINE_H = 0,
+		TITLE_H = 0,
+		CONTAINER_W = 0,
+		NO_SCROLL = 0,					/* ENUM */
+		SCROLL_DOWN = 1,				/* ENUM */
+		SCROLL_UP = -1,					/* ENUM */
+		MINIMUM_ROW = 20,
+		direction = NO_SCROLL,
+		first_index,
+		last_index,
+		num_top_items = 0;				//By scroll move, number of hidden elements.
+
+	$.widget( "tizen.virtuallistview", $.mobile.widget, {
+		options: {
+			theme: "s",
+			countTheme: "c",
+			headerTheme: "b",
+			dividerTheme: "b",
+			splitIcon: "arrow-r",
+			splitTheme: "b",
+			inset: false,
+			id:	"",					/* Virtual list UL elemet's ID */
+			childSelector: " li",	/* To support swipe list */
+			dbtable: "",
+			template : "",
+			dbkey: false,			/* Data's unique Key */
+			scrollview: false,
+			row: 100,
+			page_buf: 50,
+			initSelector: ":jqmData(role='virtuallistview')"
+		},
+
+		_stylerMouseUp: function () {
+			$( this ).addClass( "ui-btn-up-s" );
+			$( this ).removeClass( "ui-btn-down-s" );
+		},
+
+		_stylerMouseDown: function () {
+			$( this ).addClass( "ui-btn-down-s" );
+			$( this ).removeClass( "ui-btn-up-s" );
+		},
+
+		_stylerMouseOver: function () {
+			$( this ).toggleClass( "ui-btn-hover-s" );
+		},
+
+		_stylerMouseOut: function () {
+			$( this ).toggleClass( "ui-btn-hover-s" );
+		},
+
+		_pushData: function ( template, data ) {
+			var o = this.options,
+				i,
+				dataTable = data,
+				myTemplate = $( "#" + template ),
+				lastIndex = ( o.row > data.length ? data.length : o.row ),
+				htmlData;
+
+			for ( i = 0; i < lastIndex; i++ ) {
+				htmlData = myTemplate.tmpl( dataTable[i] );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + i ) );
+			}
+
+			/* After push data, re-style virtuallist widget */
+			$( o.id ).trigger( "create" );
+		},
+
+		_reposition: function ( event ) {
+			var o,
+				t = this,
+				padding;
+
+			if ( event.data ) {
+				o = event.data;
+			} else {
+				o = event;
+			}
+
+			if ( $( o.id + o.childSelector ).size() > 0 ) {
+				TITLE_H = $( o.id + o.childSelector + ':first' ).position().top;
+				LINE_H = $( o.id + o.childSelector + ':first' ).outerHeight();
+
+				CONTAINER_W = $( o.id ).innerWidth();
+
+				padding = parseInt( $( o.id + o.childSelector ).css( "padding-left" ), 10 ) + parseInt( $( o.id + o.childSelector ).css( "padding-right" ), 10 );
+
+				/* Add style */
+				$( o.id + ">" + o.childSelector ).addClass( "position_absolute" ).addClass( "ui-btn-up-s" )
+													.bind( "mouseup", t._stylerMouseUp )
+													.bind( "mousedown", t._stylerMouseDown )
+													.bind( "mouseover", t._stylerMouseOver )
+													.bind( "mouseout", t._stylerMouseOut );
+			}
+
+			$( o.id + ">" + o.childSelector ).each( function ( index ) {
+				$( this ).css( "top", TITLE_H + LINE_H * index + 'px' )
+					.css( "width", CONTAINER_W - padding );
+			} );
+
+			/* Set Max List Height */
+			$( o.id ).height( TOTAL_ITEMS * LINE_H );
+		},
+
+		_resize: function ( event ) {
+			var o,
+				t = this,
+				padding;
+
+			if ( event.data ) {
+				o = event.data;
+			} else {
+				o = event;
+			}
+
+			CONTAINER_W = $( o.id ).innerWidth();
+
+			padding = parseInt( $( o.id + o.childSelector ).css( "padding-left" ), 10 ) + parseInt( $( o.id + o.childSelector ).css( "padding-right" ), 10 );
+
+			$( o.id + o.childSelector ).each( function (index) {
+				$( this ).css( "width", CONTAINER_W - padding );
+			} );
+		},
+
+		_scrollmove: function ( event ) {
+			var velocity = 0,
+				o = event.data,
+				i,
+				dataList = window[o.dbtable],
+				_replace,		/* Function */
+				_moveTopBottom,	/* Function */
+				_moveBottomTop,	/* Function */
+				_matrixToArray,	/* Function */
+				$el,
+				transformValue,
+				curWindowTop,
+				cur_num_top_itmes;
+
+			/* Text & image src replace function */
+			_replace = function ( oldItem, newItem, key ) {
+				var oldObj,
+					newText,
+					newImg;
+
+				$( oldItem ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).each( function ( index ) {
+					oldObj = $( this );
+					newText = $( newItem ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).eq( index ).text();
+
+					$( oldObj).contents().filter( function () {
+						return ( this.nodeType == 3 );
+					} ).get( 0 ).data = newText;
+				} );
+
+				$( oldItem ).find( "img" ).each( function ( imgIndex ) {
+					oldObj = $( this );
+					newImg = $( newItem ).find( "img" ).eq( imgIndex ).attr( "src" );
+
+					$( oldObj ).attr( "src", newImg );
+				} );
+
+				if (key) {
+					$( oldItem ).data( key, $( newItem ).data( key ) );
+				}
+			};
+
+			//Move older item to bottom
+			_moveTopBottom = function ( v_firstIndex, v_lastIndex, num, key ) {
+				var myTemplate,
+					htmlData,
+					cur_item;
+
+				if (v_firstIndex < 0) {
+					return;
+				}
+
+				for ( i = 0; i < num; i++ ) {
+					if ( v_lastIndex + i > TOTAL_ITEMS ) {
+						break;
+					}
+
+					cur_item = $( '#li_' + ( v_firstIndex + i ) );
+
+					if ( cur_item ) {
+						/* Make New <LI> element from template. */
+						myTemplate = $( "#" + o.template );
+						htmlData = myTemplate.tmpl( dataList[ v_lastIndex + i ] );
+
+						/* Copy all data to current item. */
+						_replace( cur_item, htmlData, key );
+
+						/* Set New Position */
+						( cur_item ).css( 'top', TITLE_H + LINE_H * ( v_lastIndex + 1 + i ) ).attr( 'id', 'li_' + ( v_lastIndex + 1 + i ) );
+					} else {
+						break;
+					}
+				}
+			};
+
+			// Move older item to bottom
+			_moveBottomTop = function ( v_firstIndex, v_lastIndex, num, key ) {
+				var myTemplate,
+					htmlData,
+					cur_item;
+
+				if ( v_firstIndex < 0 ) {
+					return;
+				}
+
+				for ( i = 0; i < num; i++ ) {
+					cur_item = $( '#li_' + ( v_lastIndex - i ) );
+
+					if ( cur_item ) {
+						if ( v_firstIndex - 1 - i < 0 ) {
+							break;
+						}
+
+						/* Make New <LI> element from template. */
+						myTemplate = $( "#" + o.template );
+						htmlData = myTemplate.tmpl( dataList[ v_firstIndex - 1 - i ] );
+
+						/* Copy all data to current item. */
+						_replace( cur_item, htmlData, key );
+
+						/* Set New Position */
+						$( cur_item ).css( 'top', TITLE_H + LINE_H * ( v_firstIndex - 1 - i ) ).attr( 'id', 'li_' + ( v_firstIndex - 1 - i ) );
+					} else {
+						break;
+					}
+				}
+			};
+
+			/* Matrix to Array function written by Blender@stackoverflow.nnikishi@emich.edu*/
+			_matrixToArray = function ( matrix ) {
+				var contents = matrix.substr( 7 );
+
+				contents = contents.substr( 0, contents.length - 1 );
+
+				return contents.split( ', ' );
+			};
+
+			// Get scroll direction and velocity
+			/* with Scroll view */
+			if ( o.scrollview ) {
+				$el = $( o.id ).parentsUntil( ".ui-page" ).find( ".ui-scrollview-view" );
+				transformValue = _matrixToArray( $el.css( "-webkit-transform" ) );
+				curWindowTop = Math.abs( transformValue[ 5 ] );	/* Y vector */
+			} else {
+				curWindowTop = $( window ).scrollTop() - LINE_H;
+			}
+
+			cur_num_top_itmes = $( o.id + o.childSelector ).filter( function () {
+				return (parseInt( $( this ).css( "top" ), 10 ) < curWindowTop );
+			} ).size();
+
+			if ( num_top_items < cur_num_top_itmes ) {
+				direction = SCROLL_DOWN;
+				velocity = cur_num_top_itmes - num_top_items;
+				num_top_items = cur_num_top_itmes;
+			} else if ( num_top_items > cur_num_top_itmes ) {
+				direction = SCROLL_UP;
+				velocity = num_top_items - cur_num_top_itmes;
+				num_top_items = cur_num_top_itmes;
+			}
+
+			// Move items
+			if ( direction == SCROLL_DOWN ) {
+				if ( cur_num_top_itmes > o.page_buf ) {
+					if ( last_index + velocity > TOTAL_ITEMS ) {
+						velocity = TOTAL_ITEMS - last_index - 1;
+					}
+
+					/* Prevent scroll touch event while DOM access */
+					$(document).bind( "touchstart.virtuallist", function (event) {
+						event.preventDefault();
+					});
+
+					_moveTopBottom( first_index, last_index, velocity, o.dbkey );
+
+					first_index += velocity;
+					last_index += velocity;
+					num_top_items -= velocity;
+
+					/* Unset prevent touch event */
+					$( document ).unbind( "touchstart.virtuallist" );
+				}
+			} else if ( direction == SCROLL_UP ) {
+				if ( cur_num_top_itmes <= o.page_buf ) {
+					if ( first_index < velocity ) {
+						velocity = first_index;
+					}
+
+					/* Prevent scroll touch event while DOM access */
+					$( document ).bind( "touchstart.virtuallist", function ( event ) {
+						event.preventDefault();
+					});
+
+					_moveBottomTop( first_index, last_index, velocity, o.dbkey );
+
+					first_index -= velocity;
+					last_index -= velocity;
+					num_top_items += velocity;
+
+					/* Unset prevent touch event */
+					$( document ).unbind( "touchstart.virtuallist" );
+				}
+
+				if ( first_index < o.page_buf ) {
+					num_top_items = first_index;
+				}
+			}
+		},
+
+		recreate: function ( newArray ) {
+			var t = this,
+				o = this.options;
+
+			$( o.id ).empty();
+
+			TOTAL_ITEMS = newArray.length;
+			direction = NO_SCROLL;
+			first_index = 0;
+			last_index = o.row - 1;
+
+			t._pushData( ( o.template ), newArray );
+
+			if (o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			$( o.id ).virtuallistview();
+
+			t._reposition( o );
+
+			t.refresh( true );
+		},
+
+		_initList: function () {
+			var t = this,
+				o = this.options;
+
+			/* After AJAX loading success */
+			o.dbtable = t.element.data( "dbtable" );
+
+			TOTAL_ITEMS = $(window[o.dbtable]).size();
+
+			/* Make Gen list by template */
+			t._pushData( (o.template), window[o.dbtable]);
+
+			$( o.id ).parentsUntil( ".ui-page" ).parent().one( "pageshow", o, t._reposition);
+
+			/* Scrollview */
+			$( document ).bind( "scrollstop.virtuallist", t.options, t._scrollmove );
+
+			$( window ).bind( "resize.virtuallist", t._resize );
+
+			if ( o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			t.refresh( true );
+		},
+
+		create: function () {
+			var o = this.options;
+
+			/* external API for AJAX callback */
+			this._create( "create" );
+
+			this._reposition( o );
+		},
+
+		_create: function ( event ) {
+			var t = this,
+				o = this.options,
+				$el = this.element,
+				shortcutsContainer = $('<div class="ui-virtuallist"/>'),
+				shortcutsList = $('<ul></ul>'),
+				dividers = $el.find(':jqmData(role="virtuallistview" )'),
+				lastListItem = null,
+				shortcutscroll = this;
+
+			// create listview markup
+			t.element.addClass( function ( i, orig ) {
+				return orig + " ui-listview ui-virtual-list-container" + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
+			});
+
+			o.id = "#" + $el.attr( "id" );
+
+			$( o.id ).bind( "pagehide", function ( e ) {
+				$( o.id ).empty();
+			});
+
+			/* Scroll view */
+			if ( $( ".ui-scrollview-clip" ).size() > 0 ) {
+				o.scrollview = true;
+			} else {
+				o.scrollview = false;
+			}
+
+			/* Init list and page buf */
+			if ( $el.data( "row" ) ) {
+				o.row = $el.data( "row" );
+
+				if ( o.row < MINIMUM_ROW ) {
+					o.row = MINIMUM_ROW;
+				}
+
+				o.page_buf = parseInt( ( o.row / 2 ), 10 );
+			}
+
+			/* After DB Load complete, Init Vritual list */
+			if ( $( o.id ).hasClass( "vlLoadSuccess" ) ) {
+				$( o.id ).empty();
+
+				if ( $el.data( "template" ) ) {
+					o.template = $el.data( "template" );
+
+					/* to support swipe list, <li> or <ul> can be main node of virtual list. */
+					if ( $el.data( "swipelist" ) == true ) {
+						o.childSelector = " ul";
+					} else {
+						o.childSelector = " li";
+					}
+				}
+
+				/* Set data's unique key */
+				if ( $el.data( "dbkey" ) ) {
+					o.datakey = $el.data( "dbkey" );
+				}
+
+				first_index = 0;			//first id of <li> element.
+				last_index = o.row - 1;		//last id of <li> element.
+
+				t._initList();
+			}
+		},
+
+		destroy : function () {
+			var o = this.options;
+
+			$( document ).unbind( "scrollstop" );
+
+			$( window ).unbind( "resize.virtuallist" );
+
+			$( o.id ).empty();
+		},
+
+		_itemApply: function ( $list, item ) {
+			var $countli = item.find( ".ui-li-count" );
+
+			if ( $countli.length ) {
+				item.addClass( "ui-li-has-count" );
+			}
+
+			$countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" );
+
+			// TODO class has to be defined in markup
+			item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end()
+				.find( "p, dl" ).addClass( "ui-li-desc" ).end()
+				.find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each( function () {
+					item.addClass( $( this ).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+				}).end()
+				.find( ".ui-li-aside" ).each(function () {
+					var $this = $( this );
+					$this.prependTo( $this.parent() ); //shift aside to front for css float
+				} );
+		},
+
+		_removeCorners: function ( li, which ) {
+			var top = "ui-corner-top ui-corner-tr ui-corner-tl",
+				bot = "ui-corner-bottom ui-corner-br ui-corner-bl";
+
+			li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) );
+
+			if ( which === "top" ) {
+				li.removeClass( top );
+			} else if ( which === "bottom" ) {
+				li.removeClass( bot );
+			} else {
+				li.removeClass( top + " " + bot );
+			}
+		},
+
+		_refreshCorners: function ( create ) {
+			var $li,
+				$visibleli,
+				$topli,
+				$bottomli;
+
+			if ( this.options.inset ) {
+				$li = this.element.children( "li" );
+				// at create time the li are not visible yet so we need to rely on .ui-screen-hidden
+				$visibleli = create ? $li.not( ".ui-screen-hidden" ) : $li.filter( ":visible" );
+
+				this._removeCorners( $li );
+
+				// Select the first visible li element
+				$topli = $visibleli.first()
+					.addClass( "ui-corner-top" );
+
+				$topli.add( $topli.find( ".ui-btn-inner" ) )
+					.find( ".ui-li-link-alt" )
+						.addClass( "ui-corner-tr" )
+					.end()
+					.find( ".ui-li-thumb" )
+						.not( ".ui-li-icon" )
+						.addClass( "ui-corner-tl" );
+
+				// Select the last visible li element
+				$bottomli = $visibleli.last()
+					.addClass( "ui-corner-bottom" );
+
+				$bottomli.add( $bottomli.find( ".ui-btn-inner" ) )
+					.find( ".ui-li-link-alt" )
+						.addClass( "ui-corner-br" )
+					.end()
+					.find( ".ui-li-thumb" )
+						.not( ".ui-li-icon" )
+						.addClass( "ui-corner-bl" );
+			}
+		},
+
+		refresh: function ( create ) {
+			this.parentPage = this.element.closest( ".ui-page" );
+			this._createSubPages();
+
+			var o = this.options,
+				$list = this.element,
+				self = this,
+				dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,
+				listsplittheme = $list.jqmData( "splittheme" ),
+				listspliticon = $list.jqmData( "spliticon" ),
+				li = $list.children( "li" ),
+				counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,
+				item,
+				itemClass,
+				temTheme,
+				a,
+				last,
+				splittheme,
+				countParent,
+				icon,
+				pos,
+				numli,
+				itemTheme;
+
+			if ( counter ) {
+				$list.find( ".ui-li-dec" ).remove();
+			}
+
+			for ( pos = 0, numli = li.length; pos < numli; pos++ ) {
+				item = li.eq( pos );
+				itemClass = "ui-li";
+
+				// If we're creating the element, we update it regardless
+				if ( create || !item.hasClass( "ui-li" ) ) {
+					itemTheme = item.jqmData( "theme" ) || o.theme;
+					a = item.children( "a" );
+
+					if ( a.length ) {
+						icon = item.jqmData( "icon" );
+
+						item.buttonMarkup({
+							wrapperEls: "div",
+							shadow: false,
+							corners: false,
+							iconpos: "right",
+							/* icon: a.length > 1 || icon === false ? false : icon || "arrow-r",*/
+							icon: false,	/* Remove unnecessary arrow icon */
+							theme: itemTheme
+						});
+
+						if ( ( icon != false ) && ( a.length == 1 ) ) {
+							item.addClass( "ui-li-has-arrow" );
+						}
+
+						a.first().addClass( "ui-link-inherit" );
+
+						if ( a.length > 1 ) {
+							itemClass += " ui-li-has-alt";
+
+							last = a.last();
+							splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;
+
+							last.appendTo(item)
+								.attr( "title", last.getEncodedText() )
+								.addClass( "ui-li-link-alt" )
+								.empty()
+								.buttonMarkup({
+									shadow: false,
+									corners: false,
+									theme: itemTheme,
+									icon: false,
+									iconpos: false
+								})
+								.find( ".ui-btn-inner" )
+								.append(
+									$( "<span />" ).buttonMarkup({
+										shadow: true,
+										corners: true,
+										theme: splittheme,
+										iconpos: "notext",
+										icon: listspliticon || last.jqmData( "icon" ) || o.splitIcon
+									})
+								);
+						}
+					} else if ( item.jqmData( "role" ) === "list-divider" ) {
+
+						itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;
+						item.attr( "role", "heading" );
+
+						//reset counter when a divider heading is encountered
+						if ( counter ) {
+							counter = 1;
+						}
+
+					} else {
+						itemClass += " ui-li-static ui-body-" + itemTheme;
+					}
+				}
+
+				if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+					countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );
+
+					countParent.addClass( "ui-li-jsnumbering" )
+						.prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );
+				}
+
+				item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass );
+
+				self._itemApply( $list, item );
+			}
+
+			this._refreshCorners( create );
+		},
+
+		//create a string for ID/subpage url creation
+		_idStringEscape: function ( str ) {
+			return str.replace(/\W/g , "-");
+		},
+
+		_createSubPages: function () {
+			var parentList = this.element,
+				parentPage = parentList.closest( ".ui-page" ),
+				parentUrl = parentPage.jqmData( "url" ),
+				parentId = parentUrl || parentPage[ 0 ][ $.expando ],
+				parentListId = parentList.attr( "id" ),
+				o = this.options,
+				dns = "data-" + $.mobile.ns,
+				self = this,
+				persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),
+				hasSubPages,
+				newRemove;
+
+			if ( typeof listCountPerPage[ parentId ] === "undefined" ) {
+				listCountPerPage[ parentId ] = -1;
+			}
+
+			parentListId = parentListId || ++listCountPerPage[ parentId ];
+
+			$( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function ( i ) {
+				var self = this,
+					list = $( this ),
+					listId = list.attr( "id" ) || parentListId + "-" + i,
+					parent = list.parent(),
+					nodeEls,
+					title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text
+					id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,
+					theme = list.jqmData( "theme" ) || o.theme,
+					countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,
+					newPage,
+					anchor;
+
+				nodeEls = $( list.prevAll().toArray().reverse() );
+				nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim( parent.contents()[ 0 ].nodeValue ) + "</span>" );
+
+				//define hasSubPages for use in later removal
+				hasSubPages = true;
+
+				newPage = list.detach()
+							.wrap( "<div " + dns + "role='page' " +	dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )
+							.parent()
+								.before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )
+								.after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='" + persistentFooterID + "'>" ) : "" )
+								.parent()
+								.appendTo( $.mobile.pageContainer );
+
+				newPage.page();
+
+				anchor = parent.find('a:first');
+
+				if ( !anchor.length ) {
+					anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );
+				}
+
+				anchor.attr( "href", "#" + id );
+
+			}).virtuallistview();
+
+			// on pagehide, remove any nested pages along with the parent page, as long as they aren't active
+			// and aren't embedded
+			if ( hasSubPages &&
+						parentPage.is( ":jqmData(external-page='true')" ) &&
+						parentPage.data( "page" ).options.domCache === false ) {
+
+				newRemove = function ( e, ui ) {
+					var nextPage = ui.nextPage, npURL;
+
+					if ( ui.nextPage ) {
+						npURL = nextPage.jqmData( "url" );
+						if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {
+							self.childPages().remove();
+							parentPage.remove();
+						}
+					}
+				};
+
+				// unbind the original page remove and replace with our specialized version
+				parentPage
+					.unbind( "pagehide.remove" )
+					.bind( "pagehide.remove", newRemove );
+			}
+		},
+
+		// TODO sort out a better way to track sub pages of the virtuallistview this is brittle
+		childPages: function () {
+			var parentUrl = this.parentPage.jqmData( "url" );
+
+			return $( ":jqmData(url^='" +  parentUrl + "&" + $.mobile.subPageUrlKey + "')" );
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.virtuallistview.prototype.options.initSelector, e.target ).virtuallistview();
+	});
+
+} ( jQuery ) );
+/*!
+ * Globalize
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ */
+
+(function( window, undefined ) {
+
+var Globalize,
+	// private variables
+	regexHex,
+	regexInfinity,
+	regexParseFloat,
+	regexTrim,
+	// private JavaScript utility functions
+	arrayIndexOf,
+	endsWith,
+	extend,
+	isArray,
+	isFunction,
+	isObject,
+	startsWith,
+	trim,
+	truncate,
+	zeroPad,
+	// private Globalization utility functions
+	appendPreOrPostMatch,
+	expandFormat,
+	formatDate,
+	formatNumber,
+	getTokenRegExp,
+	getEra,
+	getEraYear,
+	parseExact,
+	parseNegativePattern;
+
+// Global variable (Globalize) or CommonJS module (globalize)
+Globalize = function( cultureSelector ) {
+	return new Globalize.prototype.init( cultureSelector );
+};
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	module.exports = Globalize;
+} else {
+	// Export as global variable
+	window.Globalize = Globalize;
+}
+
+Globalize.cultures = {};
+
+Globalize.prototype = {
+	constructor: Globalize,
+	init: function( cultureSelector ) {
+		this.cultures = Globalize.cultures;
+		this.cultureSelector = cultureSelector;
+
+		return this;
+	}
+};
+Globalize.prototype.init.prototype = Globalize.prototype;
+
+// 1.	 When defining a culture, all fields are required except the ones stated as optional.
+// 2.	 Each culture should have a ".calendars" object with at least one calendar named "standard"
+//		 which serves as the default calendar in use by that culture.
+// 3.	 Each culture should have a ".calendar" object which is the current calendar being used,
+//		 it may be dynamically changed at any time to one of the calendars in ".calendars".
+Globalize.cultures[ "default" ] = {
+	// A unique name for the culture in the form <language code>-<country/region code>
+	name: "en",
+	// the name of the culture in the english language
+	englishName: "English",
+	// the name of the culture in its own language
+	nativeName: "English",
+	// whether the culture uses right-to-left text
+	isRTL: false,
+	// "language" is used for so-called "specific" cultures.
+	// For example, the culture "es-CL" means "Spanish, in Chili".
+	// It represents the Spanish-speaking culture as it is in Chili,
+	// which might have different formatting rules or even translations
+	// than Spanish in Spain. A "neutral" culture is one that is not
+	// specific to a region. For example, the culture "es" is the generic
+	// Spanish culture, which may be a more generalized version of the language
+	// that may or may not be what a specific culture expects.
+	// For a specific culture like "es-CL", the "language" field refers to the
+	// neutral, generic culture information for the language it is using.
+	// This is not always a simple matter of the string before the dash.
+	// For example, the "zh-Hans" culture is netural (Simplified Chinese).
+	// And the "zh-SG" culture is Simplified Chinese in Singapore, whose lanugage
+	// field is "zh-CHS", not "zh".
+	// This field should be used to navigate from a specific culture to it's
+	// more general, neutral culture. If a culture is already as general as it
+	// can get, the language may refer to itself.
+	language: "en",
+	// numberFormat defines general number formatting rules, like the digits in
+	// each grouping, the group separator, and how negative numbers are displayed.
+	numberFormat: {
+		// [negativePattern]
+		// Note, numberFormat.pattern has no "positivePattern" unlike percent and currency,
+		// but is still defined as an array for consistency with them.
+		//   negativePattern: one of "(n)|-n|- n|n-|n -"
+		pattern: [ "-n" ],
+		// number of decimal places normally shown
+		decimals: 2,
+		// string that separates number groups, as in 1,000,000
+		",": ",",
+		// string that separates a number from the fractional portion, as in 1.99
+		".": ".",
+		// array of numbers indicating the size of each number group.
+		// TODO: more detailed description and example
+		groupSizes: [ 3 ],
+		// symbol used for positive numbers
+		"+": "+",
+		// symbol used for negative numbers
+		"-": "-",
+		// symbol used for NaN (Not-A-Number)
+		NaN: "NaN",
+		// symbol used for Negative Infinity
+		negativeInfinity: "-Infinity",
+		// symbol used for Positive Infinity
+		positiveInfinity: "Infinity",
+		percent: {
+			// [negativePattern, positivePattern]
+			//   negativePattern: one of "-n %|-n%|-%n|%-n|%n-|n-%|n%-|-% n|n %-|% n-|% -n|n- %"
+			//   positivePattern: one of "n %|n%|%n|% n"
+			pattern: [ "-n %", "n %" ],
+			// number of decimal places normally shown
+			decimals: 2,
+			// array of numbers indicating the size of each number group.
+			// TODO: more detailed description and example
+			groupSizes: [ 3 ],
+			// string that separates number groups, as in 1,000,000
+			",": ",",
+			// string that separates a number from the fractional portion, as in 1.99
+			".": ".",
+			// symbol used to represent a percentage
+			symbol: "%"
+		},
+		currency: {
+			// [negativePattern, positivePattern]
+			//   negativePattern: one of "($n)|-$n|$-n|$n-|(n$)|-n$|n-$|n$-|-n $|-$ n|n $-|$ n-|$ -n|n- $|($ n)|(n $)"
+			//   positivePattern: one of "$n|n$|$ n|n $"
+			pattern: [ "($n)", "$n" ],
+			// number of decimal places normally shown
+			decimals: 2,
+			// array of numbers indicating the size of each number group.
+			// TODO: more detailed description and example
+			groupSizes: [ 3 ],
+			// string that separates number groups, as in 1,000,000
+			",": ",",
+			// string that separates a number from the fractional portion, as in 1.99
+			".": ".",
+			// symbol used to represent currency
+			symbol: "$"
+		}
+	},
+	// calendars defines all the possible calendars used by this culture.
+	// There should be at least one defined with name "standard", and is the default
+	// calendar used by the culture.
+	// A calendar contains information about how dates are formatted, information about
+	// the calendar's eras, a standard set of the date formats,
+	// translations for day and month names, and if the calendar is not based on the Gregorian
+	// calendar, conversion functions to and from the Gregorian calendar.
+	calendars: {
+		standard: {
+			// name that identifies the type of calendar this is
+			name: "Gregorian_USEnglish",
+			// separator of parts of a date (e.g. "/" in 11/05/1955)
+			"/": "/",
+			// separator of parts of a time (e.g. ":" in 05:44 PM)
+			":": ":",
+			// the first day of the week (0 = Sunday, 1 = Monday, etc)
+			firstDay: 0,
+			days: {
+				// full day names
+				names: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
+				// abbreviated day names
+				namesAbbr: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
+				// shortest day names
+				namesShort: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ]
+			},
+			months: {
+				// full month names (13 months for lunar calendards -- 13th month should be "" if not lunar)
+				names: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "" ],
+				// abbreviated month names
+				namesAbbr: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "" ]
+			},
+			// AM and PM designators in one of these forms:
+			// The usual view, and the upper and lower case versions
+			//   [ standard, lowercase, uppercase ]
+			// The culture does not use AM or PM (likely all standard date formats use 24 hour time)
+			//   null
+			AM: [ "AM", "am", "AM" ],
+			PM: [ "PM", "pm", "PM" ],
+			eras: [
+				// eras in reverse chronological order.
+				// name: the name of the era in this culture (e.g. A.D., C.E.)
+				// start: when the era starts in ticks (gregorian, gmt), null if it is the earliest supported era.
+				// offset: offset in years from gregorian calendar
+				{
+					"name": "A.D.",
+					"start": null,
+					"offset": 0
+				}
+			],
+			// when a two digit year is given, it will never be parsed as a four digit
+			// year greater than this year (in the appropriate era for the culture)
+			// Set it as a full year (e.g. 2029) or use an offset format starting from
+			// the current year: "+19" would correspond to 2029 if the current year 2010.
+			twoDigitYearMax: 2029,
+			// set of predefined date and time patterns used by the culture
+			// these represent the format someone in this culture would expect
+			// to see given the portions of the date that are shown.
+			patterns: {
+				// short date pattern
+				d: "M/d/yyyy",
+				// long date pattern
+				D: "dddd, MMMM dd, yyyy",
+				// short time pattern
+				t: "h:mm tt",
+				// long time pattern
+				T: "h:mm:ss tt",
+				// long date, short time pattern
+				f: "dddd, MMMM dd, yyyy h:mm tt",
+				// long date, long time pattern
+				F: "dddd, MMMM dd, yyyy h:mm:ss tt",
+				// month/day pattern
+				M: "MMMM dd",
+				// month/year pattern
+				Y: "yyyy MMMM",
+				// S is a sortable format that does not vary by culture
+				S: "yyyy\u0027-\u0027MM\u0027-\u0027dd\u0027T\u0027HH\u0027:\u0027mm\u0027:\u0027ss"
+			}
+			// optional fields for each calendar:
+			/*
+			monthsGenitive:
+				Same as months but used when the day preceeds the month.
+				Omit if the culture has no genitive distinction in month names.
+				For an explaination of genitive months, see http://blogs.msdn.com/michkap/archive/2004/12/25/332259.aspx
+			convert:
+				Allows for the support of non-gregorian based calendars. This convert object is used to
+				to convert a date to and from a gregorian calendar date to handle parsing and formatting.
+				The two functions:
+					fromGregorian( date )
+						Given the date as a parameter, return an array with parts [ year, month, day ]
+						corresponding to the non-gregorian based year, month, and day for the calendar.
+					toGregorian( year, month, day )
+						Given the non-gregorian year, month, and day, return a new Date() object
+						set to the corresponding date in the gregorian calendar.
+			*/
+		}
+	},
+	// For localized strings
+	messages: {}
+};
+
+Globalize.cultures[ "default" ].calendar = Globalize.cultures[ "default" ].calendars.standard;
+
+Globalize.cultures[ "en" ] = Globalize.cultures[ "default" ];
+
+Globalize.cultureSelector = "en";
+
+//
+// private variables
+//
+
+regexHex = /^0x[a-f0-9]+$/i;
+regexInfinity = /^[+-]?infinity$/i;
+regexParseFloat = /^[+-]?\d*\.?\d*(e[+-]?\d+)?$/;
+regexTrim = /^\s+|\s+$/g;
+
+//
+// private JavaScript utility functions
+//
+
+arrayIndexOf = function( array, item ) {
+	if ( array.indexOf ) {
+		return array.indexOf( item );
+	}
+	for ( var i = 0, length = array.length; i < length; i++ ) {
+		if ( array[i] === item ) {
+			return i;
+		}
+	}
+	return -1;
+};
+
+endsWith = function( value, pattern ) {
+	return value.substr( value.length - pattern.length ) === pattern;
+};
+
+extend = function( deep ) {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !isFunction(target) ) {
+		target = {};
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( isObject(copy) || (copyIsArray = isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && isArray(src) ? src : [];
+
+					} else {
+						clone = src && isObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+isArray = Array.isArray || function( obj ) {
+	return Object.prototype.toString.call( obj ) === "[object Array]";
+};
+
+isFunction = function( obj ) {
+	return Object.prototype.toString.call( obj ) === "[object Function]";
+};
+
+isObject = function( obj ) {
+	return Object.prototype.toString.call( obj ) === "[object Object]";
+};
+
+startsWith = function( value, pattern ) {
+	return value.indexOf( pattern ) === 0;
+};
+
+trim = function( value ) {
+	return ( value + "" ).replace( regexTrim, "" );
+};
+
+truncate = function( value ) {
+	if ( isNaN( value ) ) {
+		return NaN;
+	}
+	return Math[ value < 0 ? "ceil" : "floor" ]( value );
+};
+
+zeroPad = function( str, count, left ) {
+	var l;
+	for ( l = str.length; l < count; l += 1 ) {
+		str = ( left ? ("0" + str) : (str + "0") );
+	}
+	return str;
+};
+
+//
+// private Globalization utility functions
+//
+
+appendPreOrPostMatch = function( preMatch, strings ) {
+	// appends pre- and post- token match strings while removing escaped characters.
+	// Returns a single quote count which is used to determine if the token occurs
+	// in a string literal.
+	var quoteCount = 0,
+		escaped = false;
+	for ( var i = 0, il = preMatch.length; i < il; i++ ) {
+		var c = preMatch.charAt( i );
+		switch ( c ) {
+			case "\'":
+				if ( escaped ) {
+					strings.push( "\'" );
+				}
+				else {
+					quoteCount++;
+				}
+				escaped = false;
+				break;
+			case "\\":
+				if ( escaped ) {
+					strings.push( "\\" );
+				}
+				escaped = !escaped;
+				break;
+			default:
+				strings.push( c );
+				escaped = false;
+				break;
+		}
+	}
+	return quoteCount;
+};
+
+expandFormat = function( cal, format ) {
+	// expands unspecified or single character date formats into the full pattern.
+	format = format || "F";
+	var pattern,
+		patterns = cal.patterns,
+		len = format.length;
+	if ( len === 1 ) {
+		pattern = patterns[ format ];
+		if ( !pattern ) {
+			throw "Invalid date format string \'" + format + "\'.";
+		}
+		format = pattern;
+	}
+	else if ( len === 2 && format.charAt(0) === "%" ) {
+		// %X escape format -- intended as a custom format string that is only one character, not a built-in format.
+		format = format.charAt( 1 );
+	}
+	return format;
+};
+
+formatDate = function( value, format, culture ) {
+	var cal = culture.calendar,
+		convert = cal.convert;
+
+	if ( !format || !format.length || format === "i" ) {
+		var ret;
+		if ( culture && culture.name.length ) {
+			if ( convert ) {
+				// non-gregorian calendar, so we cannot use built-in toLocaleString()
+				ret = formatDate( value, cal.patterns.F, culture );
+			}
+			else {
+				var eraDate = new Date( value.getTime() ),
+					era = getEra( value, cal.eras );
+				eraDate.setFullYear( getEraYear(value, cal, era) );
+				ret = eraDate.toLocaleString();
+			}
+		}
+		else {
+			ret = value.toString();
+		}
+		return ret;
+	}
+
+	var eras = cal.eras,
+		sortable = format === "s";
+	format = expandFormat( cal, format );
+
+	// Start with an empty string
+	ret = [];
+	var hour,
+		zeros = [ "0", "00", "000" ],
+		foundDay,
+		checkedDay,
+		dayPartRegExp = /([^d]|^)(d|dd)([^d]|$)/g,
+		quoteCount = 0,
+		tokenRegExp = getTokenRegExp(),
+		converted;
+
+	function padZeros( num, c ) {
+		var r, s = num + "";
+		if ( c > 1 && s.length < c ) {
+			r = ( zeros[c - 2] + s);
+			return r.substr( r.length - c, c );
+		}
+		else {
+			r = s;
+		}
+		return r;
+	}
+
+	function hasDay() {
+		if ( foundDay || checkedDay ) {
+			return foundDay;
+		}
+		foundDay = dayPartRegExp.test( format );
+		checkedDay = true;
+		return foundDay;
+	}
+
+	function getPart( date, part ) {
+		if ( converted ) {
+			return converted[ part ];
+		}
+		switch ( part ) {
+			case 0: return date.getFullYear();
+			case 1: return date.getMonth();
+			case 2: return date.getDate();
+		}
+	}
+
+	if ( !sortable && convert ) {
+		converted = convert.fromGregorian( value );
+	}
+
+	for ( ; ; ) {
+		// Save the current index
+		var index = tokenRegExp.lastIndex,
+			// Look for the next pattern
+			ar = tokenRegExp.exec( format );
+
+		// Append the text before the pattern (or the end of the string if not found)
+		var preMatch = format.slice( index, ar ? ar.index : format.length );
+		quoteCount += appendPreOrPostMatch( preMatch, ret );
+
+		if ( !ar ) {
+			break;
+		}
+
+		// do not replace any matches that occur inside a string literal.
+		if ( quoteCount % 2 ) {
+			ret.push( ar[0] );
+			continue;
+		}
+
+		var current = ar[ 0 ],
+			clength = current.length;
+
+		switch ( current ) {
+			case "ddd":
+				//Day of the week, as a three-letter abbreviation
+			case "dddd":
+				// Day of the week, using the full name
+				var names = ( clength === 3 ) ? cal.days.namesAbbr : cal.days.names;
+				ret.push( names[value.getDay()] );
+				break;
+			case "d":
+				// Day of month, without leading zero for single-digit days
+			case "dd":
+				// Day of month, with leading zero for single-digit days
+				foundDay = true;
+				ret.push(
+					padZeros( getPart(value, 2), clength )
+				);
+				break;
+			case "MMM":
+				// Month, as a three-letter abbreviation
+			case "MMMM":
+				// Month, using the full name
+				var part = getPart( value, 1 );
+				ret.push(
+					( cal.monthsGenitive && hasDay() )
+					?
+					cal.monthsGenitive[ clength === 3 ? "namesAbbr" : "names" ][ part ]
+					:
+					cal.months[ clength === 3 ? "namesAbbr" : "names" ][ part ]
+				);
+				break;
+			case "M":
+				// Month, as digits, with no leading zero for single-digit months
+			case "MM":
+				// Month, as digits, with leading zero for single-digit months
+				ret.push(
+					padZeros( getPart(value, 1) + 1, clength )
+				);
+				break;
+			case "y":
+				// Year, as two digits, but with no leading zero for years less than 10
+			case "yy":
+				// Year, as two digits, with leading zero for years less than 10
+			case "yyyy":
+				// Year represented by four full digits
+				part = converted ? converted[ 0 ] : getEraYear( value, cal, getEra(value, eras), sortable );
+				if ( clength < 4 ) {
+					part = part % 100;
+				}
+				ret.push(
+					padZeros( part, clength )
+				);
+				break;
+			case "h":
+				// Hours with no leading zero for single-digit hours, using 12-hour clock
+			case "hh":
+				// Hours with leading zero for single-digit hours, using 12-hour clock
+				hour = value.getHours() % 12;
+				if ( hour === 0 ) hour = 12;
+				ret.push(
+					padZeros( hour, clength )
+				);
+				break;
+			case "H":
+				// Hours with no leading zero for single-digit hours, using 24-hour clock
+			case "HH":
+				// Hours with leading zero for single-digit hours, using 24-hour clock
+				ret.push(
+					padZeros( value.getHours(), clength )
+				);
+				break;
+			case "m":
+				// Minutes with no leading zero for single-digit minutes
+			case "mm":
+				// Minutes with leading zero for single-digit minutes
+				ret.push(
+					padZeros( value.getMinutes(), clength )
+				);
+				break;
+			case "s":
+				// Seconds with no leading zero for single-digit seconds
+			case "ss":
+				// Seconds with leading zero for single-digit seconds
+				ret.push(
+					padZeros( value.getSeconds(), clength )
+				);
+				break;
+			case "t":
+				// One character am/pm indicator ("a" or "p")
+			case "tt":
+				// Multicharacter am/pm indicator
+				part = value.getHours() < 12 ? ( cal.AM ? cal.AM[0] : " " ) : ( cal.PM ? cal.PM[0] : " " );
+				ret.push( clength === 1 ? part.charAt(0) : part );
+				break;
+			case "f":
+				// Deciseconds
+			case "ff":
+				// Centiseconds
+			case "fff":
+				// Milliseconds
+				ret.push(
+					padZeros( value.getMilliseconds(), 3 ).substr( 0, clength )
+				);
+				break;
+			case "z":
+				// Time zone offset, no leading zero
+			case "zz":
+				// Time zone offset with leading zero
+				hour = value.getTimezoneOffset() / 60;
+				ret.push(
+					( hour <= 0 ? "+" : "-" ) + padZeros( Math.floor(Math.abs(hour)), clength )
+				);
+				break;
+			case "zzz":
+				// Time zone offset with leading zero
+				hour = value.getTimezoneOffset() / 60;
+				ret.push(
+					( hour <= 0 ? "+" : "-" ) + padZeros( Math.floor(Math.abs(hour)), 2 )
+					// Hard coded ":" separator, rather than using cal.TimeSeparator
+					// Repeated here for consistency, plus ":" was already assumed in date parsing.
+					+ ":" + padZeros( Math.abs(value.getTimezoneOffset() % 60), 2 )
+				);
+				break;
+			case "g":
+			case "gg":
+				if ( cal.eras ) {
+					ret.push(
+						cal.eras[ getEra(value, eras) ].name
+					);
+				}
+				break;
+		case "/":
+			ret.push( cal["/"] );
+			break;
+		default:
+			throw "Invalid date format pattern \'" + current + "\'.";
+			break;
+		}
+	}
+	return ret.join( "" );
+};
+
+// formatNumber
+(function() {
+	var expandNumber;
+
+	expandNumber = function( number, precision, formatInfo ) {
+		var groupSizes = formatInfo.groupSizes,
+			curSize = groupSizes[ 0 ],
+			curGroupIndex = 1,
+			factor = Math.pow( 10, precision ),
+			rounded = Math.round( number * factor ) / factor;
+
+		if ( !isFinite(rounded) ) {
+			rounded = number;
+		}
+		number = rounded;
+
+		var numberString = number+"",
+			right = "",
+			split = numberString.split( /e/i ),
+			exponent = split.length > 1 ? parseInt( split[1], 10 ) : 0;
+		numberString = split[ 0 ];
+		split = numberString.split( "." );
+		numberString = split[ 0 ];
+		right = split.length > 1 ? split[ 1 ] : "";
+
+		var l;
+		if ( exponent > 0 ) {
+			right = zeroPad( right, exponent, false );
+			numberString += right.slice( 0, exponent );
+			right = right.substr( exponent );
+		}
+		else if ( exponent < 0 ) {
+			exponent = -exponent;
+			numberString = zeroPad( numberString, exponent + 1 );
+			right = numberString.slice( -exponent, numberString.length ) + right;
+			numberString = numberString.slice( 0, -exponent );
+		}
+
+		if ( precision > 0 ) {
+			right = formatInfo[ "." ] +
+				( (right.length > precision) ? right.slice(0, precision) : zeroPad(right, precision) );
+		}
+		else {
+			right = "";
+		}
+
+		var stringIndex = numberString.length - 1,
+			sep = formatInfo[ "," ],
+			ret = "";
+
+		while ( stringIndex >= 0 ) {
+			if ( curSize === 0 || curSize > stringIndex ) {
+				return numberString.slice( 0, stringIndex + 1 ) + ( ret.length ? (sep + ret + right) : right );
+			}
+			ret = numberString.slice( stringIndex - curSize + 1, stringIndex + 1 ) + ( ret.length ? (sep + ret) : "" );
+
+			stringIndex -= curSize;
+
+			if ( curGroupIndex < groupSizes.length ) {
+				curSize = groupSizes[ curGroupIndex ];
+				curGroupIndex++;
+			}
+		}
+
+		return numberString.slice( 0, stringIndex + 1 ) + sep + ret + right;
+	};
+
+	formatNumber = function( value, format, culture ) {
+		if ( !isFinite(value) ) {
+			if ( value === Infinity ) {
+				return culture.numberFormat.positiveInfinity;
+			}
+			if ( value === -Infinity ) {
+				return culture.numberFormat.negativeInfinity;
+			}
+			return culture.numberFormat.NaN;
+		}
+		if ( !format || format === "i" ) {
+			return culture.name.length ? value.toLocaleString() : value.toString();
+		}
+		format = format || "D";
+
+		var nf = culture.numberFormat,
+			number = Math.abs( value ),
+			precision = -1,
+			pattern;
+		if ( format.length > 1 ) precision = parseInt( format.slice(1), 10 );
+
+		var current = format.charAt( 0 ).toUpperCase(),
+			formatInfo;
+
+		switch ( current ) {
+			case "D":
+				pattern = "n";
+				number = truncate( number );
+				if ( precision !== -1 ) {
+					number = zeroPad( "" + number, precision, true );
+				}
+				if ( value < 0 ) number = "-" + number;
+				break;
+			case "N":
+				formatInfo = nf;
+				// fall through
+			case "C":
+				formatInfo = formatInfo || nf.currency;
+				// fall through
+			case "P":
+				formatInfo = formatInfo || nf.percent;
+				pattern = value < 0 ? formatInfo.pattern[ 0 ] : ( formatInfo.pattern[1] || "n" );
+				if ( precision === -1 ) precision = formatInfo.decimals;
+				number = expandNumber( number * (current === "P" ? 100 : 1), precision, formatInfo );
+				break;
+			default:
+				throw "Bad number format specifier: " + current;
+		}
+
+		var patternParts = /n|\$|-|%/g,
+			ret = "";
+		for ( ; ; ) {
+			var index = patternParts.lastIndex,
+				ar = patternParts.exec( pattern );
+
+			ret += pattern.slice( index, ar ? ar.index : pattern.length );
+
+			if ( !ar ) {
+				break;
+			}
+
+			switch ( ar[0] ) {
+				case "n":
+					ret += number;
+					break;
+				case "$":
+					ret += nf.currency.symbol;
+					break;
+				case "-":
+					// don't make 0 negative
+					if ( /[1-9]/.test(number) ) {
+						ret += nf[ "-" ];
+					}
+					break;
+				case "%":
+					ret += nf.percent.symbol;
+					break;
+			}
+		}
+
+		return ret;
+	};
+
+}());
+
+getTokenRegExp = function() {
+	// regular expression for matching date and time tokens in format strings.
+	return /\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g;
+};
+
+getEra = function( date, eras ) {
+	if ( !eras ) return 0;
+	var start, ticks = date.getTime();
+	for ( var i = 0, l = eras.length; i < l; i++ ) {
+		start = eras[ i ].start;
+		if ( start === null || ticks >= start ) {
+			return i;
+		}
+	}
+	return 0;
+};
+
+getEraYear = function( date, cal, era, sortable ) {
+	var year = date.getFullYear();
+	if ( !sortable && cal.eras ) {
+		// convert normal gregorian year to era-shifted gregorian
+		// year by subtracting the era offset
+		year -= cal.eras[ era ].offset;
+	}
+	return year;
+};
+
+// parseExact
+(function() {
+	var expandYear,
+		getDayIndex,
+		getMonthIndex,
+		getParseRegExp,
+		outOfRange,
+		toUpper,
+		toUpperArray;
+
+	expandYear = function( cal, year ) {
+		// expands 2-digit year into 4 digits.
+		if ( year < 100 ) {
+			var now = new Date(),
+				era = getEra( now ),
+				curr = getEraYear( now, cal, era ),
+				twoDigitYearMax = cal.twoDigitYearMax;
+			twoDigitYearMax = typeof twoDigitYearMax === "string" ? new Date().getFullYear() % 100 + parseInt( twoDigitYearMax, 10 ) : twoDigitYearMax;
+			year += curr - ( curr % 100 );
+			if ( year > twoDigitYearMax ) {
+				year -= 100;
+			}
+		}
+		return year;
+	};
+
+	getDayIndex = function	( cal, value, abbr ) {
+		var ret,
+			days = cal.days,
+			upperDays = cal._upperDays;
+		if ( !upperDays ) {
+			cal._upperDays = upperDays = [
+				toUpperArray( days.names ),
+				toUpperArray( days.namesAbbr ),
+				toUpperArray( days.namesShort )
+			];
+		}
+		value = toUpper( value );
+		if ( abbr ) {
+			ret = arrayIndexOf( upperDays[1], value );
+			if ( ret === -1 ) {
+				ret = arrayIndexOf( upperDays[2], value );
+			}
+		}
+		else {
+			ret = arrayIndexOf( upperDays[0], value );
+		}
+		return ret;
+	};
+
+	getMonthIndex = function( cal, value, abbr ) {
+		var months = cal.months,
+			monthsGen = cal.monthsGenitive || cal.months,
+			upperMonths = cal._upperMonths,
+			upperMonthsGen = cal._upperMonthsGen;
+		if ( !upperMonths ) {
+			cal._upperMonths = upperMonths = [
+				toUpperArray( months.names ),
+				toUpperArray( months.namesAbbr )
+			];
+			cal._upperMonthsGen = upperMonthsGen = [
+				toUpperArray( monthsGen.names ),
+				toUpperArray( monthsGen.namesAbbr )
+			];
+		}
+		value = toUpper( value );
+		var i = arrayIndexOf( abbr ? upperMonths[1] : upperMonths[0], value );
+		if ( i < 0 ) {
+			i = arrayIndexOf( abbr ? upperMonthsGen[1] : upperMonthsGen[0], value );
+		}
+		return i;
+	};
+
+	getParseRegExp = function( cal, format ) {
+		// converts a format string into a regular expression with groups that
+		// can be used to extract date fields from a date string.
+		// check for a cached parse regex.
+		var re = cal._parseRegExp;
+		if ( !re ) {
+			cal._parseRegExp = re = {};
+		}
+		else {
+			var reFormat = re[ format ];
+			if ( reFormat ) {
+				return reFormat;
+			}
+		}
+
+		// expand single digit formats, then escape regular expression characters.
+		var expFormat = expandFormat( cal, format ).replace( /([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g, "\\\\$1" ),
+			regexp = [ "^" ],
+			groups = [],
+			index = 0,
+			quoteCount = 0,
+			tokenRegExp = getTokenRegExp(),
+			match;
+
+		// iterate through each date token found.
+		while ( (match = tokenRegExp.exec(expFormat)) !== null ) {
+			var preMatch = expFormat.slice( index, match.index );
+			index = tokenRegExp.lastIndex;
+
+			// don't replace any matches that occur inside a string literal.
+			quoteCount += appendPreOrPostMatch( preMatch, regexp );
+			if ( quoteCount % 2 ) {
+				regexp.push( match[0] );
+				continue;
+			}
+
+			// add a regex group for the token.
+			var m = match[ 0 ],
+				len = m.length,
+				add;
+			switch ( m ) {
+				case "dddd": case "ddd":
+				case "MMMM": case "MMM":
+				case "gg": case "g":
+					add = "(\\D+)";
+					break;
+				case "tt": case "t":
+					add = "(\\D*)";
+					break;
+				case "yyyy":
+				case "fff":
+				case "ff":
+				case "f":
+					add = "(\\d{" + len + "})";
+					break;
+				case "dd": case "d":
+				case "MM": case "M":
+				case "yy": case "y":
+				case "HH": case "H":
+				case "hh": case "h":
+				case "mm": case "m":
+				case "ss": case "s":
+					add = "(\\d\\d?)";
+					break;
+				case "zzz":
+					add = "([+-]?\\d\\d?:\\d{2})";
+					break;
+				case "zz": case "z":
+					add = "([+-]?\\d\\d?)";
+					break;
+				case "/":
+					add = "(\\" + cal[ "/" ] + ")";
+					break;
+				default:
+					throw "Invalid date format pattern \'" + m + "\'.";
+					break;
+			}
+			if ( add ) {
+				regexp.push( add );
+			}
+			groups.push( match[0] );
+		}
+		appendPreOrPostMatch( expFormat.slice(index), regexp );
+		regexp.push( "$" );
+
+		// allow whitespace to differ when matching formats.
+		var regexpStr = regexp.join( "" ).replace( /\s+/g, "\\s+" ),
+			parseRegExp = { "regExp": regexpStr, "groups": groups };
+
+		// cache the regex for this format.
+		return re[ format ] = parseRegExp;
+	};
+
+	outOfRange = function( value, low, high ) {
+		return value < low || value > high;
+	};
+
+	toUpper = function( value ) {
+		// "he-IL" has non-breaking space in weekday names.
+		return value.split( "\u00A0" ).join( " " ).toUpperCase();
+	};
+
+	toUpperArray = function( arr ) {
+		var results = [];
+		for ( var i = 0, l = arr.length; i < l; i++ ) {
+			results[ i ] = toUpper( arr[i] );
+		}
+		return results;
+	};
+
+	parseExact = function( value, format, culture ) {
+		// try to parse the date string by matching against the format string
+		// while using the specified culture for date field names.
+		value = trim( value );
+		var cal = culture.calendar,
+			// convert date formats into regular expressions with groupings.
+			// use the regexp to determine the input format and extract the date fields.
+			parseInfo = getParseRegExp( cal, format ),
+			match = new RegExp( parseInfo.regExp ).exec( value );
+		if ( match === null ) {
+			return null;
+		}
+		// found a date format that matches the input.
+		var groups = parseInfo.groups,
+			era = null, year = null, month = null, date = null, weekDay = null,
+			hour = 0, hourOffset, min = 0, sec = 0, msec = 0, tzMinOffset = null,
+			pmHour = false;
+		// iterate the format groups to extract and set the date fields.
+		for ( var j = 0, jl = groups.length; j < jl; j++ ) {
+			var matchGroup = match[ j + 1 ];
+			if ( matchGroup ) {
+				var current = groups[ j ],
+					clength = current.length,
+					matchInt = parseInt( matchGroup, 10 );
+				switch ( current ) {
+					case "dd": case "d":
+						// Day of month.
+						date = matchInt;
+						// check that date is generally in valid range, also checking overflow below.
+						if ( outOfRange(date, 1, 31) ) return null;
+						break;
+					case "MMM": case "MMMM":
+						month = getMonthIndex( cal, matchGroup, clength === 3 );
+						if ( outOfRange(month, 0, 11) ) return null;
+						break;
+					case "M": case "MM":
+						// Month.
+						month = matchInt - 1;
+						if ( outOfRange(month, 0, 11) ) return null;
+						break;
+					case "y": case "yy":
+					case "yyyy":
+						year = clength < 4 ? expandYear( cal, matchInt ) : matchInt;
+						if ( outOfRange(year, 0, 9999) ) return null;
+						break;
+					case "h": case "hh":
+						// Hours (12-hour clock).
+						hour = matchInt;
+						if ( hour === 12 ) hour = 0;
+						if ( outOfRange(hour, 0, 11) ) return null;
+						break;
+					case "H": case "HH":
+						// Hours (24-hour clock).
+						hour = matchInt;
+						if ( outOfRange(hour, 0, 23) ) return null;
+						break;
+					case "m": case "mm":
+						// Minutes.
+						min = matchInt;
+						if ( outOfRange(min, 0, 59) ) return null;
+						break;
+					case "s": case "ss":
+						// Seconds.
+						sec = matchInt;
+						if ( outOfRange(sec, 0, 59) ) return null;
+						break;
+					case "tt": case "t":
+						// AM/PM designator.
+						// see if it is standard, upper, or lower case PM. If not, ensure it is at least one of
+						// the AM tokens. If not, fail the parse for this format.
+						pmHour = cal.PM && ( matchGroup === cal.PM[0] || matchGroup === cal.PM[1] || matchGroup === cal.PM[2] );
+						if (
+							!pmHour && (
+								!cal.AM || ( matchGroup !== cal.AM[0] && matchGroup !== cal.AM[1] && matchGroup !== cal.AM[2] )
+							)
+						) return null;
+						break;
+					case "f":
+						// Deciseconds.
+					case "ff":
+						// Centiseconds.
+					case "fff":
+						// Milliseconds.
+						msec = matchInt * Math.pow( 10, 3 - clength );
+						if ( outOfRange(msec, 0, 999) ) return null;
+						break;
+					case "ddd":
+						// Day of week.
+					case "dddd":
+						// Day of week.
+						weekDay = getDayIndex( cal, matchGroup, clength === 3 );
+						if ( outOfRange(weekDay, 0, 6) ) return null;
+						break;
+					case "zzz":
+						// Time zone offset in +/- hours:min.
+						var offsets = matchGroup.split( /:/ );
+						if ( offsets.length !== 2 ) return null;
+						hourOffset = parseInt( offsets[0], 10 );
+						if ( outOfRange(hourOffset, -12, 13) ) return null;
+						var minOffset = parseInt( offsets[1], 10 );
+						if ( outOfRange(minOffset, 0, 59) ) return null;
+						tzMinOffset = ( hourOffset * 60 ) + ( startsWith(matchGroup, "-") ? -minOffset : minOffset );
+						break;
+					case "z": case "zz":
+						// Time zone offset in +/- hours.
+						hourOffset = matchInt;
+						if ( outOfRange(hourOffset, -12, 13) ) return null;
+						tzMinOffset = hourOffset * 60;
+						break;
+					case "g": case "gg":
+						var eraName = matchGroup;
+						if ( !eraName || !cal.eras ) return null;
+						eraName = trim( eraName.toLowerCase() );
+						for ( var i = 0, l = cal.eras.length; i < l; i++ ) {
+							if ( eraName === cal.eras[i].name.toLowerCase() ) {
+								era = i;
+								break;
+							}
+						}
+						// could not find an era with that name
+						if ( era === null ) return null;
+						break;
+				}
+			}
+		}
+		var result = new Date(), defaultYear, convert = cal.convert;
+		defaultYear = convert ? convert.fromGregorian( result )[ 0 ] : result.getFullYear();
+		if ( year === null ) {
+			year = defaultYear;
+		}
+		else if ( cal.eras ) {
+			// year must be shifted to normal gregorian year
+			// but not if year was not specified, its already normal gregorian
+			// per the main if clause above.
+			year += cal.eras[( era || 0 )].offset;
+		}
+		// set default day and month to 1 and January, so if unspecified, these are the defaults
+		// instead of the current day/month.
+		if ( month === null ) {
+			month = 0;
+		}
+		if ( date === null ) {
+			date = 1;
+		}
+		// now have year, month, and date, but in the culture's calendar.
+		// convert to gregorian if necessary
+		if ( convert ) {
+			result = convert.toGregorian( year, month, date );
+			// conversion failed, must be an invalid match
+			if ( result === null ) return null;
+		}
+		else {
+			// have to set year, month and date together to avoid overflow based on current date.
+			result.setFullYear( year, month, date );
+			// check to see if date overflowed for specified month (only checked 1-31 above).
+			if ( result.getDate() !== date ) return null;
+			// invalid day of week.
+			if ( weekDay !== null && result.getDay() !== weekDay ) {
+				return null;
+			}
+		}
+		// if pm designator token was found make sure the hours fit the 24-hour clock.
+		if ( pmHour && hour < 12 ) {
+			hour += 12;
+		}
+		result.setHours( hour, min, sec, msec );
+		if ( tzMinOffset !== null ) {
+			// adjust timezone to utc before applying local offset.
+			var adjustedMin = result.getMinutes() - ( tzMinOffset + result.getTimezoneOffset() );
+			// Safari limits hours and minutes to the range of -127 to 127.	 We need to use setHours
+			// to ensure both these fields will not exceed this range.	adjustedMin will range
+			// somewhere between -1440 and 1500, so we only need to split this into hours.
+			result.setHours( result.getHours() + parseInt(adjustedMin / 60, 10), adjustedMin % 60 );
+		}
+		return result;
+	};
+}());
+
+parseNegativePattern = function( value, nf, negativePattern ) {
+	var neg = nf[ "-" ],
+		pos = nf[ "+" ],
+		ret;
+	switch ( negativePattern ) {
+		case "n -":
+			neg = " " + neg;
+			pos = " " + pos;
+			// fall through
+		case "n-":
+			if ( endsWith(value, neg) ) {
+				ret = [ "-", value.substr(0, value.length - neg.length) ];
+			}
+			else if ( endsWith(value, pos) ) {
+				ret = [ "+", value.substr(0, value.length - pos.length) ];
+			}
+			break;
+		case "- n":
+			neg += " ";
+			pos += " ";
+			// fall through
+		case "-n":
+			if ( startsWith(value, neg) ) {
+				ret = [ "-", value.substr(neg.length) ];
+			}
+			else if ( startsWith(value, pos) ) {
+				ret = [ "+", value.substr(pos.length) ];
+			}
+			break;
+		case "(n)":
+			if ( startsWith(value, "(") && endsWith(value, ")") ) {
+				ret = [ "-", value.substr(1, value.length - 2) ];
+			}
+			break;
+	}
+	return ret || [ "", value ];
+};
+
+//
+// public instance functions
+//
+
+Globalize.prototype.findClosestCulture = function( cultureSelector ) {
+	return Globalize.findClosestCulture.call( this, cultureSelector );
+};
+
+Globalize.prototype.format = function( value, format, cultureSelector ) {
+	return Globalize.format.call( this, value, format, cultureSelector );
+};
+
+Globalize.prototype.localize = function( key, cultureSelector ) {
+	return Globalize.localize.call( this, key, cultureSelector );
+};
+
+Globalize.prototype.parseInt = function( value, radix, cultureSelector ) {
+	return Globalize.parseInt.call( this, value, radix, cultureSelector );
+};
+
+Globalize.prototype.parseFloat = function( value, radix, cultureSelector ) {
+	return Globalize.parseFloat.call( this, value, radix, cultureSelector );
+};
+
+Globalize.prototype.culture = function( cultureSelector ) {
+	return Globalize.culture.call( this, cultureSelector );
+};
+
+//
+// public singleton functions
+//
+
+Globalize.addCultureInfo = function( cultureName, baseCultureName, info ) {
+
+	var base = {},
+		isNew = false;
+
+	if ( typeof cultureName !== "string" ) {
+		// cultureName argument is optional string. If not specified, assume info is first
+		// and only argument. Specified info deep-extends current culture.
+		info = cultureName;
+		cultureName = this.culture().name;
+		base = this.cultures[ cultureName ];
+	} else if ( typeof baseCultureName !== "string" ) {
+		// baseCultureName argument is optional string. If not specified, assume info is second
+		// argument. Specified info deep-extends specified culture.
+		// If specified culture does not exist, create by deep-extending default
+		info = baseCultureName;
+		isNew = ( this.cultures[ cultureName ] == null );
+		base = this.cultures[ cultureName ] || this.cultures[ "default" ];
+	} else {
+		// cultureName and baseCultureName specified. Assume a new culture is being created
+		// by deep-extending an specified base culture
+		isNew = true;
+		base = this.cultures[ baseCultureName ];
+	}
+
+	this.cultures[ cultureName ] = extend(true, {},
+		base,
+		info
+	);
+	// Make the standard calendar the current culture if it's a new culture
+	if ( isNew ) {
+		this.cultures[ cultureName ].calendar = this.cultures[ cultureName ].calendars.standard;
+	}
+};
+
+Globalize.findClosestCulture = function( name ) {
+	var match;
+	if ( !name ) {
+		return this.findClosestCulture( this.cultureSelector ) || this.cultures[ "default" ];
+	}
+	if ( typeof name === "string" ) {
+		name = name.split( "," );
+	}
+	if ( isArray(name) ) {
+		var lang,
+			cultures = this.cultures,
+			list = name,
+			i, l = list.length,
+			prioritized = [];
+		for ( i = 0; i < l; i++ ) {
+			name = trim( list[i] );
+			var pri, parts = name.split( ";" );
+			lang = trim( parts[0] );
+			if ( parts.length === 1 ) {
+				pri = 1;
+			}
+			else {
+				name = trim( parts[1] );
+				if ( name.indexOf("q=") === 0 ) {
+					name = name.substr( 2 );
+					pri = parseFloat( name );
+					pri = isNaN( pri ) ? 0 : pri;
+				}
+				else {
+					pri = 1;
+				}
+			}
+			prioritized.push({ lang: lang, pri: pri });
+		}
+		prioritized.sort(function( a, b ) {
+			return a.pri < b.pri ? 1 : -1;
+		});
+
+		// exact match
+		for ( i = 0; i < l; i++ ) {
+			lang = prioritized[ i ].lang;
+			match = cultures[ lang ];
+			if ( match ) {
+				return match;
+			}
+		}
+
+		// neutral language match
+		for ( i = 0; i < l; i++ ) {
+			lang = prioritized[ i ].lang;
+			do {
+				var index = lang.lastIndexOf( "-" );
+				if ( index === -1 ) {
+					break;
+				}
+				// strip off the last part. e.g. en-US => en
+				lang = lang.substr( 0, index );
+				match = cultures[ lang ];
+				if ( match ) {
+					return match;
+				}
+			}
+			while ( 1 );
+		}
+
+		// last resort: match first culture using that language
+		for ( i = 0; i < l; i++ ) {
+			lang = prioritized[ i ].lang;
+			for ( var cultureKey in cultures ) {
+				var culture = cultures[ cultureKey ];
+				if ( culture.language == lang ) {
+					return culture;
+				}
+			}
+		}
+	}
+	else if ( typeof name === "object" ) {
+		return name;
+	}
+	return match || null;
+};
+
+Globalize.format = function( value, format, cultureSelector ) {
+	culture = this.findClosestCulture( cultureSelector );
+	if ( value instanceof Date ) {
+		value = formatDate( value, format, culture );
+	}
+	else if ( typeof value === "number" ) {
+		value = formatNumber( value, format, culture );
+	}
+	return value;
+};
+
+Globalize.localize = function( key, cultureSelector ) {
+	return this.findClosestCulture( cultureSelector ).messages[ key ] ||
+		this.cultures[ "default" ].messages[ key ];
+};
+
+Globalize.parseDate = function( value, formats, culture ) {
+	culture = this.findClosestCulture( culture );
+
+	var date, prop, patterns;
+	if ( formats ) {
+		if ( typeof formats === "string" ) {
+			formats = [ formats ];
+		}
+		if ( formats.length ) {
+			for ( var i = 0, l = formats.length; i < l; i++ ) {
+				var format = formats[ i ];
+				if ( format ) {
+					date = parseExact( value, format, culture );
+					if ( date ) {
+						break;
+					}
+				}
+			}
+		}
+	} else {
+		patterns = culture.calendar.patterns;
+		for ( prop in patterns ) {
+			date = parseExact( value, patterns[prop], culture );
+			if ( date ) {
+				break;
+			}
+		}
+	}
+
+	return date || null;
+};
+
+Globalize.parseInt = function( value, radix, cultureSelector ) {
+	return truncate( Globalize.parseFloat(value, radix, cultureSelector) );
+};
+
+Globalize.parseFloat = function( value, radix, cultureSelector ) {
+	// radix argument is optional
+	if ( typeof radix !== "number" ) {
+		cultureSelector = radix;
+		radix = 10;
+	}
+
+	var culture = this.findClosestCulture( cultureSelector );
+	var ret = NaN,
+		nf = culture.numberFormat;
+
+	if ( value.indexOf(culture.numberFormat.currency.symbol) > -1 ) {
+		// remove currency symbol
+		value = value.replace( culture.numberFormat.currency.symbol, "" );
+		// replace decimal seperator
+		value = value.replace( culture.numberFormat.currency["."], culture.numberFormat["."] );
+	}
+
+	// trim leading and trailing whitespace
+	value = trim( value );
+
+	// allow infinity or hexidecimal
+	if ( regexInfinity.test(value) ) {
+		ret = parseFloat( value );
+	}
+	else if ( !radix && regexHex.test(value) ) {
+		ret = parseInt( value, 16 );
+	}
+	else {
+
+		// determine sign and number
+		var signInfo = parseNegativePattern( value, nf, nf.pattern[0] ),
+			sign = signInfo[ 0 ],
+			num = signInfo[ 1 ];
+
+		// #44 - try parsing as "(n)"
+		if ( sign === "" && nf.pattern[0] !== "(n)" ) {
+			signInfo = parseNegativePattern( value, nf, "(n)" );
+			sign = signInfo[ 0 ];
+			num = signInfo[ 1 ];
+		}
+
+		// try parsing as "-n"
+		if ( sign === "" && nf.pattern[0] !== "-n" ) {
+			signInfo = parseNegativePattern( value, nf, "-n" );
+			sign = signInfo[ 0 ];
+			num = signInfo[ 1 ];
+		}
+
+		sign = sign || "+";
+
+		// determine exponent and number
+		var exponent,
+			intAndFraction,
+			exponentPos = num.indexOf( "e" );
+		if ( exponentPos < 0 ) exponentPos = num.indexOf( "E" );
+		if ( exponentPos < 0 ) {
+			intAndFraction = num;
+			exponent = null;
+		}
+		else {
+			intAndFraction = num.substr( 0, exponentPos );
+			exponent = num.substr( exponentPos + 1 );
+		}
+		// determine decimal position
+		var integer,
+			fraction,
+			decSep = nf[ "." ],
+			decimalPos = intAndFraction.indexOf( decSep );
+		if ( decimalPos < 0 ) {
+			integer = intAndFraction;
+			fraction = null;
+		}
+		else {
+			integer = intAndFraction.substr( 0, decimalPos );
+			fraction = intAndFraction.substr( decimalPos + decSep.length );
+		}
+		// handle groups (e.g. 1,000,000)
+		var groupSep = nf[ "," ];
+		integer = integer.split( groupSep ).join( "" );
+		var altGroupSep = groupSep.replace( /\u00A0/g, " " );
+		if ( groupSep !== altGroupSep ) {
+			integer = integer.split( altGroupSep ).join( "" );
+		}
+		// build a natively parsable number string
+		var p = sign + integer;
+		if ( fraction !== null ) {
+			p += "." + fraction;
+		}
+		if ( exponent !== null ) {
+			// exponent itself may have a number patternd
+			var expSignInfo = parseNegativePattern( exponent, nf, "-n" );
+			p += "e" + ( expSignInfo[0] || "+" ) + expSignInfo[ 1 ];
+		}
+		if ( regexParseFloat.test(p) ) {
+			ret = parseFloat( p );
+		}
+	}
+	return ret;
+};
+
+Globalize.culture = function( cultureSelector ) {
+	// setter
+	if ( typeof cultureSelector !== "undefined" ) {
+		this.cultureSelector = cultureSelector;
+	}
+	// getter
+	return this.findClosestCulture( cultureSelector ) || this.culture[ "default" ];
+};
+
+}( this ));
+/**
+ * loader.js : Loader for web-ui-fw
+ * Refactored from bootstrap.js
+ *
+ * By Youmin Ha <youmin.ha@samsung.com>
+ *
+ */
+
+( function ($, Globalize, window, undefined) {
+
+	window.S = {
+		libFileName : "tizen-web-ui-fw(.min)?.js",
+
+		frameworkData : {
+			rootDir: '/usr/lib/tizen-web-ui-fw',
+			version: '0.1',
+			theme: "default",
+			viewportScale: false,
+		},
+
+		util : {
+			loadScriptSync : function ( scriptPath, successCB, errorCB ) {
+				$.ajax( {
+					url: scriptPath,
+					dataType: 'script',
+					async: false,
+					success: successCB,
+					error: function ( jqXHR, textStatus, errorThrown ) {
+						if ( errorCB ) {
+							errorCB( jqXHR, textStatus, errorThrown );
+						} else {
+							var ignoreStatusList = [ 404 ];  // 404: not found
+							if ( -1 == $.inArray( jqXHR.status, ignoreStatusList ) ) {
+								window.alert( 'Error while loading ' + scriptPath + '\n' + jqXHR.status + ':' + jqXHR.statusText );
+							} else {
+								console.log( 'Error while loading ' + scriptPath + '\n' + jqXHR.status + ':' + jqXHR.statusText );
+							}
+						}
+					}
+				} );
+			},
+			getScaleFactor: function ( ) {
+				var factor = window.scale,
+					width = 0,
+					defaultWidth = 720;
+
+				if ( !factor ) {
+					width = screen.width < screen.height ? screen.width : screen.height;
+					factor = width / defaultWidth;
+					if ( factor > 1 ) {
+						// NOTE: some targets(e.g iPad) need to set scale equal or less than 1.0
+						factor = 1;
+					}
+				}
+				console.log( "ScaleFactor: " + factor );
+				return factor;
+			},
+			isMobileBrowser: function ( ) {
+				var mobileIdx = window.navigator.appVersion.indexOf("Mobile"),
+					isMobile = -1 < mobileIdx;
+				return isMobile;
+			}
+		},
+
+		css : {
+			cacheBust: ( document.location.href.match( /debug=true/ ) ) ?
+					'?cacheBust=' + ( new Date( ) ).getTime( ) :
+					'',
+			addElementToHead : function ( elem ) {
+				var head = document.getElementsByTagName( 'head' )[0];
+				head.appendChild( elem );
+			},
+			load: function ( path ) {
+				this.addElementToHead( this.makeLink( path + this.cacheBust ) );
+			},
+			makeLink : function ( href ) {
+				var customstylesheetLink = document.createElement( 'link' );
+				customstylesheetLink.setAttribute( 'rel', 'stylesheet' );
+				customstylesheetLink.setAttribute( 'href', href );
+				return customstylesheetLink;
+			}
+		},
+
+		getParams: function ( ) {
+			/* Get data-* params from <script> tag, and set S.frameworkData.* values
+			 * Returns true if proper <script> tag is found, or false if not.
+			 */
+			// Find current <script> tag element
+			var scriptElems = document.getElementsByTagName( 'script' ),
+				val = null,
+				foundScriptTag = false,
+				idx,
+				elem,
+				src,
+				tokens,
+				version_idx;
+			for ( idx in scriptElems ) {
+				elem = scriptElems[idx];
+				src = elem.src ? elem.getAttribute( 'src' ) : undefined;
+				if (src && src.match( this.libFileName )) {
+					// Set framework data, only when they are given.
+					tokens = src.split(/[\/\\]/);
+					version_idx = -3;
+					this.frameworkData.rootDir = elem.getAttribute( 'data-framework-root' )
+						|| tokens.slice( 0, tokens.length + version_idx ).join( '/' )
+						|| this.frameworkData.rootDir;
+					this.frameworkData.version = elem.getAttribute( 'data-framework-version' )
+						|| tokens[ tokens.length + version_idx ]
+						|| this.frameworkData.version;
+					this.frameworkData.theme = elem.getAttribute( 'data-framework-theme' )
+						|| this.frameworkData.theme;
+					this.frameworkData.viewportScale = "true" === elem.getAttribute( 'data-framework-viewport-scale' ) ? true : this.frameworkData.viewportScale;
+					foundScriptTag = true;
+					break;
+				}
+			}
+			return foundScriptTag;
+		},
+
+		loadTheme: function ( ) {
+			var themePath = [
+					this.frameworkData.rootDir,
+					this.frameworkData.version,
+					'themes',
+					this.frameworkData.theme
+				].join( '/' ),
+				cssPath = [themePath, 'tizen-web-ui-fw-theme.css'].join( '/' ),
+				jsPath = [themePath, 'theme.js'].join( '/' );
+
+			this.css.load( cssPath );
+			this.util.loadScriptSync( jsPath );
+		},
+
+		/** Load Globalize culture file, and set default culture.
+		 *  @param[in]  language  Language code. ex) en-US, en, ko-KR, ko
+		 *                        If language is not given, read language from html 'lang' attribute, or from system setting.
+		 */
+		loadGlobalizeCulture: function ( language ) {
+			function getGlobalizeCultureFile( lang ) {
+				return ['globalize.culture.', lang, '.js'].join( '' );
+			}
+			function getGlobalizeCulturePath( self, file ) {
+				return [
+					self.frameworkData.rootDir,
+					self.frameworkData.version,
+					'js',
+					'cultures',
+					file,
+				].join( '/' );
+			}
+
+			// Get lang, and change country code to uppercase chars.
+			var self = this,
+				lang = language
+					|| $( 'html' ).attr( 'lang' )
+					|| window.navigator.language.split( '.' )[0]	/* Webkit, Safari + workaround for Tizen */
+					|| window.navigator.userLanguage	/* IE */
+					|| 'en',
+				countryCode = null,
+				countryCodeIdx = lang.lastIndexOf('-'),
+				ignoreCodes = ['Cyrl', 'Latn', 'Mong'],	// Not country code!
+				globalizeCultureFile,
+				globalizeCulturePath,
+				neutralLangIndex;
+
+			if ( countryCodeIdx != -1 ) {	// Found country code!
+				countryCode = lang.substr( countryCodeIdx + 1 );
+				if ( ignoreCodes.join( '-' ).indexOf( countryCode ) < 0 ) { // countryCode is not found from ignoreCodes
+					// Make countryCode to uppercase
+					lang = [ lang.substr( 0, countryCodeIdx ), countryCode.toUpperCase( ) ].join( '-' );
+				}
+			}
+
+			globalizeCultureFile = getGlobalizeCultureFile( lang );
+			globalizeCulturePath = getGlobalizeCulturePath( self, globalizeCultureFile );
+			neutralLangIndex = lang.lastIndexOf( '-' );
+
+			// Run culture script
+			console.log( 'Run globalize culture: ' + globalizeCulturePath );
+			this.util.loadScriptSync(
+				globalizeCulturePath,
+				null,
+				function ( jqXHR, textStatus, errorThrown ) {	// Failed to load!
+					if ( jqXHR.status == 404 ) {
+						// If culture file is not found, run neutral language culture. 
+						// (e.g. en-US --> en)
+						if ( neutralLangIndex != -1 ) {
+							var neutralLang = lang.substr( 0, neutralLangIndex ),
+								neutralCultureFile = getGlobalizeCultureFile( neutralLang ),
+								neutralCulturePath = getGlobalizeCulturePath( self, neutralCultureFile );
+							console.log( 'Run globalize culture of neutral lang: ' + neutralCulturePath );
+							self.util.loadScriptSync( neutralCulturePath );
+						}
+					} else {
+						window.alert( 'Error while loading ' + globalizeCulturePath + '\n' + jqXHR.status + ':' + jqXHR.statusText );
+					}
+				}
+			);
+			return lang;
+		},
+		setGlobalize: function ( ) {
+			var lang = this.loadGlobalizeCulture( );
+
+			// Set culture
+			// NOTE: It is not needed to set with neutral lang. 
+			//       Globalize automatically deals with it.
+			Globalize.culture( lang );
+		},
+
+		/** Set viewport meta tag for mobile devices.
+		 *
+		 * @param[in]	viewportWidth	Viewport width. 'device-dpi' is also allowed.
+		 * @param[in]	useAutoScale	If true, calculate & use scale factor. otherwise, scale factor is 1.
+		 * @param[in]	useDeviceDpi	If true, add 'target-densityDpi=device-dpi' to viewport meta content.
+		 */
+		setViewport: function ( viewportWidth, useAutoScale, useDeviceDpi ) {
+			var meta,
+				scale = 1,
+				head;
+			// Do nothing if viewport setting code is already in the code.
+			$( "meta" ).each( function ( ) {
+				if ( $( this ).attr( "name" ) === "viewport" ) {
+					console.log( "User set viewport... framework viewport will not be applied." );
+					meta = this;
+					return;
+				}
+			});
+
+			// Set meta tag
+			meta = document.createElement( "meta" );
+			if ( meta ) {
+				scale = useAutoScale ? this.util.getScaleFactor( ) : scale;
+				meta.name = "viewport";
+				meta.content = "width=" + viewportWidth + ", initial-scale=" + scale + ", maximum-scale=" + scale + ", user-scalable=0";
+				if ( useDeviceDpi ) {
+					meta.content += ", target-densityDpi=device-dpi";
+				}
+				console.log( meta.content );
+				head = document.getElementsByTagName( 'head' ).item( 0 );
+				head.insertBefore( meta, head.firstChild );
+			}
+		},
+
+		/**	Read body's font-size, scale it, and reset it.
+		 *  param[in]	desired font-size / base font-size.
+		 */
+		scaleBaseFontSize: function ( themeDefaultFontSize, ratio ) {
+			var scaledFontSize = Math.round( themeDefaultFontSize * ratio );
+			$( '.ui-mobile' ).css( { 'font-size': scaledFontSize + "px" } );
+			$( '.ui-mobile').children( 'body' ).css( { 'font-size': scaledFontSize + "px" } );
+		},
+
+		setScaling: function ( ) {
+			var baseWidth = 720,		// NOTE: need to be changed to get the value from theme.
+				standardWidth = 360,
+				themeDefaultFontSize = parseInt( $( 'body' ).css( 'font-size' ), 10 );
+			$( 'body' ).attr( 'data-tizen-theme-default-font-size', themeDefaultFontSize );
+
+			if ( this.frameworkData.viewportScale ) {
+				// Use viewport scaling with base font-size
+				// NOTE: No font-size setting is needed.
+				this.setViewport( baseWidth, true, true );
+			} else {
+				// Fixed viewport scale(=1.0) with scaled font size
+				this.setViewport( "device-dpi", false, undefined );
+				this.scaleBaseFontSize( themeDefaultFontSize, parseFloat( standardWidth / baseWidth ) );
+			}
+		}
+	};
+} ( jQuery, window.Globalize, window ) );
+
+
+// Loader's job list
+( function ( S, $, undefined ) {
+	S.getParams( );
+	S.loadTheme( );
+	S.setGlobalize( );
+
+	// Turn off JQM's auto initialization option.
+	// NOTE: This job must be done before domready.
+	$.mobile.autoInitializePage = false;
+
+	$(document).ready( function ( ) {
+		S.setScaling( );
+		$.mobile.initializePage( );
+	});
+} ( window.S, jQuery ) );
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Edit Field_clear.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Edit Field_clear.png
new file mode 100644
index 0000000..ac2d45a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Edit Field_clear.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_receive.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_receive.png
new file mode 100644
index 0000000..487636f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_receive.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_send.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_send.png
new file mode 100644
index 0000000..bc30b93
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_send.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_multimedia.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_multimedia.png
new file mode 100644
index 0000000..a59046f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_multimedia.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_picture.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_picture.png
new file mode 100644
index 0000000..8123ba6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_picture.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_text.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_text.png
new file mode 100644
index 0000000..0272309
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_text.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_unnamed.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_unnamed.png
new file mode 100644
index 0000000..2114d24
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_unnamed.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt.png
new file mode 100644
index 0000000..35ccb75
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_dim.png
new file mode 100644
index 0000000..bd3a9b6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_press.png
new file mode 100644
index 0000000..f7d2779
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn.png
new file mode 100644
index 0000000..38b318f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_h.png
new file mode 100644
index 0000000..37f2240
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press.png
new file mode 100644
index 0000000..bc40970
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press_h.png
new file mode 100644
index 0000000..23d4584
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Video_play.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Video_play.png
new file mode 100644
index 0000000..01c534d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Video_play.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Volumepopup_title_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Volumepopup_title_bg.png
new file mode 100644
index 0000000..9b708b4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Volumepopup_title_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_normal.png
new file mode 100644
index 0000000..4caee0b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_01.png
new file mode 100644
index 0000000..4cad8da
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_02.png
new file mode 100644
index 0000000..36d4290
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_03.png
new file mode 100644
index 0000000..2dba733
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand _press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand _press.png
new file mode 100644
index 0000000..399ab64
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand _press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand.png
new file mode 100644
index 0000000..399ab64
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expanddim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expanddim.png
new file mode 100644
index 0000000..bf96241
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expanddim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_normal.png
new file mode 100644
index 0000000..23b80f0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_press.png
new file mode 100644
index 0000000..9408a25
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_dim.png
new file mode 100644
index 0000000..9ca5a44
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal.png
new file mode 100644
index 0000000..9290a24
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal_press.png
new file mode 100644
index 0000000..f429735
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_dim.png
new file mode 100644
index 0000000..df381ba
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_normal.png
new file mode 100644
index 0000000..1709d98
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_press.png
new file mode 100644
index 0000000..f429735
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_dim.png
new file mode 100644
index 0000000..4ed088e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_normal.png
new file mode 100644
index 0000000..28a4382
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_press.png
new file mode 100644
index 0000000..2984427
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_dim.png
new file mode 100644
index 0000000..0df5593
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_normal.png
new file mode 100644
index 0000000..c8c5884
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_press.png
new file mode 100644
index 0000000..aea3bcc
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call.png
new file mode 100644
index 0000000..9c13b04
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call_press.png
new file mode 100644
index 0000000..9c13b04
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel.png
new file mode 100644
index 0000000..f8eaf80
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel_press.png
new file mode 100644
index 0000000..f8eaf80
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit.png
new file mode 100644
index 0000000..a7aabe9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_dim.png
new file mode 100644
index 0000000..43b7c24
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_press.png
new file mode 100644
index 0000000..306c745
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed.png
new file mode 100644
index 0000000..b421ad1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed_press.png
new file mode 100644
index 0000000..b421ad1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened.png
new file mode 100644
index 0000000..9d89e65
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened_press.png
new file mode 100644
index 0000000..9d89e65
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_off.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_off.png
new file mode 100644
index 0000000..d9c0f89
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_off.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_on.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_on.png
new file mode 100644
index 0000000..6f5fd0a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_on.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed.png
new file mode 100644
index 0000000..acca071
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed_press.png
new file mode 100644
index 0000000..acca071
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened.png
new file mode 100644
index 0000000..cd36ac1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened_press.png
new file mode 100644
index 0000000..cd36ac1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus.png
new file mode 100644
index 0000000..f9a376f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus_press.png
new file mode 100644
index 0000000..ee9aedd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus.png
new file mode 100644
index 0000000..1ee0149
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus_press.png
new file mode 100644
index 0000000..1ee0149
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info.png
new file mode 100644
index 0000000..4a6e104
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info_press.png
new file mode 100644
index 0000000..4a6e104
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_normal.png
new file mode 100644
index 0000000..eadabad
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_press.png
new file mode 100644
index 0000000..eadabad
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_off.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_off.png
new file mode 100644
index 0000000..3587a8f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_off.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_on.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_on.png
new file mode 100644
index 0000000..db96e36
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_on.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_normal.png
new file mode 100644
index 0000000..724d1a8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_press.png
new file mode 100644
index 0000000..724d1a8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_dim.png
new file mode 100644
index 0000000..9ca5a44
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_normal.png
new file mode 100644
index 0000000..7b486af
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_press.png
new file mode 100644
index 0000000..f429735
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal1.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal1.png
new file mode 100644
index 0000000..8511481
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal1.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal2.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal2.png
new file mode 100644
index 0000000..8ace6b3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal2.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press1.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press1.png
new file mode 100644
index 0000000..4ba1c87
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press1.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press2.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press2.png
new file mode 100644
index 0000000..957c127
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press2.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename.png
new file mode 100644
index 0000000..39c5de5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename_press.png
new file mode 100644
index 0000000..39c5de5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal.png
new file mode 100644
index 0000000..973b0ea
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left.png
new file mode 100644
index 0000000..5740523
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left_press.png
new file mode 100644
index 0000000..c1a99fa
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_press.png
new file mode 100644
index 0000000..973b0ea
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send.png
new file mode 100644
index 0000000..c3bf732
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send_press.png
new file mode 100644
index 0000000..c3bf732
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep.png
new file mode 100644
index 0000000..638a16b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_delete.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_delete.png
new file mode 100644
index 0000000..87d7185
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_delete.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_dim.png
new file mode 100644
index 0000000..c53e775
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_press.png
new file mode 100644
index 0000000..451bf38
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning.png
new file mode 100644
index 0000000..c4789db
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning_press.png
new file mode 100644
index 0000000..98a1265
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_caller ID_masking_BG.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_caller ID_masking_BG.png
new file mode 100644
index 0000000..169b5a8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_caller ID_masking_BG.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg.png
new file mode 100644
index 0000000..06f38ca
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg_press.png
new file mode 100644
index 0000000..2c2599b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_checking.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_checking.png
new file mode 100644
index 0000000..eaf68c4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_checking.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left.png
new file mode 100644
index 0000000..684153d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_dim.png
new file mode 100644
index 0000000..003c491
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_press.png
new file mode 100644
index 0000000..91a80e5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right.png
new file mode 100644
index 0000000..d24b631
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_dim.png
new file mode 100644
index 0000000..84c8a07
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_press.png
new file mode 100644
index 0000000..de5d76d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_focus.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_focus.png
new file mode 100644
index 0000000..f6afdd7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_focus.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palett.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palett.png
new file mode 100644
index 0000000..2130190
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palett.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palette_focus.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palette_focus.png
new file mode 100644
index 0000000..2614ed0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palette_focus.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_popup_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_popup_bg.png
new file mode 100644
index 0000000..b8f0b9a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_popup_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_rollover_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_rollover_bg.png
new file mode 100644
index 0000000..a2b108c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_rollover_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_field_btn_Clear.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_field_btn_Clear.png
new file mode 100644
index 0000000..c4f2b35
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_field_btn_Clear.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_index list_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_index list_bg.png
new file mode 100644
index 0000000..6f6aa04
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_index list_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_input_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_input_bg.png
new file mode 100644
index 0000000..d5c11f5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_input_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_group_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_group_bg.png
new file mode 100644
index 0000000..c023e50
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_group_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_img_check.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_img_check.png
new file mode 100644
index 0000000..c954b08
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_img_check.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_001.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_001.png
new file mode 100644
index 0000000..ecd4f24
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_001.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_002.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_002.png
new file mode 100644
index 0000000..fc2ae05
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_002.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_1.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_1.png
new file mode 100644
index 0000000..fddb025
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_1.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_10.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_10.png
new file mode 100644
index 0000000..5faf411
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_10.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_2.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_2.png
new file mode 100644
index 0000000..c522c5f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_2.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_3.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_3.png
new file mode 100644
index 0000000..4a0f89b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_3.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_4.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_4.png
new file mode 100644
index 0000000..f8a8de9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_4.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_5.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_5.png
new file mode 100644
index 0000000..887b31a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_5.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_6.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_6.png
new file mode 100644
index 0000000..ae94045
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_6.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_7.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_7.png
new file mode 100644
index 0000000..b6fee01
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_7.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_8.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_8.png
new file mode 100644
index 0000000..d1c1158
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_8.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_9.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_9.png
new file mode 100644
index 0000000..c1629d6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_9.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_photo_masking.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_photo_masking.png
new file mode 100644
index 0000000..e3f2a1d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_photo_masking.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left.png
new file mode 100644
index 0000000..205ecac
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left_press.png
new file mode 100644
index 0000000..205ecac
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right.png
new file mode 100644
index 0000000..1461a0c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right_press.png
new file mode 100644
index 0000000..1461a0c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_normal.png
new file mode 100644
index 0000000..215887b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_press.png
new file mode 100644
index 0000000..a32a884
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_panel_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_panel_bg.png
new file mode 100644
index 0000000..e274bca
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_panel_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bg.png
new file mode 100644
index 0000000..e15e423
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bottom_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bottom_bg.png
new file mode 100644
index 0000000..273e7ce
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bottom_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_bg.png
new file mode 100644
index 0000000..6425919
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_bottom.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_bottom.png
new file mode 100644
index 0000000..432bfac
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_bottom.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_top.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_top.png
new file mode 100644
index 0000000..cc2bec6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_top.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_title_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_title_bg.png
new file mode 100644
index 0000000..c25d08e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_title_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_reorder_group_list_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_reorder_group_list_bg.png
new file mode 100644
index 0000000..b551f88
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_reorder_group_list_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar.png
new file mode 100644
index 0000000..86930ea
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_02.png
new file mode 100644
index 0000000..1585d22
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler.png
new file mode 100644
index 0000000..52ffbef
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler_hor.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler_hor.png
new file mode 100644
index 0000000..76a84a9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler_hor.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_icon.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_icon.png
new file mode 100644
index 0000000..086c91d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_icon.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_input_field_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_input_field_bg.png
new file mode 100644
index 0000000..1aedfd2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_input_field_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness01.png
new file mode 100644
index 0000000..fef2550
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness02.png
new file mode 100644
index 0000000..842e8be
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume01.png
new file mode 100644
index 0000000..35aca93
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume02.png
new file mode 100644
index 0000000..bbd50e1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle.png
new file mode 100644
index 0000000..6047d2d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_dim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_dim.png
new file mode 100644
index 0000000..829f99d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_dim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_press.png
new file mode 100644
index 0000000..e3ebf5e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_popup_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_popup_bg.png
new file mode 100644
index 0000000..0aad395
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_popup_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler.png
new file mode 100644
index 0000000..7abc6ef
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler_hor.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler_hor.png
new file mode 100644
index 0000000..6ae0864
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler_hor.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_sweep_list_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_sweep_list_bg.png
new file mode 100644
index 0000000..875c68e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_sweep_list_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_number_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_number_bg.png
new file mode 100644
index 0000000..29aa7f6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_number_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_tail.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_tail.png
new file mode 100644
index 0000000..f219f83
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_tail.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back.png
new file mode 100644
index 0000000..780e24e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal.png
new file mode 100644
index 0000000..cb7ca0b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal_h.png
new file mode 100644
index 0000000..539f21d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press.png
new file mode 100644
index 0000000..7032b70
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press_h.png
new file mode 100644
index 0000000..8c47f13
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_normal.png
new file mode 100644
index 0000000..cbb817d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_01.png
new file mode 100644
index 0000000..9384134
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_02.png
new file mode 100644
index 0000000..efc6605
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_03.png
new file mode 100644
index 0000000..404d7b7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal.png
new file mode 100644
index 0000000..2adac70
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal_h.png
new file mode 100644
index 0000000..5d763bb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01.png
new file mode 100644
index 0000000..b4c44b9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01_h.png
new file mode 100644
index 0000000..87f07e9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02.png
new file mode 100644
index 0000000..0f4e3d5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02_h.png
new file mode 100644
index 0000000..9037624
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03.png
new file mode 100644
index 0000000..7b577d8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03_h.png
new file mode 100644
index 0000000..e3456fb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_optiontray.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_optiontray.png
new file mode 100644
index 0000000..cf918c8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_optiontray.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_normal.png
new file mode 100644
index 0000000..f1e3144
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_center.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_center.png
new file mode 100644
index 0000000..062cde0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_center.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_left.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_left.png
new file mode 100644
index 0000000..2eed728
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_left.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_right.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_right.png
new file mode 100644
index 0000000..98a28ed
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_right.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal.png
new file mode 100644
index 0000000..8babbff
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal_h.png
new file mode 100644
index 0000000..4b20ed9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01.png
new file mode 100644
index 0000000..845b19f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01_h.png
new file mode 100644
index 0000000..ab30b27
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02.png
new file mode 100644
index 0000000..5bc86d0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02_h.png
new file mode 100644
index 0000000..cd84b06
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03.png
new file mode 100644
index 0000000..bd0f1bd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03_h.png
new file mode 100644
index 0000000..7d80637
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_normal.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_normal.png
new file mode 100644
index 0000000..ae793bc
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_normal.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_01.png
new file mode 100644
index 0000000..0bbfe26
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_02.png
new file mode 100644
index 0000000..30e9804
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_03.png
new file mode 100644
index 0000000..38cb3d7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg.png
new file mode 100644
index 0000000..a98c595
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg_h.png
new file mode 100644
index 0000000..137372f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg.png
new file mode 100644
index 0000000..d21ae34
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg_h.png
new file mode 100644
index 0000000..d76a79f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line.png
new file mode 100644
index 0000000..3d06505
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line_h.png
new file mode 100644
index 0000000..ec94db9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow.png
new file mode 100644
index 0000000..f5fffc8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow_h.png
new file mode 100644
index 0000000..0d6ed9e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_bg.png
new file mode 100644
index 0000000..187516e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_Status.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_Status.png
new file mode 100644
index 0000000..2b8df41
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_Status.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_off.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_off.png
new file mode 100644
index 0000000..3a9fcb4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_off.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_on.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_on.png
new file mode 100644
index 0000000..1d100a9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_on.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bar.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bar.png
new file mode 100644
index 0000000..e531572
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bar.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bg.png
new file mode 100644
index 0000000..c814106
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_more.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_more.png
new file mode 100644
index 0000000..463f3e6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_more.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_notification_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_notification_bg.png
new file mode 100644
index 0000000..c837a6e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_notification_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_01.png
new file mode 100644
index 0000000..481de4b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_02.png
new file mode 100644
index 0000000..3df3d0b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_tabbar_focus.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_tabbar_focus.png
new file mode 100644
index 0000000..06552b2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_tabbar_focus.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg.png
new file mode 100644
index 0000000..c837a6e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg_h.png
new file mode 100644
index 0000000..553902e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg.png
new file mode 100644
index 0000000..3afcd25
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg_h.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg_h.png
new file mode 100644
index 0000000..2e12780
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg_h.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_toolbar_press.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_toolbar_press.png
new file mode 100644
index 0000000..98698f3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_toolbar_press.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon.png
new file mode 100644
index 0000000..1909685
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Mute.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Mute.png
new file mode 100644
index 0000000..bc99150
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Mute.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Vibrat.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Vibrat.png
new file mode 100644
index 0000000..d40a47e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Vibrat.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/ajax-loader.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/ajax-loader.png
new file mode 100644
index 0000000..811a2cd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/ajax-loader.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_3Dview.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_3Dview.png
new file mode 100644
index 0000000..9769b25
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_3Dview.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_DM.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_DM.png
new file mode 100644
index 0000000..f27e616
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_DM.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Externalstorage.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Externalstorage.png
new file mode 100644
index 0000000..247fa73
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Externalstorage.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_MemoryCard.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_MemoryCard.png
new file mode 100644
index 0000000..3f10810
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_MemoryCard.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Play.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Play.png
new file mode 100644
index 0000000..4a0505e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Play.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_TTS.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_TTS.png
new file mode 100644
index 0000000..666c821
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_TTS.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_account_sign-up.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_account_sign-up.png
new file mode 100644
index 0000000..2288758
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_account_sign-up.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_accounts.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_accounts.png
new file mode 100644
index 0000000..768d8db
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_accounts.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-bookmarks.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-bookmarks.png
new file mode 100644
index 0000000..bc2e48b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-bookmarks.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-calendar.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-calendar.png
new file mode 100644
index 0000000..20eae31
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-calendar.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_tag.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_tag.png
new file mode 100644
index 0000000..cf631ac
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_tag.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_to_contact.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_to_contact.png
new file mode 100644
index 0000000..65d47e4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_to_contact.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_alarm.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_alarm.png
new file mode 100644
index 0000000..50997d5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_alarm.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_albums.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_albums.png
new file mode 100644
index 0000000..03f8404
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_albums.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_area.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_area.png
new file mode 100644
index 0000000..8b3889b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_area.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_artist.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_artist.png
new file mode 100644
index 0000000..c7b10a9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_artist.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_attach.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_attach.png
new file mode 100644
index 0000000..4ab53f2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_attach.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_back.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_back.png
new file mode 100644
index 0000000..64dbf1b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_back.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_backward.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_backward.png
new file mode 100644
index 0000000..066f51c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_backward.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bluetooth_preview.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bluetooth_preview.png
new file mode 100644
index 0000000..99946bb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bluetooth_preview.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bookmarks.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bookmarks.png
new file mode 100644
index 0000000..586e1f3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bookmarks.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_brightness.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_brightness.png
new file mode 100644
index 0000000..953dc47
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_brightness.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_calendar.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_calendar.png
new file mode 100644
index 0000000..30cea7c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_calendar.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_call.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_call.png
new file mode 100644
index 0000000..b8b7806
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_call.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_camera.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_camera.png
new file mode 100644
index 0000000..234a611
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_camera.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_category.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_category.png
new file mode 100644
index 0000000..829b21d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_category.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_change_group.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_change_group.png
new file mode 100644
index 0000000..9d1e569
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_change_group.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_chat.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_chat.png
new file mode 100644
index 0000000..50d1943
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_chat.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_check.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_check.png
new file mode 100644
index 0000000..5be28b7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_check.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_close.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_close.png
new file mode 100644
index 0000000..91b04e5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_close.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_compose.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_compose.png
new file mode 100644
index 0000000..20b71f7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_compose.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_composer.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_composer.png
new file mode 100644
index 0000000..71a9192
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_composer.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_contacts.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_contacts.png
new file mode 100644
index 0000000..a376989
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_contacts.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_copy.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_copy.png
new file mode 100644
index 0000000..13c40bb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_copy.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create.png
new file mode 100644
index 0000000..0dc1144
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create_folder.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create_folder.png
new file mode 100644
index 0000000..d74811f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create_folder.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_delete.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_delete.png
new file mode 100644
index 0000000..faaa0d3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_delete.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_dialer.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_dialer.png
new file mode 100644
index 0000000..1ad19c7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_dialer.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_edit.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_edit.png
new file mode 100644
index 0000000..4ddc598
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_edit.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_editor.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_editor.png
new file mode 100644
index 0000000..924818f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_editor.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_eng_eng_result.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_eng_eng_result.png
new file mode 100644
index 0000000..466584c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_eng_eng_result.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_exchangs_register.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_exchangs_register.png
new file mode 100644
index 0000000..58c6e27
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_exchangs_register.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_favorite.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_favorite.png
new file mode 100644
index 0000000..aa13cf9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_favorite.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_features.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_features.png
new file mode 100644
index 0000000..e05d165
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_features.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_forward.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_forward.png
new file mode 100644
index 0000000..a1fca43
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_forward.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_genre.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_genre.png
new file mode 100644
index 0000000..bb6336c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_genre.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_groups.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_groups.png
new file mode 100644
index 0000000..e793512
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_groups.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_help.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_help.png
new file mode 100644
index 0000000..7345a02
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_help.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_home.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_home.png
new file mode 100644
index 0000000..93e3fad
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_home.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_info.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_info.png
new file mode 100644
index 0000000..0320ad3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_info.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_length.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_length.png
new file mode 100644
index 0000000..b23f708
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_length.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_list_by.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_list_by.png
new file mode 100644
index 0000000..0c17352
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_list_by.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_logs.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_logs.png
new file mode 100644
index 0000000..384341b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_logs.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_map.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_map.png
new file mode 100644
index 0000000..7300286
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_map.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_memolist.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_memolist.png
new file mode 100644
index 0000000..8d92234
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_memolist.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_mention.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_mention.png
new file mode 100644
index 0000000..31774da
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_mention.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_menu.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_menu.png
new file mode 100644
index 0000000..b5a9a8d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_menu.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_more.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_more.png
new file mode 100644
index 0000000..651c8e1
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_more.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_move.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_move.png
new file mode 100644
index 0000000..fdc8c8a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_move.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview.png
new file mode 100644
index 0000000..2d731eb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_02.png
new file mode 100644
index 0000000..32ff645
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_03.png
new file mode 100644
index 0000000..8d74949
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_04.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_04.png
new file mode 100644
index 0000000..66bc543
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_04.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_05.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_05.png
new file mode 100644
index 0000000..f17bba0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_05.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_06.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_06.png
new file mode 100644
index 0000000..dce660a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_06.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_07.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_07.png
new file mode 100644
index 0000000..427f171
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_07.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_08.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_08.png
new file mode 100644
index 0000000..8c4467c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_08.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_09.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_09.png
new file mode 100644
index 0000000..5a7719f
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_09.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_music_albums.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_music_albums.png
new file mode 100644
index 0000000..ad20f50
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_music_albums.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_pause.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_pause.png
new file mode 100644
index 0000000..4483640
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_pause.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_phone.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_phone.png
new file mode 100644
index 0000000..74e9ec6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_phone.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_playlists.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_playlists.png
new file mode 100644
index 0000000..44eabbf
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_playlists.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_receive.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_receive.png
new file mode 100644
index 0000000..06e7946
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_receive.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_reply.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_reply.png
new file mode 100644
index 0000000..4bdadbd
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_reply.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save.png
new file mode 100644
index 0000000..f8a9278
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save_to_calender.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save_to_calender.png
new file mode 100644
index 0000000..c604f31
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save_to_calender.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_scrap.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_scrap.png
new file mode 100644
index 0000000..b46bd8b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_scrap.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_search.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_search.png
new file mode 100644
index 0000000..ff46fa3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_search.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_send.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_send.png
new file mode 100644
index 0000000..7855940
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_send.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_set_as.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_set_as.png
new file mode 100644
index 0000000..b519baf
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_set_as.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_settings.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_settings.png
new file mode 100644
index 0000000..bbea504
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_settings.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_setup_wizard_previous.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_setup_wizard_previous.png
new file mode 100644
index 0000000..2185437
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_setup_wizard_previous.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_share.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_share.png
new file mode 100644
index 0000000..c1a20b5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_share.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_songs.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_songs.png
new file mode 100644
index 0000000..ddf797e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_songs.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_stop_watch.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_stop_watch.png
new file mode 100644
index 0000000..c176aa2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_stop_watch.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_store.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_store.png
new file mode 100644
index 0000000..54c32f5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_store.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_start_sync.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_start_sync.png
new file mode 100644
index 0000000..e91d2e4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_start_sync.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_01.png
new file mode 100644
index 0000000..5121229
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_02.png
new file mode 100644
index 0000000..138bed9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_03.png
new file mode 100644
index 0000000..fcc1917
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_view_result.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_view_result.png
new file mode 100644
index 0000000..107f009
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_view_result.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_tag.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_tag.png
new file mode 100644
index 0000000..f942628
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_tag.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_temp.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_temp.png
new file mode 100644
index 0000000..0ae4445
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_temp.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timeline.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timeline.png
new file mode 100644
index 0000000..f456014
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timeline.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timer.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timer.png
new file mode 100644
index 0000000..2464103
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timer.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_today.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_today.png
new file mode 100644
index 0000000..c200446
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_today.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_top.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_top.png
new file mode 100644
index 0000000..f7e63fa
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_top.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_trim.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_trim.png
new file mode 100644
index 0000000..b46bd8b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_trim.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_unread_message.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_unread_message.png
new file mode 100644
index 0000000..bda2bee
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_unread_message.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_update.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_update.png
new file mode 100644
index 0000000..524b7ca
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_update.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_upload_export.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_upload_export.png
new file mode 100644
index 0000000..c381158
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_upload_export.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_volume.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_volume.png
new file mode 100644
index 0000000..1b676dc
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_volume.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_weight.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_weight.png
new file mode 100644
index 0000000..514d155
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_weight.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_world_clock.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_world_clock.png
new file mode 100644
index 0000000..e9b7669
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_world_clock.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_year.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_year.png
new file mode 100644
index 0000000..a4e14d5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_year.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-black.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-black.png
new file mode 100644
index 0000000..1ecfd26
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-black.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-white.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-white.png
new file mode 100644
index 0000000..0c70831
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-white.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-black.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-black.png
new file mode 100644
index 0000000..4c72adf
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-black.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-white.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-white.png
new file mode 100644
index 0000000..84ea9fb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-white.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_001.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_001.png
new file mode 100644
index 0000000..cf3d69c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_001.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_002.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_002.png
new file mode 100644
index 0000000..e49b277
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_002.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_01.png
new file mode 100644
index 0000000..901dac3
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_02.png
new file mode 100644
index 0000000..b81cbf8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_03.png
new file mode 100644
index 0000000..f62e65b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_04.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_04.png
new file mode 100644
index 0000000..86be281
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_04.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_05.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_05.png
new file mode 100644
index 0000000..9255391
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_05.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_06.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_06.png
new file mode 100644
index 0000000..1635f8a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_06.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_07.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_07.png
new file mode 100644
index 0000000..cf91725
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_07.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_08.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_08.png
new file mode 100644
index 0000000..df1adb7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_08.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_09.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_09.png
new file mode 100644
index 0000000..1264428
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_09.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_10.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_10.png
new file mode 100644
index 0000000..e0a87f5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_10.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_bottom.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_bottom.png
new file mode 100644
index 0000000..f8101af
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_bottom.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_top.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_top.png
new file mode 100644
index 0000000..8f35070
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_top.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_ver.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_ver.png
new file mode 100644
index 0000000..21b1351
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_ver.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_bubble_bg_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_bubble_bg_01.png
new file mode 100644
index 0000000..61d6b7b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_bubble_bg_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_title_bg_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_title_bg_01.png
new file mode 100644
index 0000000..dcfbc9c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_title_bg_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_01.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_01.png
new file mode 100644
index 0000000..8124a7b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_01.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_02.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_02.png
new file mode 100644
index 0000000..c4428f7
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_02.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_03.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_03.png
new file mode 100644
index 0000000..33458d5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_03.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_04.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_04.png
new file mode 100644
index 0000000..b3f8ef6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_04.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_05.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_05.png
new file mode 100644
index 0000000..cb53465
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_05.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_06.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_06.png
new file mode 100644
index 0000000..1fc9501
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_06.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_07.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_07.png
new file mode 100644
index 0000000..1174beb
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_07.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_08.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_08.png
new file mode 100644
index 0000000..9386d3a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_08.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_09.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_09.png
new file mode 100644
index 0000000..19c608c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_09.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_10.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_10.png
new file mode 100644
index 0000000..72334f2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_10.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_11.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_11.png
new file mode 100644
index 0000000..77ac2f2
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_11.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_12.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_12.png
new file mode 100644
index 0000000..466c052
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_12.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_13.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_13.png
new file mode 100644
index 0000000..d6047fc
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_13.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_14.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_14.png
new file mode 100644
index 0000000..ee0cee5
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_14.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_15.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_15.png
new file mode 100644
index 0000000..9733288
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_15.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_16.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_16.png
new file mode 100644
index 0000000..fb6b7c6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_16.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_17.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_17.png
new file mode 100644
index 0000000..4ff8db8
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_17.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_18.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_18.png
new file mode 100644
index 0000000..d1fde2d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_18.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_19.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_19.png
new file mode 100644
index 0000000..c2bb19b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_19.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_20.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_20.png
new file mode 100644
index 0000000..50d9e81
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_20.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_21.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_21.png
new file mode 100644
index 0000000..c65fe5c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_21.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_22.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_22.png
new file mode 100644
index 0000000..b7b4443
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_22.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_23.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_23.png
new file mode 100644
index 0000000..f102b8b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_23.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_24.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_24.png
new file mode 100644
index 0000000..a47ff9b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_24.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_25.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_25.png
new file mode 100644
index 0000000..b306a07
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_25.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_26.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_26.png
new file mode 100644
index 0000000..21af3ff
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_26.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_27.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_27.png
new file mode 100644
index 0000000..398d438
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_27.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_28.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_28.png
new file mode 100644
index 0000000..e0721fa
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_28.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_29.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_29.png
new file mode 100644
index 0000000..4fcda20
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_29.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_30.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_30.png
new file mode 100644
index 0000000..1c5064b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_30.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_01_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_01_32x32.png
new file mode 100644
index 0000000..556fd00
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_01_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_02_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_02_32x32.png
new file mode 100644
index 0000000..e3f6661
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_02_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_03_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_03_32x32.png
new file mode 100644
index 0000000..aabd74d
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_03_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_04_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_04_32x32.png
new file mode 100644
index 0000000..6752381
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_04_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_05_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_05_32x32.png
new file mode 100644
index 0000000..026bf39
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_05_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_06_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_06_32x32.png
new file mode 100644
index 0000000..76ad804
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_06_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_07_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_07_32x32.png
new file mode 100644
index 0000000..3ff8e86
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_07_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_08_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_08_32x32.png
new file mode 100644
index 0000000..35964af
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_08_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_09_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_09_32x32.png
new file mode 100644
index 0000000..acc0e33
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_09_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_10_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_10_32x32.png
new file mode 100644
index 0000000..732ab34
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_10_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_11_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_11_32x32.png
new file mode 100644
index 0000000..5bb451a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_11_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_12_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_12_32x32.png
new file mode 100644
index 0000000..d411a19
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_12_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_13_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_13_32x32.png
new file mode 100644
index 0000000..4df5086
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_13_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_14_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_14_32x32.png
new file mode 100644
index 0000000..eda2bb4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_14_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_15_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_15_32x32.png
new file mode 100644
index 0000000..5a1225e
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_15_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_16_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_16_32x32.png
new file mode 100644
index 0000000..3fb7f2b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_16_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_17_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_17_32x32.png
new file mode 100644
index 0000000..d40c3a4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_17_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_18_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_18_32x32.png
new file mode 100644
index 0000000..b6f87c0
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_18_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_19_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_19_32x32.png
new file mode 100644
index 0000000..e06e91c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_19_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_20_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_20_32x32.png
new file mode 100644
index 0000000..b7fea9c
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_20_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_21_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_21_32x32.png
new file mode 100644
index 0000000..9b953a6
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_21_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_22_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_22_32x32.png
new file mode 100644
index 0000000..e4da281
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_22_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_23_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_23_32x32.png
new file mode 100644
index 0000000..a63c879
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_23_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_24_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_24_32x32.png
new file mode 100644
index 0000000..d3c8964
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_24_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_25_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_25_32x32.png
new file mode 100644
index 0000000..480b0b4
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_25_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_26_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_26_32x32.png
new file mode 100644
index 0000000..73a1a83
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_26_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_27_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_27_32x32.png
new file mode 100644
index 0000000..c06818a
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_27_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_28_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_28_32x32.png
new file mode 100644
index 0000000..015dda9
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_28_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_29_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_29_32x32.png
new file mode 100644
index 0000000..01d8f98
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_29_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_30_32x32.png b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_30_32x32.png
new file mode 100644
index 0000000..8633efe
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_30_32x32.png
Binary files differ
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/theme.js b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/theme.js
new file mode 100644
index 0000000..763989b
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/theme.js
@@ -0,0 +1,22 @@
+(function( $, undefined ) {
+//$.mobile.page.prototype.options.backBtnTheme	= "s";
+
+// Clear default theme for child elements
+$.mobile.page.prototype.options.headerTheme		= "s";
+$.mobile.page.prototype.options.footerTheme		= "s";
+//$.mobile.page.prototype.options.contentTheme	= "s";
+
+// clear listview
+$.mobile.listview.prototype.options.theme = "s";
+$.mobile.listview.prototype.options.countTheme = "s";
+$.mobile.listview.prototype.options.headerTheme = "s";
+$.mobile.listview.prototype.options.dividerTheme = "s";
+$.mobile.listview.prototype.options.splitTheme = "s";
+
+//clear button theme
+$.mobile.button.prototype.options.theme = "s";
+
+// Default theme swatch
+$.mobile.page.prototype.options.theme = "s";
+
+})(jQuery);
diff --git a/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/tizen-web-ui-fw-theme.css b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/tizen-web-ui-fw-theme.css
new file mode 100644
index 0000000..18f3916
--- /dev/null
+++ b/samples/cordova-tizen-web-ui/tizen-web-ui-fw/0.1/themes/tizen-gray/tizen-web-ui-fw-theme.css
@@ -0,0 +1,12866 @@
+/*!
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* Swatches */
+/* S
+-----------------------------------------------------------------------------------------------------------*/
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar
+***************************************************************************/
+.ui-bar-s {
+  border: none;
+  background: #1f1f1f;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: bold;
+  font-size: 1rem;
+  /*	
+	.ui-link {
+		color: #7cc4e7; 
+		font-weight: bold;
+		&:hover { color: #2489CE; }
+		&:active { color: #2489CE; }
+		&:visited {	color: #2489CE; }
+	}
+	*/
+}
+.ui-bar-s .ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-bar-s .ui-btn.ui-btn-back.ui-btn-down-s .ui-btn-inner {
+  background: #0a8cd2;
+}
+.ui-bar-s .ui-btn.ui-btn-back, .ui-bar-s .ui-btn.ui-btn-footer-right {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  width: 4rem;
+  height: 3.1666666666666665rem;
+  top: 0rem;
+  border-style: none;
+  border-width: 0px;
+  background: #1f1f1f;
+}
+.ui-bar-s .ui-btn.ui-btn-back .ui-btn-inner, .ui-bar-s .ui-btn.ui-btn-footer-right .ui-btn-inner {
+  padding: 0;
+  width: 2.888888888888889rem;
+  height: 2.0555555555555554rem;
+  top: 0.5555555555555556rem;
+  left: 0.5555555555555556rem;
+  background: #353535;
+  border-color: black;
+  border-width: 0.05555555555555555rem;
+  border-style: groove;
+}
+.ui-bar-s .ui-btn.ui-btn-back {
+  right: 0rem;
+}
+.ui-bar-s .ui-btn.ui-btn-footer-right.ui-btn-down-s .ui-btn-inner {
+  background: #0a8cd2;
+}
+.ui-bar-s .ui-btn.ui-btn-footer-right .ui-btn-inner .ui-btn-text {
+  line-height: 2.0555555555555554rem;
+}
+.ui-bar-s .ui-field-contain {
+  margin-left: auto;
+  margin-right: auto;
+  height: 2.0555555555555554rem;
+  font-size: 0.7777777777777777rem;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup {
+  position: absolute;
+  display: inline;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup label {
+  border-color: #2b2b2b;
+  border-style: solid;
+  border-left-width: 1px;
+  border-right-width: 1px;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio {
+  height: 2.0555555555555554rem;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-btn {
+  width: 100%;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-btn-inner .ui-btn-text {
+  text-align: center;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-radio-off {
+  background: #434343;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-radio-off .ui-btn-text {
+  color: #767676;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-radio-on {
+  background: #f9f9f9;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-radio-on .ui-btn-text {
+  color: #000000;
+}
+.ui-bar-s .ui-field-contain .ui-title-extended-controlgroup {
+  top: 0.1388888888888889rem;
+}
+.ui-bar-s .ui-field-contain .ui-footer-extended-controlgroup {
+  top: 0.4444444444444444rem;
+}
+.ui-bar-s .ui-field-contain .ui-footer-extended-controlgroup .ui-btn-inner {
+  line-height: 2.0555555555555554rem;
+  padding: 0rem;
+}
+.ui-bar-s .ui-title-normal-3btn {
+  position: absolute;
+  right: 4.277777777777778rem;
+  display: block;
+}
+.ui-bar-s .ui-title-extended-controlgroup-4btn {
+  width: 18.944444444444443rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-4btn .ui-radio {
+  width: 4.722222222222222rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-3btn {
+  width: 12rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-3btn .ui-radio {
+  width: 3.972222222222222rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-2btn {
+  width: 9.11111111111111rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-2btn .ui-radio {
+  width: 4.527777777777778rem;
+}
+.ui-header.ui-bar-s {
+  position: fixed;
+  top: 0px;
+  background: #6c6c6c;
+}
+.ui-header.ui-bar-s .ui-title {
+  color: #f9f9f9;
+  top: 0px;
+  min-height: 1rem;
+  text-align: center;
+  font-size: 1rem;
+  display: block;
+  margin: 0.7777777777777777rem 3.75rem 0.7777777777777777rem 3.75rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  outline: 0 !important;
+}
+.ui-header.ui-bar-s .ui-btn {
+  font-size: 0.7777777777777777rem;
+  height: 2.0555555555555554rem;
+  width: 3.444444444444444rem;
+}
+.ui-header.ui-bar-s > .ui-btn {
+  top: 0.3333333333333333rem;
+  margin-top: 0px;
+  font-size: 0.7777777777777777rem;
+  height: 2.0555555555555554rem;
+  background: #848484;
+  color: #f9f9f9;
+  border-style: solid;
+  border-color: #4c4c4c;
+  border-width: 1px;
+}
+.ui-header.ui-bar-s > .ui-btn .ui-btn-inner {
+  width: 3rem;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-down-s {
+  background: #0a8cd2;
+  color: #f9f9f9;
+}
+.ui-header.ui-bar-s.ui-title-extended-height {
+  height: 3.7777777777777777rem;
+}
+.ui-header.ui-bar-s.ui-title-extended-height a {
+  top: 1.3888888888888888rem;
+}
+.ui-header.ui-bar-s.ui-title-extended-height .ui-title {
+  font-size: 0.7777777777777777rem;
+  top: 0rem;
+  padding-top: 0.3055555555555555rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+}
+.ui-header.ui-bar-s.ui-title-extended-height .ui-title-extended-segment-style {
+  left: 0rem;
+  margin-top: 0rem;
+  top: 0.05555555555555555rem;
+}
+.ui-header.ui-bar-s.ui-title-controlbar-height, .ui-footer.ui-bar-s {
+  height: 3.1666666666666665rem;
+}
+.ui-footer.ui-bar-s.ui-footer-fixed {
+  background: #1f1f1f;
+  height: 3.1666666666666665rem;
+}
+.ui-footer.ui-bar-s.ui-footer-fixed .ui-title {
+  font-size: 0.8888888888888888rem;
+}
+.ui-footer.ui-bar-s .ui-title-extended-controlgroup-4btn {
+  margin-top: 0rem;
+}
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar
+***************************************************************************/
+/***************************************************************************
+                    Content Top calculate
+***************************************************************************/
+.ui-title-content-normal-height, .ui-title-content-option-header-collapsed-1line-height {
+  position: relative;
+  top: 2.7777777777777777rem;
+}
+.ui-title-content-extended-height {
+  position: relative;
+  top: 3.7777777777777777rem;
+}
+.ui-title-content-option-header-expanded-1line-height {
+  position: relative;
+  top: 5.416666666666666rem;
+}
+.ui-title-content-search {
+  position: relative;
+  top: 5.722222222222222rem;
+}
+.ui-title-content-optionheader-search {
+  position: relative;
+  top: 6.083333333333333rem;
+}
+.ui-title-content-controlbar-height {
+  position: relative;
+  top: 3.194444444444444rem;
+}
+/***************************************************************************
+                    Content Top calculate
+***************************************************************************/
+.ui-body-s {
+  border: 1px solid #2a2a2a;
+  background: #000000;
+  color: #f9f9f9;
+  font-weight: normal;
+  font-family: Helvetica, Arial, sans-serif;
+}
+.ui-body-s .ui-link-inherit {
+  color: #fff;
+}
+.ui-body-s .ui-link {
+  /* ui-body-link */
+
+  color: #2489CE;
+  font-weight: bold;
+}
+.ui-body-s .ui-link:hover {
+  color: #2489CE;
+}
+.ui-body-s .ui-link:active {
+  color: #2489CE;
+}
+.ui-body-s .ui-link:visited {
+  color: #2489CE;
+}
+.ui-btn-up-s {
+  background: #3b3b3b;
+  font-weight: bold;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.ui-btn-up-s a.ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-btn-up-s:hover {
+  color: #f9f9f9;
+}
+.ui-btn-hover-s {
+  background: #454545;
+  font-weight: bold;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.ui-btn-hover-s a.ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-btn-hover-s:hover {
+  color: #f9f9f9;
+}
+.ui-btn-down-s {
+  background: #008cd2;
+  font-weight: bold;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.ui-btn-down-s a.ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-btn-down-s:hover {
+  color: #f9f9f9;
+}
+.ui-btn-up-s, .ui-btn-hover-s, .ui-btn-down-s {
+  font-family: Helvetica, Arial, sans-serif;
+  text-decoration: none;
+}
+.ui-listview {
+  border-top-color: #444444;
+  /* listview: fonts for li with a link */
+
+  /* listview divider */
+
+  /* NOTE: this divider has no swatch tag! */
+
+  /* subitem */
+
+}
+.ui-listview > .ui-li {
+  border-bottom-color: #444444;
+}
+.ui-listview  > .ui-li-static {
+  background-color: #000000;
+}
+.ui-listview li.ui-btn-up-s, .ui-listview li.ui-btn-hover-s {
+  background-color: #000000;
+  color: #f9f9f9;
+}
+.ui-listview li.ui-btn-down-s {
+  background-color: #008cd2;
+  color: #f9f9f9;
+}
+.ui-listview li.ui-btn-up-s > .ui-li > .ui-btn-text > a.ui-link-inherit, .ui-listview li.ui-btn-hover-s > .ui-li > .ui-btn-text > a.ui-link-inherit, .ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-listview li.ui-li-divider {
+  background: #424242;
+  color: #a4a4a4;
+}
+.ui-listview .ui-li-sub {
+  color: #666666;
+}
+.ui-listview .ui-li-sub-setting {
+  color: #2a6d8c;
+}
+.ui-listview > .ui-li-expanded {
+  background-color: #1f1f1f;
+}
+.ui-listview > .ui-li-expanded .ui-li-expanded {
+  background-color: #2e2e2e;
+}
+.ui-listview .ui-li-static.ui-li-bubble-left {
+  background-color: #ddce7a;
+  -moz-box-shadow: 2px 3px 3px #4d3a17;
+  -webkit-box-shadow: 2px 3px 3px #4d3a17;
+  box-shadow: 2px 3px 3px #4d3a17;
+  color: #000000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-right {
+  background-color: #ddce7a;
+  -moz-box-shadow: 2px 3px 3px #4d3a17;
+  -webkit-box-shadow: 2px 3px 3px #4d3a17;
+  box-shadow: 2px 3px 3px #4d3a17;
+  color: #606060;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sos {
+  color: #d30000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-date {
+  background-color: #424242;
+  color: #39a6d7;
+}
+.ui-listview span.ui-li-bubble-time {
+  color: #39a6d7;
+}
+/* Structure */
+/* links within "buttons" 
+-----------------------------------------------------------------------------------------------------------*/
+a.ui-link-inherit {
+  text-decoration: none !important;
+}
+/* Active class used as the "on" state across all themes
+-----------------------------------------------------------------------------------------------------------*/
+/* button default color for active state */
+.ui-btn-active {
+  /* global-active */
+
+  color: #f9f9f9;
+  cursor: pointer;
+  text-decoration: none;
+  background: #008cd2;
+  outline: none;
+}
+.ui-btn-active a.ui-link-inherit {
+  color: #f9f9f9;
+}
+/* button inner top highlight
+-----------------------------------------------------------------------------------------------------------*/
+/*************************************************************************** 
+                    ControlBar
+***************************************************************************/
+.ui-controlbar-s, .ui-controlbar-left, .ui-controlbar-right {
+  border: 1px solid #2a2a2a;
+  background: #1f1f1f;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: bold;
+  font-size: 1rem;
+}
+.ui-controlbar-s .ui-link-inherit,
+.ui-controlbar-left .ui-link-inherit,
+.ui-controlbar-right .ui-link-inherit,
+.ui-controlbar-s .ui-link,
+.ui-controlbar-left .ui-link,
+.ui-controlbar-right .ui-link {
+  color: #f9f9f9;
+  font-weight: bold;
+}
+.ui-controlbar-s .ui-link-inherit:hover,
+.ui-controlbar-left .ui-link-inherit:hover,
+.ui-controlbar-right .ui-link-inherit:hover,
+.ui-controlbar-s .ui-link:hover,
+.ui-controlbar-left .ui-link:hover,
+.ui-controlbar-right .ui-link:hover {
+  color: #f9f9f9;
+}
+.ui-controlbar-s .ui-link-inherit:active,
+.ui-controlbar-left .ui-link-inherit:active,
+.ui-controlbar-right .ui-link-inherit:active,
+.ui-controlbar-s .ui-link:active,
+.ui-controlbar-left .ui-link:active,
+.ui-controlbar-right .ui-link:active {
+  color: #f9f9f9;
+}
+.ui-controlbar-s .ui-link-inherit:visited,
+.ui-controlbar-left .ui-link-inherit:visited,
+.ui-controlbar-right .ui-link-inherit:visited,
+.ui-controlbar-s .ui-link:visited,
+.ui-controlbar-left .ui-link:visited,
+.ui-controlbar-right .ui-link:visited {
+  color: #f9f9f9;
+}
+.ui-controlbar-s .ui-btn-text,
+.ui-controlbar-left .ui-btn-text,
+.ui-controlbar-right .ui-btn-text,
+.ui-controlbar-s .ui-btn,
+.ui-controlbar-left .ui-btn,
+.ui-controlbar-right .ui-btn {
+  color: #f9f9f9;
+  font-weight: bold;
+  text-decoration: none;
+}
+.ui-controlbar-s .ui-btn-down-s,
+.ui-controlbar-left .ui-btn-down-s,
+.ui-controlbar-right .ui-btn-down-s,
+.ui-controlbar-s .ui-btn-active,
+.ui-controlbar-left .ui-btn-active,
+.ui-controlbar-right .ui-btn-active {
+  color: #f9f9f9;
+}
+.ui-controlbar-s.ui-navbar {
+  position: absolute;
+  height: 3.1666666666666665rem;
+  /* temporary value */
+
+  width: 100%;
+  left: 0px;
+  border-top: none;
+  border-bottom: none;
+  z-index: 50;
+}
+.ui-controlbar-s.ui-navbar li .ui-btn, .ui-controlbar-s.ui-navbar .ui-navbar-toggle .ui-btn {
+  font-size: 0.7222222222222222rem;
+}
+.ui-controlbar-s.ui-navbar .ui-btn .ui-btn-inner,
+.ui-controlbar-s.ui-navbar .ui-btn-icon-top .ui-btn-inner,
+.ui-controlbar-s.ui-navbar .ui-btn-hover-s .ui-btn-inner,
+.ui-controlbar-s.ui-navbar .ui-btn-active .ui-btn-inner,
+.ui-controlbar-s.ui-navbar .ui-btn-up-s .ui-btn-inner {
+  padding-top: 2.194444444444444rem;
+}
+.ui-controlbar-s.ui-navbar .ui-btn .ui-icon {
+  left: 50%;
+  top: 0.3333333333333333rem;
+  margin-left: -1.3em;
+  width: 1.5555555555555554rem;
+  height: 1.5555555555555554rem;
+}
+.ui-controlbar-s.ui-navbar .ui-btn .ui-btn-text {
+  padding-left: 0px;
+}
+.ui-controlbar-s.ui-navbar .ui-btn.ui-ctrlbar-icononly {
+  padding-top: 0.5555555555555556rem;
+}
+.ui-controlbar-s.ui-navbar .ui-btn-inner {
+  z-index: 200;
+}
+.ui-controlbar-s.ui-navbar .ui-btn-inner.ui-navbar-textonly {
+  font-size: 0.7777777777777777rem;
+  padding-top: 1.222222222222222rem;
+  padding-bottom: 1.25rem;
+}
+.ui-tabbar-s .ui-btn {
+  background: #1f1f1f;
+}
+.ui-tabbar-s .ui-btn-active, .ui-tabbar-s .ui-btn-show-style {
+  background: #4c4c4c;
+  border-left-style: solid;
+  border-right-style: solid;
+  border-left-color: #2a2a2a;
+  border-right-color: #2a2a2a;
+  border-left-width: 1px;
+  border-right-width: 1px;
+}
+.ui-tabbar-s .ui-btn-animation {
+  background: #4c4c4c;
+  border-left-style: solid;
+  border-right-style: solid;
+  border-left-color: #2a2a2a;
+  border-right-color: #2a2a2a;
+  border-left-width: 1px;
+  border-right-width: 1px;
+  position: absolute;
+  top: 0px;
+  height: 3.4166666666666665rem;
+  z-index: 100;
+}
+.ui-tabbar-s .ui-btn-hide-style {
+  background: #1f1f1f;
+  border: none;
+}
+.ui-toolbar-s .ui-btn, .ui-toolbar-s .ui-btn-up-s {
+  background: #1f1f1f;
+  border-left-width: 1px;
+  border-right-width: 1px;
+  border-color: #2a2a2a;
+  border-style: solid;
+}
+.ui-toolbar-s .ui-btn-down-s {
+  background: #4c4c4c;
+}
+.ui-header .ui-navbar.ui-tabbar-s a, .ui-header .ui-navbar.ui-toolbar-s a {
+  width: 100%;
+  height: 100%;
+}
+.ui-controlbar-left.ui-navbar, .ui-controlbar-right.ui-navbar {
+  position: fixed;
+  z-index: 50;
+}
+.ui-controlbar-left.ui-navbar li .ui-btn,
+.ui-controlbar-right.ui-navbar li .ui-btn,
+.ui-controlbar-left.ui-navbar .ui-navbar-toggle .ui-btn,
+.ui-controlbar-right.ui-navbar .ui-navbar-toggle .ui-btn {
+  font-size: 0.5555555555555556rem;
+}
+.ui-controlbar-left.ui-navbar .ui-btn, .ui-controlbar-right.ui-navbar .ui-btn {
+  width: 100%;
+  margin: 0px 0em;
+  background: #1f1f1f;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-down-s,
+.ui-controlbar-right.ui-navbar .ui-btn-down-s,
+.ui-controlbar-left.ui-navbar .ui-btn-active,
+.ui-controlbar-right.ui-navbar .ui-btn-active {
+  color: #f9f9f9;
+}
+.ui-controlbar-left.ui-navbar li .ui-btn,
+.ui-controlbar-right.ui-navbar li .ui-btn,
+.ui-controlbar-left.ui-navbar .ui-navbar-toggle .ui-btn,
+.ui-controlbar-right.ui-navbar .ui-navbar-toggle .ui-btn {
+  font-size: 0.5555555555555556rem;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-inner, .ui-controlbar-right.ui-navbar .ui-btn-inner {
+  z-index: 200;
+  padding-top: 3.5rem;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-inner .ui-icon, .ui-controlbar-right.ui-navbar .ui-btn-inner .ui-icon {
+  left: 23%;
+  top: 0.9722222222222222rem;
+  width: 1.9444444444444444rem;
+  height: 1.9444444444444444rem;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left, .ui-controlbar-right.ui-navbar .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 0px;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-animation, .ui-controlbar-right.ui-navbar .ui-btn-animation {
+  position: fixed;
+  background: #1f1f1f;
+  border-bottom-style: solid;
+  border-top-style: solid;
+  border-bottom-color: #2a2a2a;
+  border-top-color: #2a2a2a;
+  border-bottom-width: 1px;
+  border-top-width: 1px;
+  z-index: 100;
+}
+.ui-controlbar-left {
+  left: 0px;
+  float: left;
+}
+.ui-controlbar-right {
+  right: 0px;
+  float: right;
+}
+.ui-btn-ani-endposition {
+  -webkit-transition-property: left;
+  -webkit-transition: all 0.3s ease-in-out;
+}
+.ui-btn-ani-verticalendposition {
+  -webkit-transition-property: top;
+  -webkit-transition: all 0.3s ease-in-out;
+}
+/*************************************************************************** 
+                    ControlBar
+***************************************************************************/
+/* corner rounding classes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-corner-tl {
+  -moz-border-radius-topleft: 0.6em;
+  -webkit-border-top-left-radius: 0.6em;
+  border-top-left-radius: 0.6em;
+}
+.ui-corner-tr {
+  -moz-border-radius-topright: 0.6em;
+  -webkit-border-top-right-radius: 0.6em;
+  border-top-right-radius: 0.6em;
+}
+.ui-corner-bl {
+  -moz-border-radius-bottomleft: 0.6em;
+  -webkit-border-bottom-left-radius: 0.6em;
+  border-bottom-left-radius: 0.6em;
+}
+.ui-corner-br {
+  -moz-border-radius-bottomright: 0.6em;
+  -webkit-border-bottom-right-radius: 0.6em;
+  border-bottom-right-radius: 0.6em;
+}
+.ui-corner-top {
+  -moz-border-radius-topleft: 0.6em;
+  -webkit-border-top-left-radius: 0.6em;
+  border-top-left-radius: 0.6em;
+  -moz-border-radius-topright: 0.6em;
+  -webkit-border-top-right-radius: 0.6em;
+  border-top-right-radius: 0.6em;
+}
+.ui-corner-bottom {
+  -moz-border-radius-bottomleft: 0.6em;
+  -webkit-border-bottom-left-radius: 0.6em;
+  border-bottom-left-radius: 0.6em;
+  -moz-border-radius-bottomright: 0.6em;
+  -webkit-border-bottom-right-radius: 0.6em;
+  border-bottom-right-radius: 0.6em;
+}
+.ui-corner-right {
+  -moz-border-radius-topright: 0.6em;
+  -webkit-border-top-right-radius: 0.6em;
+  border-top-right-radius: 0.6em;
+  -moz-border-radius-bottomright: 0.6em;
+  -webkit-border-bottom-right-radius: 0.6em;
+  border-bottom-right-radius: 0.6em;
+}
+.ui-corner-left {
+  -moz-border-radius-topleft: 0.6em;
+  -webkit-border-top-left-radius: 0.6em;
+  border-top-left-radius: 0.6em;
+  -moz-border-radius-bottomleft: 0.6em;
+  -webkit-border-bottom-left-radius: 0.6em;
+  border-bottom-left-radius: 0.6em;
+}
+.ui-corner-none {
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  bordert-radius: 0;
+}
+/* Interaction cues
+-----------------------------------------------------------------------------------------------------------*/
+.ui-disabled {
+  opacity: .3;
+}
+.ui-disabled, .ui-disabled a {
+  cursor: default;
+}
+/* Icons
+-----------------------------------------------------------------------------------------------------------*/
+.ui-icon {
+  /* global-icon */
+
+  background-image: url(images/icons-18-white.png);
+  background-repeat: no-repeat;
+}
+.ui-image-search {
+  background-image: url(images/00_search_icon.png);
+  background-repeat: no-repeat;
+  -moz-background-size: 1.1666666666666665rem 1.1666666666666665rem;
+  -o-background-size: 1.1666666666666665rem 1.1666666666666665rem;
+  -webkit-background-size: 1.1666666666666665rem 1.1666666666666665rem;
+  background-size: 1.1666666666666665rem 1.1666666666666665rem;
+}
+.ui-icon-deleteSearch {
+  background-image: url(images/00_field_btn_Clear.png);
+  background-repeat: no-repeat;
+  -moz-background-size: 1.0555555555555556rem 1.0555555555555556rem;
+  -o-background-size: 1.0555555555555556rem 1.0555555555555556rem;
+  -webkit-background-size: 1.0555555555555556rem 1.0555555555555556rem;
+  background-size: 1.0555555555555556rem 1.0555555555555556rem;
+}
+/* Alt icon color
+-----------------------------------------------------------------------------------------------------------*/
+.ui-icon-alt {
+  background: #fff;
+  background: rgba(255, 255, 255, 0.3);
+  background-image: url(images/icons-18-black.png);
+  background-repeat: no-repeat;
+}
+/* HD/"retina" sprite
+-----------------------------------------------------------------------------------------------------------*/
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
+       only screen and (min--moz-device-pixel-ratio: 1.5),
+       only screen and (min-resolution: 240dpi) {
+  .ui-icon-plus,
+  .ui-icon-minus,
+  .ui-icon-delete,
+  .ui-icon-arrow-r,
+  .ui-icon-arrow-l,
+  .ui-icon-arrow-u,
+  .ui-icon-arrow-d,
+  .ui-icon-check,
+  .ui-icon-gear,
+  .ui-icon-refresh,
+  .ui-icon-forward,
+  .ui-icon-back,
+  .ui-icon-grid,
+  .ui-icon-star,
+  .ui-icon-alert,
+  .ui-icon-info,
+  .ui-icon-home,
+  .ui-icon-search,
+  .ui-icon-searchfield:after,
+  .ui-icon-checkbox-off,
+  .ui-icon-checkbox-on,
+  .ui-icon-radio-off,
+  .ui-icon-radio-on {
+    background-image: url(images/icons-36-white.png);
+    -moz-background-size: 776px 18px;
+    -o-background-size: 776px 18px;
+    -webkit-background-size: 776px 18px;
+    background-size: 776px 18px;
+  }
+  .ui-icon-alt {
+    background-image: url(images/icons-36-black.png);
+  }
+}
+/* plus minus */
+.ui-icon-plus {
+  background-position: 0 50%;
+}
+.ui-icon-minus {
+  /*background-position: 	-36px 50%;*/
+  /* wongi_1018: Same name make problem. Later, origianl icons will be removed.  */
+
+}
+/* arrows */
+.ui-icon-arrow-r {
+  background-position: -108px 50%;
+}
+.ui-icon-arrow-l {
+  background-position: -144px 50%;
+}
+.ui-icon-arrow-u {
+  background-position: -180px 50%;
+}
+.ui-icon-arrow-d {
+  background-position: -216px 50%;
+}
+/* misc */
+.ui-icon-check {
+  background-position: -252px 50%;
+}
+.ui-icon-gear {
+  background-position: -288px 50%;
+}
+.ui-icon-refresh {
+  background-position: -324px 50%;
+}
+.ui-icon-forward {
+  background-position: -360px 50%;
+}
+.ui-icon-back {
+  background-position: -396px 50%;
+}
+.ui-icon-grid {
+  background-position: -432px 50%;
+}
+.ui-icon-star {
+  background-position: -468px 50%;
+}
+.ui-icon-alert {
+  background-position: -504px 50%;
+}
+.ui-icon-info {
+  background-position: -540px 50%;
+}
+.ui-icon-home {
+  background-position: -576px 50%;
+}
+/* checks,radios */
+.ui-checkbox .ui-icon {
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+}
+.ui-icon-radio-off {
+  background-color: transparent;
+}
+.ui-checkbox-on .ui-icon, .ui-radio-on .ui-icon {
+  /*Do not need bg color for icons..
+	background-color: #4596ce;*/
+  /* NOTE: this hex should match the active state color. It's repeated here for cascade */
+
+}
+/* loading icon */
+.ui-icon-loading {
+  background-image: url(images/ajax-loader.png);
+  width: 40px;
+  height: 40px;
+  -moz-border-radius: 20px;
+  -webkit-border-radius: 20px;
+  bordert-radius: 20px;
+}
+/* Add ctrl bar *//* TIZEN Default Footer */
+.ui-icon-ctrlbar-account_sign-up,
+.ui-icon-ctrlbar-accounts,
+.ui-icon-ctrlbar-add-to-bookmarks,
+.ui-icon-ctrlbar-add-to-calendar,
+.ui-icon-ctrlbar-alarm,
+.ui-icon-ctrlbar-albums,
+.ui-icon-ctrlbar-area,
+.ui-icon-ctrlbar-artist,
+.ui-icon-ctrlbar-attach,
+.ui-icon-ctrlbar-back,
+.ui-icon-ctrlbar-backward,
+.ui-icon-ctrlbar-bluetooth_preview,
+.ui-icon-ctrlbar-bookmarks,
+.ui-icon-ctrlbar-brightness,
+.ui-icon-ctrlbar-calendar,
+.ui-icon-ctrlbar-call,
+.ui-icon-ctrlbar-camera,
+.ui-icon-ctrlbar-category,
+.ui-icon-ctrlbar-change_group,
+.ui-icon-ctrlbar-chat,
+.ui-icon-ctrlbar-check,
+.ui-icon-ctrlbar-compose,
+.ui-icon-ctrlbar-composer,
+.ui-icon-ctrlbar-contacts,
+.ui-icon-ctrlbar-copy,
+.ui-icon-ctrlbar-create,
+.ui-icon-ctrlbar-create_folder,
+.ui-icon-ctrlbar-delete,
+.ui-icon-ctrlbar-dialer,
+.ui-icon-ctrlbar-DM,
+.ui-icon-ctrlbar-edit,
+.ui-icon-ctrlbar-editor,
+.ui-icon-ctrlbar-eng_eng_result,
+.ui-icon-ctrlbar-exchangs_register,
+.ui-icon-ctrlbar-Externalstorage,
+.ui-icon-ctrlbar-favorite,
+.ui-icon-ctrlbar-features,
+.ui-icon-ctrlbar-forward,
+.ui-icon-ctrlbar-genre,
+.ui-icon-ctrlbar-help,
+.ui-icon-ctrlbar-home,
+.ui-icon-ctrlbar-info,
+.ui-icon-ctrlbar-length,
+.ui-icon-ctrlbar-list_by,
+.ui-icon-ctrlbar-logs,
+.ui-icon-ctrlbar-map,
+.ui-icon-ctrlbar-memolist,
+.ui-icon-ctrlbar-MemoryCard,
+.ui-icon-ctrlbar-mention,
+.ui-icon-ctrlbar-menu,
+.ui-icon-ctrlbar-more,
+.ui-icon-ctrlbar-move,
+.ui-icon-ctrlbar-multiview,
+.ui-icon-ctrlbar-multiview_02,
+.ui-icon-ctrlbar-multiview_03,
+.ui-icon-ctrlbar-multiview_04,
+.ui-icon-ctrlbar-multiview_05,
+.ui-icon-ctrlbar-multiview_06,
+.ui-icon-ctrlbar-multiview_07,
+.ui-icon-ctrlbar-multiview_08,
+.ui-icon-ctrlbar-multiview_09,
+.ui-icon-ctrlbar-music_albums,
+.ui-icon-ctrlbar-pause,
+.ui-icon-ctrlbar-phone,
+.ui-icon-ctrlbar-Play,
+.ui-icon-ctrlbar-playlists,
+.ui-icon-ctrlbar-receive,
+.ui-icon-ctrlbar-reply,
+.ui-icon-ctrlbar-save,
+.ui-icon-ctrlbar-save_to_calender,
+.ui-icon-ctrlbar-scrap,
+.ui-icon-ctrlbar-search,
+.ui-icon-ctrlbar-send,
+.ui-icon-ctrlbar-set_as,
+.ui-icon-ctrlbar-settings,
+.ui-icon-ctrlbar-setup_wizard_previous,
+.ui-icon-ctrlbar-share,
+.ui-icon-ctrlbar-songs,
+.ui-icon-ctrlbar-stop_watch,
+.ui-icon-ctrlbar-store,
+.ui-icon-ctrlbar-synchronise_start_sync,
+.ui-icon-ctrlbar-synchronise_stop_01,
+.ui-icon-ctrlbar-synchronise_stop_02,
+.ui-icon-ctrlbar-synchronise_stop_03,
+.ui-icon-ctrlbar-view_result,
+.ui-icon-ctrlbar-tag,
+.ui-icon-ctrlbar-temp,
+.ui-icon-ctrlbar-timeline,
+.ui-icon-ctrlbar-timer,
+.ui-icon-ctrlbar-today,
+.ui-icon-ctrlbar-top,
+.ui-icon-ctrlbar-trim,
+.ui-icon-ctrlbar-TTS,
+.ui-icon-ctrlbar-update,
+.ui-icon-ctrlbar-upload_export,
+.ui-icon-ctrlbar-volume,
+.ui-icon-ctrlbar-world_clock,
+.ui-icon-ctrlbar-year,
+.ui-icon-ctrlbar-add_tag,
+.ui-icon-ctrlbar-add_to_contact,
+.ui-icon-ctrlbar-close,
+.ui-icon-ctrlbar-groups,
+.ui-icon-ctrlbar-year,
+.ui-icon-ctrlbar-unread_message,
+.ui-icon-ctrlbar-weight.ui-icon-ctrlbar-3Dview {
+  background-color: transparent;
+  -moz-border-radius: 0px;
+  -webkit-border-radius: 0px;
+  border-radius: 0px;
+  background-size: 100% 100%;
+  -moz-box-shadow: 0px 0px 0 rgba(255, 255, 255, 0.4);
+  -webkit-box-shadow: 0px 0px 0 rgba(255, 255, 255, 0.4);
+  box-shadow: 0px 0px 0 rgba(255, 255, 255, 0.4);
+}
+.ui-icon-ctrlbar-account_sign-up {
+  background-image: url(images/controlbar/01_controlbar_icon_account_sign-up.png);
+}
+.ui-icon-ctrlbar-accounts {
+  background-image: url(images/controlbar/01_controlbar_icon_accounts.png);
+}
+.ui-icon-ctrlbar-add-to-bookmarks {
+  background-image: url(images/controlbar/01_controlbar_icon_add-to-bookmarks.png);
+}
+.ui-icon-ctrlbar-add-to-calendar {
+  background-image: url(images/controlbar/01_controlbar_icon_add-to-calendar.png);
+}
+.ui-icon-ctrlbar-alarm {
+  background-image: url(images/controlbar/01_controlbar_icon_alarm.png);
+}
+.ui-icon-ctrlbar-albums {
+  background-image: url(images/controlbar/01_controlbar_icon_albums.png);
+}
+.ui-icon-ctrlbar-area {
+  background-image: url(images/controlbar/01_controlbar_icon_area.png);
+}
+.ui-icon-ctrlbar-artist {
+  background-image: url(images/controlbar/01_controlbar_icon_artist.png);
+}
+.ui-icon-ctrlbar-attach {
+  background-image: url(images/controlbar/01_controlbar_icon_attach.png);
+}
+.ui-icon-ctrlbar-back {
+  background-image: url(images/controlbar/01_controlbar_icon_back.png);
+}
+.ui-icon-ctrlbar-backward {
+  background-image: url(images/controlbar/01_controlbar_icon_backward.png);
+}
+.ui-icon-ctrlbar-bluetooth_preview {
+  background-image: url(images/controlbar/01_controlbar_icon_bluetooth_preview.png);
+}
+.ui-icon-ctrlbar-bookmarks {
+  background-image: url(images/controlbar/01_controlbar_icon_bookmarks.png);
+}
+.ui-icon-ctrlbar-brightness {
+  background-image: url(images/controlbar/01_controlbar_icon_brightness.png);
+}
+.ui-icon-ctrlbar-calendar {
+  background-image: url(images/controlbar/01_controlbar_icon_calendar.png);
+}
+.ui-icon-ctrlbar-call {
+  background-image: url(images/controlbar/01_controlbar_icon_call.png);
+}
+.ui-icon-ctrlbar-camera {
+  background-image: url(images/controlbar/01_controlbar_icon_camera.png);
+}
+.ui-icon-ctrlbar-category {
+  background-image: url(images/controlbar/01_controlbar_icon_category.png);
+}
+.ui-icon-ctrlbar-change_group {
+  background-image: url(images/controlbar/01_controlbar_icon_change_group.png);
+}
+.ui-icon-ctrlbar-chat {
+  background-image: url(images/controlbar/01_controlbar_icon_chat.png);
+}
+.ui-icon-ctrlbar-check {
+  background-image: url(images/controlbar/01_controlbar_icon_check.png);
+}
+.ui-icon-ctrlbar-compose {
+  background-image: url(images/controlbar/01_controlbar_icon_compose.png);
+}
+.ui-icon-ctrlbar-composer {
+  background-image: url(images/controlbar/01_controlbar_icon_composer.png);
+}
+.ui-icon-ctrlbar-contacts {
+  background-image: url(images/controlbar/01_controlbar_icon_contacts.png);
+}
+.ui-icon-ctrlbar-copy {
+  background-image: url(images/controlbar/01_controlbar_icon_copy.png);
+}
+.ui-icon-ctrlbar-create {
+  background-image: url(images/controlbar/01_controlbar_icon_create.png);
+}
+.ui-icon-ctrlbar-create_folder {
+  background-image: url(images/controlbar/01_controlbar_icon_create_folder.png);
+}
+.ui-icon-ctrlbar-delete {
+  background-image: url(images/controlbar/01_controlbar_icon_delete.png);
+}
+.ui-icon-ctrlbar-dialer {
+  background-image: url(images/controlbar/01_controlbar_icon_dialer.png);
+}
+.ui-icon-ctrlbar-DM {
+  background-image: url(images/controlbar/01_controlbar_icon_DM.png);
+}
+.ui-icon-ctrlbar-edit {
+  background-image: url(images/controlbar/01_controlbar_icon_edit.png);
+}
+.ui-icon-ctrlbar-editor {
+  background-image: url(images/controlbar/01_controlbar_icon_editor.png);
+}
+.ui-icon-ctrlbar-eng_eng_result {
+  background-image: url(images/controlbar/01_controlbar_icon_eng_eng_result.png);
+}
+.ui-icon-ctrlbar-exchangs_register {
+  background-image: url(images/controlbar/01_controlbar_icon_exchangs_register.png);
+}
+.ui-icon-ctrlbar-Externalstorage {
+  background-image: url(images/controlbar/01_controlbar_icon_Externalstorage.png);
+}
+.ui-icon-ctrlbar-favorite {
+  background-image: url(images/controlbar/01_controlbar_icon_favorite.png);
+}
+.ui-icon-ctrlbar-features {
+  background-image: url(images/controlbar/01_controlbar_icon_features.png);
+}
+.ui-icon-ctrlbar-forward {
+  background-image: url(images/controlbar/01_controlbar_icon_forward.png);
+}
+.ui-icon-ctrlbar-genre {
+  background-image: url(images/controlbar/01_controlbar_icon_genre.png);
+}
+.ui-icon-ctrlbar-help {
+  background-image: url(images/controlbar/01_controlbar_icon_help.png);
+}
+.ui-icon-ctrlbar-home {
+  background-image: url(images/controlbar/01_controlbar_icon_home.png);
+}
+.ui-icon-ctrlbar-info {
+  background-image: url(images/controlbar/01_controlbar_icon_info.png);
+}
+.ui-icon-ctrlbar-length {
+  background-image: url(images/controlbar/01_controlbar_icon_length.png);
+}
+.ui-icon-ctrlbar-list_by {
+  background-image: url(images/controlbar/01_controlbar_icon_list_by.png);
+}
+.ui-icon-ctrlbar-logs {
+  background-image: url(images/controlbar/01_controlbar_icon_logs.png);
+}
+.ui-icon-ctrlbar-map {
+  background-image: url(images/controlbar/01_controlbar_icon_map.png);
+}
+.ui-icon-ctrlbar-memolist {
+  background-image: url(images/controlbar/01_controlbar_icon_memolist.png);
+}
+.ui-icon-ctrlbar-MemoryCard {
+  background-image: url(images/controlbar/01_controlbar_icon_MemoryCard.png);
+}
+.ui-icon-ctrlbar-mention {
+  background-image: url(images/controlbar/01_controlbar_icon_mention.png);
+}
+.ui-icon-ctrlbar-menu {
+  background-image: url(images/controlbar/01_controlbar_icon_menu.png);
+}
+.ui-icon-ctrlbar-more {
+  background-image: url(images/controlbar/01_controlbar_icon_more.png);
+}
+.ui-icon-ctrlbar-move {
+  background-image: url(images/controlbar/01_controlbar_icon_move.png);
+}
+.ui-icon-ctrlbar-multiview {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview.png);
+}
+.ui-icon-ctrlbar-multiview_02 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_02.png);
+}
+.ui-icon-ctrlbar-multiview_03 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_03.png);
+}
+.ui-icon-ctrlbar-multiview_04 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_04.png);
+}
+.ui-icon-ctrlbar-multiview_05 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_05.png);
+}
+.ui-icon-ctrlbar-multiview_06 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_06.png);
+}
+.ui-icon-ctrlbar-multiview_07 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_07.png);
+}
+.ui-icon-ctrlbar-multiview_08 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_08.png);
+}
+.ui-icon-ctrlbar-multiview_09 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_09.png);
+}
+.ui-icon-ctrlbar-music_albums {
+  background-image: url(images/controlbar/01_controlbar_icon_music_albums.png);
+}
+.ui-icon-ctrlbar-pause {
+  background-image: url(images/controlbar/01_controlbar_icon_pause.png);
+}
+.ui-icon-ctrlbar-phone {
+  background-image: url(images/controlbar/01_controlbar_icon_phone.png);
+}
+.ui-icon-ctrlbar-Play {
+  background-image: url(images/controlbar/01_controlbar_icon_Play.png);
+}
+.ui-icon-ctrlbar-playlists {
+  background-image: url(images/controlbar/01_controlbar_icon_playlists.png);
+}
+.ui-icon-ctrlbar-receive {
+  background-image: url(images/controlbar/01_controlbar_icon_receive.png);
+}
+.ui-icon-ctrlbar-reply {
+  background-image: url(images/controlbar/01_controlbar_icon_reply.png);
+}
+.ui-icon-ctrlbar-save {
+  background-image: url(images/controlbar/01_controlbar_icon_save.png);
+}
+.ui-icon-ctrlbar-save_to_calender {
+  background-image: url(images/controlbar/01_controlbar_icon_save_to_calender.png);
+}
+.ui-icon-ctrlbar-scrap {
+  background-image: url(images/controlbar/01_controlbar_icon_scrap.png);
+}
+.ui-icon-ctrlbar-search {
+  background-image: url(images/controlbar/01_controlbar_icon_search.png);
+}
+.ui-icon-ctrlbar-send {
+  background-image: url(images/controlbar/01_controlbar_icon_send.png);
+}
+.ui-icon-ctrlbar-set_as {
+  background-image: url(images/controlbar/01_controlbar_icon_set_as.png);
+}
+.ui-icon-ctrlbar-settings {
+  background-image: url(images/controlbar/01_controlbar_icon_settings.png);
+}
+.ui-icon-ctrlbar-setup_wizard_previous {
+  background-image: url(images/controlbar/01_controlbar_icon_setup_wizard_previous.png);
+}
+.ui-icon-ctrlbar-share {
+  background-image: url(images/controlbar/01_controlbar_icon_share.png);
+}
+.ui-icon-ctrlbar-songs {
+  background-image: url(images/controlbar/01_controlbar_icon_songs.png);
+}
+.ui-icon-ctrlbar-stop_watch {
+  background-image: url(images/controlbar/01_controlbar_icon_stop_watch.png);
+}
+.ui-icon-ctrlbar-store {
+  background-image: url(images/controlbar/01_controlbar_icon_store.png);
+}
+.ui-icon-ctrlbar-synchronise_start_sync {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_start_sync.png);
+}
+.ui-icon-ctrlbar-synchronise_stop_01 {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_stop_01.png);
+}
+.ui-icon-ctrlbar-synchronise_stop_02 {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_stop_02.png);
+}
+.ui-icon-ctrlbar-synchronise_stop_03 {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_stop_03.png);
+}
+.ui-icon-ctrlbar-synchronise_view_result {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_view_result.png);
+}
+.ui-icon-ctrlbar-tag {
+  background-image: url(images/controlbar/01_controlbar_icon_tag.png);
+}
+.ui-icon-ctrlbar-temp {
+  background-image: url(images/controlbar/01_controlbar_icon_temp.png);
+}
+.ui-icon-ctrlbar-timeline {
+  background-image: url(images/controlbar/01_controlbar_icon_timeline.png);
+}
+.ui-icon-ctrlbar-timer {
+  background-image: url(images/controlbar/01_controlbar_icon_timer.png);
+}
+.ui-icon-ctrlbar-today {
+  background-image: url(images/controlbar/01_controlbar_icon_today.png);
+}
+.ui-icon-ctrlbar-top {
+  background-image: url(images/controlbar/01_controlbar_icon_top.png);
+}
+.ui-icon-ctrlbar-trim {
+  background-image: url(images/controlbar/01_controlbar_icon_trim.png);
+}
+.ui-icon-ctrlbar-TTS {
+  background-image: url(images/controlbar/01_controlbar_icon_TTS.png);
+}
+.ui-icon-ctrlbar-update {
+  background-image: url(images/controlbar/01_controlbar_icon_update.png);
+}
+.ui-icon-ctrlbar-upload_export {
+  background-image: url(images/controlbar/01_controlbar_icon_upload_export.png);
+}
+.ui-icon-ctrlbar-volume {
+  background-image: url(images/controlbar/01_controlbar_icon_volume.png);
+}
+.ui-icon-ctrlbar-world_clock {
+  background-image: url(images/controlbar/01_controlbar_icon_world_clock.png);
+}
+.ui-icon-ctrlbar-year {
+  background-image: url(images/controlbar/01_controlbar_icon_year.png);
+}
+.ui-icon-ctrlbar-add_tag {
+  background-image: url(images/controlbar/01_controlbar_icon_add_tag.png);
+}
+.ui-icon-ctrlbar-add_to_contact {
+  background-image: url(images/controlbar/01_controlbar_icon_add_to_contact.png);
+}
+.ui-icon-ctrlbar-close {
+  background-image: url(images/controlbar/01_controlbar_icon_close.png);
+}
+.ui-icon-ctrlbar-groups {
+  background-image: url(images/controlbar/01_controlbar_icon_groups.png);
+}
+.ui-icon-ctrlbar-unread_message {
+  background-image: url(images/controlbar/01_controlbar_icon_unread_message.png);
+}
+.ui-icon-ctrlbar-weight {
+  background-image: url(images/controlbar/01_controlbar_icon_weight.png);
+}
+.ui-icon-ctrlbar-3Dview {
+  background-image: url(images/controlbar/01_controlbar_icon_3Dview.png);
+}
+/* ---------------------------------------------- */
+/* Button corner classes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-btn-corner-tl {
+  -moz-border-radius-topleft: 1em;
+  -webkit-border-top-left-radius: 1em;
+  border-top-left-radius: 1em;
+}
+.ui-btn-corner-tr {
+  -moz-border-radius-topright: 1em;
+  -webkit-border-top-right-radius: 1em;
+  border-top-right-radius: 1em;
+}
+.ui-btn-corner-bl {
+  -moz-border-radius-bottomleft: 1em;
+  -webkit-border-bottom-left-radius: 1em;
+  border-bottom-left-radius: 1em;
+}
+.ui-btn-corner-br {
+  -moz-border-radius-bottomright: 1em;
+  -webkit-border-bottom-right-radius: 1em;
+  border-bottom-right-radius: 1em;
+}
+.ui-btn-corner-top {
+  -moz-border-radius-topleft: 1em;
+  -webkit-border-top-left-radius: 1em;
+  border-top-left-radius: 1em;
+  -moz-border-radius-topright: 1em;
+  -webkit-border-top-right-radius: 1em;
+  border-top-right-radius: 1em;
+}
+.ui-btn-corner-bottom {
+  -moz-border-radius-bottomleft: 1em;
+  -webkit-border-bottom-left-radius: 1em;
+  border-bottom-left-radius: 1em;
+  -moz-border-radius-bottomright: 1em;
+  -webkit-border-bottom-right-radius: 1em;
+  border-bottom-right-radius: 1em;
+}
+.ui-btn-corner-right {
+  -moz-border-radius-topright: 1em;
+  -webkit-border-top-right-radius: 1em;
+  border-top-right-radius: 1em;
+  -moz-border-radius-bottomright: 1em;
+  -webkit-border-bottom-right-radius: 1em;
+  border-bottom-right-radius: 1em;
+}
+.ui-btn-corner-left {
+  -moz-border-radius-topleft: 1em;
+  -webkit-border-top-left-radius: 1em;
+  border-top-left-radius: 1em;
+  -moz-border-radius-bottomleft: 1em;
+  -webkit-border-bottom-left-radius: 1em;
+  border-bottom-left-radius: 1em;
+}
+.ui-btn-corner-all {
+  -moz-border-radius: 0.2em;
+  -webkit-border-radius: 0.2em;
+  bordert-radius: 0.2em;
+}
+/* radius clip workaround for cleaning up corner trapping */
+.ui-corner-tl,
+.ui-corner-tr,
+.ui-corner-bl,
+.ui-corner-br,
+.ui-corner-top,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-left,
+.ui-corner-all,
+.ui-btn-corner-tl,
+.ui-btn-corner-tr,
+.ui-btn-corner-bl,
+.ui-btn-corner-br,
+.ui-btn-corner-top,
+.ui-btn-corner-bottom,
+.ui-btn-corner-right,
+.ui-btn-corner-left,
+.ui-btn-corner-all {
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+}
+/* Overlay / modal
+-----------------------------------------------------------------------------------------------------------*/
+.ui-overlay {
+  background: #666;
+  opacity: .5;
+  filter: alpha(opacity=50);
+  position: absolute;
+  width: 100%;
+  height: 100%;
+}
+/* Focus state - set here for specificity
+-----------------------------------------------------------------------------------------------------------*/
+.ui-focus {
+  /* global-active-background-color */
+
+  outline-color: #008cd2;
+}
+/* unset box shadow in browsers that don't do it right
+-----------------------------------------------------------------------------------------------------------*/
+.ui-mobile-nosupport-boxshadow * {
+  -moz-box-shadow: none !important;
+  -webkit-box-shadow: none !important;
+  box-shadow: none !important;
+}
+/* ...and bring back focus */
+.ui-mobile-nosupport-boxshadow .ui-focus {
+  outline-width: 2px;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+/*** less definitions ***/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/************************/
+/* some unsets - more probably needed */
+.ui-mobile, .ui-mobile body {
+  height: 100%;
+  font-size: 36px;
+}
+.ui-mobile fieldset, .ui-page {
+  padding: 0;
+  margin: 0;
+}
+.ui-mobile a img, .ui-mobile fieldset {
+  border: 0;
+}
+/* responsive page widths */
+.ui-mobile-viewport {
+  margin: 0;
+  overflow-x: hidden;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+/* "page" containers - full-screen views, one should always be in view post-pageload */
+.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page {
+  top: 0;
+  left: 0;
+  width: 100%;
+  min-height: 100%;
+  position: absolute;
+  display: none;
+  border: 0;
+}
+.ui-mobile .ui-page-active {
+  display: block;
+  overflow: visible;
+}
+/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */
+.ui-page {
+  outline: none;
+}
+/*orientations from js are available */
+@media screen and (orientation: portrait) {
+  .ui-mobile, .ui-mobile .ui-page {
+    min-height: 420px;
+    background: black;
+  }
+}
+@media screen and (orientation: landscape) {
+  .ui-mobile, .ui-mobile .ui-page {
+    min-height: 300px;
+    background: black;
+  }
+}
+/* native overflow scrolling */
+.ui-page.ui-mobile-touch-overflow, .ui-mobile-touch-overflow.ui-native-fixed .ui-content {
+  overflow: auto;
+  height: 100%;
+  -webkit-overflow-scrolling: touch;
+  -moz-overflow-scrolling: touch;
+  -o-overflow-scrolling: touch;
+  -ms-overflow-scrolling: touch;
+  overflow-scrolling: touch;
+}
+.ui-page.ui-mobile-touch-overflow, .ui-page.ui-mobile-touch-overflow * {
+  /* some level of transform keeps elements from blinking out of visibility on iOS */
+
+  -webkit-transform: rotatey(0);
+}
+.ui-page.ui-mobile-pre-transition {
+  display: block;
+}
+/* loading screen */
+.ui-loading .ui-mobile-viewport {
+  overflow: hidden !important;
+}
+.ui-loading .ui-loader {
+  display: block;
+}
+.ui-loading .ui-page {
+  overflow: hidden;
+}
+.ui-loader {
+  display: none;
+  position: absolute;
+  opacity: .85;
+  z-index: 100;
+  left: 50%;
+  width: 200px;
+  margin-left: -130px;
+  margin-top: -35px;
+  padding: 10px 30px;
+}
+.ui-loader h1 {
+  font-size: 0.8888888888888888rem;
+  text-align: center;
+}
+.ui-loader .ui-icon {
+  position: static;
+  display: block;
+  opacity: .9;
+  margin: 0 auto;
+  width: 35px;
+  height: 35px;
+  background-color: transparent;
+}
+/*fouc*/
+.ui-mobile-rendering > * {
+  visibility: hidden;
+}
+/*headers, content panels*/
+.ui-bar, .ui-body {
+  position: relative;
+  padding: .4em 15px;
+  overflow: hidden;
+  display: block;
+  clear: both;
+}
+.ui-bar {
+  font-size: 16px;
+  margin: 0;
+}
+.ui-bar h1,
+.ui-bar h2,
+.ui-bar h3,
+.ui-bar h4,
+.ui-bar h5,
+.ui-bar h6 {
+  margin: 0;
+  padding: 0;
+  font-size: 16px;
+  display: inline-block;
+}
+.ui-header, .ui-footer {
+  display: block;
+}
+.ui-page .ui-header, .ui-page .ui-footer {
+  position: fixed;
+  /*position: relative;*/
+  z-index: 1000;
+}
+/* Option header reposition : Jinhyuk */
+.ui-header .ui-btn-left {
+  position: absolute;
+  left: 10px;
+  top: .4em;
+}
+.ui-header .ui-btn-right {
+  position: absolute;
+  right: 10px;
+  top: .4em;
+}
+.ui-header .ui-title, .ui-footer .ui-title {
+  min-height: 1.1em;
+  text-align: center;
+  font-size: 16px;
+  display: block;
+  margin: .6em 90px .8em;
+  padding: 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  outline: 0 !important;
+}
+/*content area*/
+.ui-content {
+  border-width: 0;
+  overflow: visible;
+  overflow-x: hidden;
+  padding: 15px;
+}
+.ui-page-fullscreen .ui-content {
+  padding: 0;
+}
+/* native fixed headers and footers */
+.ui-mobile-touch-overflow.ui-page.ui-native-fixed, .ui-mobile-touch-overflow.ui-page.ui-native-fullscreen {
+  overflow: visible;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-header, .ui-mobile-touch-overflow.ui-native-fixed .ui-footer {
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  z-index: 200;
+}
+.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer {
+  top: auto;
+  bottom: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content {
+  padding-top: 2.5em;
+  padding-bottom: 3em;
+  top: 0;
+  bottom: 0;
+  height: auto;
+  position: absolute;
+}
+.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content {
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header, .ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer {
+  opacity: .9;
+}
+.ui-native-bars-hidden {
+  display: none;
+}
+/* icons sizing */
+.ui-icon {
+  width: 18px;
+  height: 18px;
+}
+/* fullscreen class on ui-content div */
+.ui-fullscreen img {
+  max-width: 100%;
+}
+/* non-js content hiding */
+.ui-nojs {
+  position: absolute;
+  left: -9999px;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.spin  {
+	-webkit-transform: rotate(360deg);
+	-webkit-animation-name: spin;
+	-webkit-animation-duration: 1s;
+	-webkit-animation-iteration-count:  infinite;
+	-webkit-animation-timing-function: linear;
+}
+@-webkit-keyframes spin {
+	from {-webkit-transform: rotate(0deg);}
+  	to {-webkit-transform: rotate(360deg);}
+}
+
+/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/
+Built by David Kaneda and maintained by Jonathan Stark.
+*/
+.in, .out {
+	-webkit-animation-timing-function: ease-in-out;
+	-webkit-animation-duration: 350ms;
+}
+
+
+.slide.out {
+	-webkit-transform: translateX(-100%);
+	-webkit-animation-name: slideouttoleft;
+}
+
+.slide.in {
+	-webkit-transform: translateX(0);
+	-webkit-animation-name: slideinfromright;
+}
+
+.slide.out.reverse {
+	-webkit-transform: translateX(100%);
+	-webkit-animation-name: slideouttoright;
+}
+
+.slide.in.reverse {
+	-webkit-transform: translateX(0);
+	-webkit-animation-name: slideinfromleft;
+}
+
+.slideup.out {
+	-webkit-animation-name: dontmove;
+	z-index: 0;
+}
+
+.slideup.in {
+	-webkit-transform: translateY(0);
+	-webkit-animation-name: slideinfrombottom;
+	z-index: 10;
+}
+
+.slideup.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.slideup.out.reverse {
+	-webkit-transform: translateY(100%);
+	z-index: 10;
+	-webkit-animation-name: slideouttobottom;
+}
+
+.slidedown.out {
+	-webkit-animation-name: dontmove;
+	z-index: 0;
+}
+
+.slidedown.in {
+	-webkit-transform: translateY(0);
+	-webkit-animation-name: slideinfromtop;
+	z-index: 10;
+}
+
+.slidedown.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.slidedown.out.reverse {
+	-webkit-transform: translateY(-100%);
+	z-index: 10;
+	-webkit-animation-name: slideouttotop;
+}
+
+@-webkit-keyframes slideinfromright {
+    from { -webkit-transform: translateX(100%); }
+    to { -webkit-transform: translateX(0); }
+}
+
+@-webkit-keyframes slideinfromleft {
+    from { -webkit-transform: translateX(-100%); }
+    to { -webkit-transform: translateX(0); }
+}
+
+@-webkit-keyframes slideouttoleft {
+    from { -webkit-transform: translateX(0); }
+    to { -webkit-transform: translateX(-100%); }
+}
+
+@-webkit-keyframes slideouttoright {
+    from { -webkit-transform: translateX(0); }
+    to { -webkit-transform: translateX(100%); }
+}
+
+@-webkit-keyframes slideinfromtop {
+    from { -webkit-transform: translateY(-100%); }
+    to { -webkit-transform: translateY(0); }
+}
+
+@-webkit-keyframes slideinfrombottom {
+    from { -webkit-transform: translateY(100%); }
+    to { -webkit-transform: translateY(0); }
+}
+
+@-webkit-keyframes slideouttobottom {
+    from { -webkit-transform: translateY(0); }
+    to { -webkit-transform: translateY(100%); }
+}
+
+@-webkit-keyframes slideouttotop {
+    from { -webkit-transform: translateY(0); }
+    to { -webkit-transform: translateY(-100%); }
+}
+@-webkit-keyframes fadein {
+    from { opacity: 0; }
+    to { opacity: 1; }
+}
+
+@-webkit-keyframes fadeout {
+    from { opacity: 1; }
+    to { opacity: 0; }
+}
+
+.fade.out {
+	z-index: 0;
+	-webkit-animation-name: fadeout;
+}
+
+.fade.in {
+	opacity: 1;
+	z-index: 10;
+	-webkit-animation-name: fadein;
+}
+
+/* The properties in this rule are only necessary for the 'flip' transition.
+ * We need specify the perspective to create a projection matrix. This will add
+ * some depth as the element flips. The depth number represents the distance of
+ * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate
+ * value.
+ */
+.viewport-flip {
+	-webkit-perspective: 1000;
+	position: absolute;
+}
+
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+}
+
+.flip {
+	-webkit-animation-duration: .65s;
+	-webkit-backface-visibility:hidden;
+	-webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+}
+
+.flip.out {
+	-webkit-transform: rotateY(-180deg) scale(.8);
+	-webkit-animation-name: flipouttoleft;
+}
+
+.flip.in {
+	-webkit-transform: rotateY(0) scale(1);
+	-webkit-animation-name: flipinfromleft;
+}
+
+/* Shake it all about */
+
+.flip.out.reverse {
+	-webkit-transform: rotateY(180deg) scale(.8);
+	-webkit-animation-name: flipouttoright;
+}
+
+.flip.in.reverse {
+	-webkit-transform: rotateY(0) scale(1);
+	-webkit-animation-name: flipinfromright;
+}
+
+@-webkit-keyframes flipinfromright {
+    from { -webkit-transform: rotateY(-180deg) scale(.8); }
+    to { -webkit-transform: rotateY(0) scale(1); }
+}
+
+@-webkit-keyframes flipinfromleft {
+    from { -webkit-transform: rotateY(180deg) scale(.8); }
+    to { -webkit-transform: rotateY(0) scale(1); }
+}
+
+@-webkit-keyframes flipouttoleft {
+    from { -webkit-transform: rotateY(0) scale(1); }
+    to { -webkit-transform: rotateY(-180deg) scale(.8); }
+}
+
+@-webkit-keyframes flipouttoright {
+    from { -webkit-transform: rotateY(0) scale(1); }
+    to { -webkit-transform: rotateY(180deg) scale(.8); }
+}
+
+
+/* Hackish, but reliable. */
+
+@-webkit-keyframes dontmove {
+    from { opacity: 1; }
+    to { opacity: 1; }
+}
+
+.pop {
+	-webkit-transform-origin: 50% 50%;
+}
+
+.pop.in {
+	-webkit-transform: scale(1);
+    opacity: 1;
+	-webkit-animation-name: popin;
+	z-index: 10;
+}
+
+.pop.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.pop.out.reverse {
+	-webkit-transform: scale(.2);
+	opacity: 0;
+	-webkit-animation-name: popout;
+	z-index: 10;
+}
+
+@-webkit-keyframes popin {
+    from {
+        -webkit-transform: scale(.2);
+        opacity: 0;
+    }
+    to {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes popout {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(.2);
+        opacity: 0;
+    }
+}/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* content configurations. */
+.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; }
+.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;}
+
+/* grid solo: 100 - single item fallback */
+.ui-grid-solo .ui-block-a { width: 100%; float: none; }
+
+/* grid a: 50/50 */
+.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; }
+.ui-grid-a .ui-block-a { clear: left; }
+
+/* grid b: 33/33/33 */
+.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; }
+.ui-grid-b .ui-block-a { clear: left; }
+
+/* grid c: 25/25/25/25 */
+.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; }
+.ui-grid-c .ui-block-a { clear: left; }
+
+/* grid d: 20/20/20/20/20 */
+.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; }
+.ui-grid-d .ui-block-a { clear: left; }
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/* fixed page header & footer configuration */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-header,
+.ui-footer,
+.ui-page-fullscreen .ui-header,
+.ui-page-fullscreen .ui-footer {
+  position: absolute;
+  overflow: hidden;
+  width: 100%;
+  border-left-width: 0;
+  border-right-width: 0;
+}
+.ui-header-fixed, .ui-footer-fixed {
+  z-index: 1000;
+  -webkit-transform: translatez(0);
+  /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */
+
+}
+.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline {
+  display: none;
+}
+.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer {
+  opacity: .9;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.ui-navbar { overflow: hidden;  }
+.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;}
+.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; }
+.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; }
+.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; }
+.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; }
+.ui-navbar li .ui-btn {  margin-right: -1px; }
+.ui-navbar li .ui-btn:last-child { margin-right: 0; }
+.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn,
+.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; }
+.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; }
+.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; }
+/*expanded page styles*/
+.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; }
+.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px;  }
+.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; }
+.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; }
+.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; }
+.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; }
+.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; }
+.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; }
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* Button colors are defined in config.less
+
+/* Edit button size */
+.ui-btn {
+  display: block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  /*margin: .5em 5px;*/
+  padding: 0;
+  vertical-align: middle;
+}
+/* wongi_1018 : For button align. */
+.ui-btn:focus, .ui-btn:active {
+  outline: none;
+}
+.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn {
+  display: inline-block;
+  font-size: 0.3611111111111111rem;
+  margin: 0;
+}
+.ui-btn-inline {
+  display: inline-block;
+}
+.ui-btn-inner {
+  padding: 0.6em 0.6944444444444444rem;
+  display: block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  zoom: 1;
+}
+.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner {
+  padding: 0.7em 0.2222222222222222rem 0.7em;
+}
+/* wongi_1024 : Button text middle align */
+.ui-header .ui-btn-inner.ui-btn-icon-only, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner.ui-btn-icon-only {
+  padding: 0.4em 0.2222222222222222rem 0.5em;
+}
+/* wongi_1024 : Button text middle align */
+.ui-btn-icon-notext {
+  width: 0.6666666666666666rem;
+  height: 0.6666666666666666rem;
+}
+.ui-btn-icon-notext .ui-btn-inner {
+  padding: 0.05555555555555555rem 0.027777777777777776rem 0.05555555555555555rem 0.08333333333333333rem;
+}
+.ui-btn-icon-notext .ui-btn-text {
+  position: absolute;
+  left: -27.75rem;
+}
+.ui-btn-icon-left .ui-btn-inner {
+  padding-left: 0.9166666666666666rem;
+}
+.ui-header .ui-btn-icon-left .ui-btn-inner, .ui-footer .ui-btn-icon-left .ui-btn-inner, .ui-bar .ui-btn-icon-left .ui-btn-inner {
+  padding-left: 0.75rem;
+}
+.ui-btn-icon-right .ui-btn-inner {
+  padding-right: 0.9166666666666666rem;
+}
+.ui-header .ui-btn-icon-right .ui-btn-inner, .ui-footer .ui-btn-icon-right .ui-btn-inner, .ui-bar .ui-btn-icon-right .ui-btn-inner {
+  padding-right: 0.75rem;
+}
+.ui-btn-icon-top .ui-btn-inner {
+  padding-top: 0.9166666666666666rem;
+}
+.ui-header .ui-btn-icon-top .ui-btn-inner, .ui-footer .ui-btn-icon-top .ui-btn-inner, .ui-bar .ui-btn-icon-top .ui-btn-inner {
+  padding-top: 0.75rem;
+}
+.ui-btn-icon-bottom .ui-btn-inner {
+  padding-bottom: 0.9166666666666666rem;
+}
+.ui-header .ui-btn-icon-bottom .ui-btn-inner, .ui-footer .ui-btn-icon-bottom .ui-btn-inner, .ui-bar .ui-btn-icon-bottom .ui-btn-inner {
+  padding-bottom: 0.75rem;
+}
+/*btn icon positioning*/
+.ui-btn-icon-notext .ui-icon {
+  display: block;
+}
+.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon, .ui-btn-icon-circle .ui-icon {
+  position: absolute;
+  /*top: 50%; margin-top: -9px;*/
+}
+/* wongi_1018 : do not use. No more use 18px default icons. */
+.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon {
+  position: absolute;
+  left: 50%;
+  margin-left: -9px;
+}
+.ui-btn-icon-left .ui-icon {
+  left: /*10px;*/ 0rem;
+}
+/* wongi_1018 : with 64px icon, left 10 -> 0 for good looking. */
+.ui-btn-icon-circle .ui-icon {
+  left: 0rem;
+}
+/* wongi_1018 : for circle icon center positioning. */
+.ui-btn-icon-right .ui-icon {
+  right: 0.2777777777777778rem;
+}
+.ui-btn-icon-top .ui-icon {
+  top: 0.2777777777777778rem;
+}
+.ui-btn-icon-bottom .ui-icon {
+  bottom: 0.2777777777777778rem;
+}
+.ui-header .ui-btn-icon-left .ui-icon, .ui-footer .ui-btn-icon-left .ui-icon, .ui-bar .ui-btn-icon-left .ui-icon {
+  left: 0.6666666666666666rem;
+}
+/* SLP Default Footer : Jinhyuk */
+.ui-header .ui-btn-icon-right .ui-icon, .ui-footer .ui-btn-icon-right .ui-icon, .ui-bar .ui-btn-icon-right .ui-icon {
+  right: 0.1111111111111111rem;
+}
+.ui-header .ui-btn-icon-top .ui-icon, .ui-footer .ui-btn-icon-top .ui-icon, .ui-bar .ui-btn-icon-top .ui-icon {
+  top: 0.1111111111111111rem;
+}
+.ui-header .ui-btn-icon-bottom .ui-icon, .ui-footer .ui-btn-icon-bottom .ui-icon, .ui-bar .ui-btn-icon-bottom .ui-icon {
+  bottom: 0.1111111111111111rem;
+}
+/*hiding native button,inputs */
+.ui-btn-hidden {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  -webkit-appearance: button;
+  opacity: .1;
+  cursor: pointer;
+  background: transparent;
+  font-size: 0.027777777777777776rem;
+  border: none;
+  line-height: 27.75rem;
+}
+.ui-btn-text {
+  /*padding-left : 80px;*/
+  margin-left: auto;
+  margin-right: auto;
+}
+.ui-li .ui-btn.ui-btn-icon_only {
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+}
+.ui-li .ui-btn .ui-btn-inner.ui-btn-hastxt {
+  padding: 0.2em 0.5em;
+}
+/* wongi_1017 : Icons */
+/* icons sizing */
+.ui-btn .ui-icon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+.ui-btn.ui-btn-edit .ui-icon {
+  width: 2.0555555555555554rem;
+  height: 2.0555555555555554rem;
+}
+/* Padding for Icon with text */
+.ui-btn .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 0.8888888888888888rem;
+}
+.ui-btn .ui-btn-text.ui-btn-text-padding-right {
+  padding-right: 1.3333333333333333rem;
+}
+.tizen-icon-common {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+}
+.ui-icon-bg {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_btn_circle_bg_normal.png);
+  z-index: 0;
+}
+.ui-icon-reveal {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_reveal.png);
+}
+.ui-icon-reveal-left {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_reveal_left.png);
+}
+.ui-icon-closed {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_expand_closed.png);
+}
+.ui-icon-opened {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_expand_opened.png);
+}
+.ui-icon-info {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_info.png);
+}
+.ui-icon-rename {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_rename.png);
+}
+.ui-icon-call {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_call.png);
+}
+.ui-icon-warning {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_warning.png);
+}
+.ui-icon-plus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_plus_normal.png);
+}
+.ui-icon-minus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_minus_normal.png);
+}
+.ui-icon-cancel {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_cancel.png);
+}
+.ui-icon-send {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_send.png);
+}
+.ui-icon-favorite {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_winset_icon_favorite_on.png);
+}
+.ui-icon-editexpand {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_expand.png);
+  top: -1.0277777777777777rem;
+}
+.ui-icon-editminus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_minus.png);
+  top: -1.0277777777777777rem;
+}
+.ui-icon-editplus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_plus.png);
+  top: -1.0277777777777777rem;
+}
+/* Header back btn : Jinjyuk */
+.ui-btn-up-s .ui-icon-header-back-btn {
+  width: 1.5555555555555554rem;
+  height: 1.5555555555555554rem;
+  left: 0.6666666666666666rem;
+  top: 0.2777777777777778rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_winset_Back.png);
+}
+.ui-btn-down-s .ui-icon-header-back-btn, .ui-btn-hover-s .ui-icon-header-back-btn {
+  width: 1.5555555555555554rem;
+  height: 1.5555555555555554rem;
+  left: 0.6666666666666666rem;
+  top: 0.2777777777777778rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_winset_Back.png);
+}
+.ui-icon-header-back-btn {
+  -moz-background-size: 1.3333333333333333rem 1.0555555555555556rem;
+  -o-background-size: 1.3333333333333333rem 1.0555555555555556rem;
+  -webkit-background-size: 1.3333333333333333rem 1.0555555555555556rem;
+  background-size: 1.3333333333333333rem 1.0555555555555556rem;
+  width: 1.3333333333333333rem;
+  height: 1.0555555555555556rem;
+}
+/* Pressed images */
+.ui-btn-down-s .ui-icon-bg, .ui-btn-down-s.ui-tizen-icon-bg {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_btn_circle_bg_press.png);
+  z-index: 0;
+}
+.ui-btn-down-s .ui-icon-reveal {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_reveal_press.png);
+}
+.ui-btn-down-s .ui-icon-reveal-left {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_reveal_left_press.png);
+}
+.ui-btn-down-s .ui-icon-closed {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_expand_closed_press.png);
+}
+.ui-btn-down-s .ui-icon-opened {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_expand_opened_press.png);
+}
+.ui-btn-down-s .ui-icon-info {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_info_press.png);
+}
+.ui-btn-down-s .ui-icon-rename {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_rename_press.png);
+}
+.ui-btn-down-s .ui-icon-call {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_call_press.png);
+}
+.ui-btn-down-s .ui-icon-warning {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_warning_press.png);
+}
+.ui-btn-down-s .ui-icon-plus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_plus_press.png);
+}
+.ui-btn-down-s .ui-icon-minus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_minus_press.png);
+}
+.ui-btn-down-s .ui-icon-cancel {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_cancel_press.png);
+}
+.ui-btn-down-s .ui-icon-send {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_send_press.png);
+}
+.ui-btn-down-s .ui-icon-favorite {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_winset_icon_favorite_off.png);
+}
+.ui-btn-down-s .ui-icon-editexpand {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_expand_press.png);
+  top: -1.0277777777777777rem;
+}
+.ui-btn-down-s .ui-icon-editminus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_minus_press.png);
+  top: -1.0277777777777777rem;
+}
+.ui-btn-down-s .ui-icon-editplus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_plus_press.png);
+  top: -1.0277777777777777rem;
+}
+.ui-btn-inner.ui-btn-icon-only {
+  padding: 0.8888888888888888rem 0.8888888888888888rem;
+}
+.ui-btn-edit .ui-btn-inner.ui-btn-icon-only {
+  padding: 1.0277777777777777rem 1.0277777777777777rem;
+}
+/* Circle Icon BG : data-iconbg = "circle" */
+.ui-btn-corner-all.ui-btn-corner-circle {
+  -moz-border-radius: 1em;
+  -webkit-border-radius: 1em;
+  bordert-radius: 1em;
+}
+/* No BG button : data-iconbg = "nobg" */
+.ui-btn.ui-btn-icon-nobg, .ui-btn .ui-btn-icon-nobg {
+  background-color: transparent;
+  border: none;
+}
+/* Contact Edit Style */
+.ui-btn.ui-btn-edit .ui-btn-text {
+  color: #cf2929;
+}
+.ui-btn.ui-btn-edit.ui-btn-hover-s, .ui-btn.ui-btn-edit.ui-btn-up-s, .ui-btn.ui-btn-edit.ui-btn-down-s {
+  font-size: 0.6em;
+}
+.ui-btn.ui-btn-edit.ui-btn-down-s .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-btn.ui-btn-edit {
+  background-color: #3b3b3b;
+  position: absolute;
+  top: 0rem;
+  margin-top: 0rem;
+}
+.ui-btn.ui-btn-edit.ui-btn-down-s {
+  background-color: #008cd2;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.ui-collapsible { margin: .5em 0; }
+.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; }
+.ui-collapsible-heading a { text-align: left; margin: 0;  }
+.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; }
+.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; }
+.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 10px 0; }
+.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; }
+.ui-collapsible-heading-status { position:absolute; left:-9999px; }
+.ui-collapsible-content {
+	display: block;
+	margin:  0 -8px;
+	padding: 10px 16px;
+	border-top:  none;      /* Overrides ui-btn-up-* */
+	background-image: none; /* Overrides ui-btn-up-* */
+	font-weight: normal;    /* Overrides ui-btn-up-* */
+}
+.ui-collapsible-content-collapsed { display: none; }
+
+.ui-collapsible-set { margin: .5em 0; }
+.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; }
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-dialog {
+  min-height: 480px;
+}
+.ui-dialog .ui-header, .ui-dialog .ui-content, .ui-dialog .ui-footer {
+  margin: 15px;
+  position: relative;
+}
+.ui-dialog .ui-header, .ui-dialog .ui-footer {
+  z-index: 10;
+  width: auto;
+}
+.ui-dialog .ui-header .ui-btn-left {
+  width: 0px;
+  border-width: 0px;
+}
+.ui-dialog .center_info {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+}
+.ui-dialog .center_info .popup-text {
+  font-size: 42px;
+  background: #213c49;
+  width: 100%;
+}
+.ui-dialog .center_info .popup-text p {
+  text-align: center;
+  padding: 22px 16px;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner {
+  white-space: normal;
+}
+.ui-icon-radio-off {
+  background-color: transparent;
+}
+.ui-checkbox, .ui-radio {
+  height: 2.2222222222222223rem;
+  position: relative;
+  margin: 0;
+  z-index: 1;
+}
+.ui-checkbox .ui-btn-corner-all, .ui-radio .ui-btn-corner-all {
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  bordert-radius: 0;
+}
+.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner {
+  border-top: 0;
+}
+.ui-checkbox .ui-btn-up-s, .ui-radio .ui-btn-up-s {
+  border: 0;
+  background: transparent;
+  font-weight: normal;
+}
+.ui-checkbox .ui-btn-hover-s, .ui-radio .ui-btn-hover-s {
+  border: 0;
+  background: transparent;
+  font-weight: normal;
+}
+.ui-checkbox .ui-btn-down-s, .ui-radio .ui-btn-down-s {
+  border: 0;
+  background: transparent;
+  font-weight: normal;
+}
+.ui-checkbox input, .ui-radio input {
+  position: absolute;
+  left: -10000px;
+  height: 100%;
+  outline: 0 !important;
+  z-index: 0;
+}
+.ui-checkbox .ui-btn, .ui-radio .ui-btn {
+  height: 100%;
+  margin: 0;
+  text-align: left;
+  z-index: 2;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left, .ui-radio .ui-btn.ui-btn-icon-left {
+  display: block;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner, .ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner {
+  display: inline-block;
+  line-height: 2.2222222222222223rem;
+  padding: 0 0 0 0.4444444444444444rem;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text, .ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text {
+  display: inline-block;
+  vertical-align: middle;
+  margin-left: 1.1111111111111112rem;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-icon, .ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-icon {
+  position: absolute;
+  top: 50%;
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  margin-top: -0.5833333333333333rem;
+}
+.ui-checkbox.favorite input {
+  position: absolute;
+  left: -10000px;
+  height: 100%;
+  outline: 0 !important;
+  z-index: 1;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left {
+  display: block;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner {
+  display: inline-block;
+  line-height: 2.2222222222222223rem;
+  padding: 0 0 0 0.4444444444444444rem;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text {
+  display: inline-block;
+  vertical-align: middle;
+  margin-left: 2.6666666666666665rem;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-icon {
+  position: absolute;
+  top: 50%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  margin-top: -0.8888888888888888rem;
+}
+/* put img inside of checkbox(normal, favorite, on&off style) */
+.ui-icon-checkbox-off,
+.ui-icon-checkbox-on,
+.favorite .ui-icon-checkbox-off,
+.favorite .ui-icon-checkbox-on,
+.ui-icon-checkbox-on-press,
+.ui-icon-checkbox-off-press,
+.ui-icon-radio-off,
+.ui-icon-radio-on,
+.ui-icon-radio-on-press,
+.ui-icon-radio-off-press {
+  background-size: 100% 100%;
+  background-color: transparent;
+}
+.ui-icon-checkbox-off {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_check_bg.png);
+}
+.ui-icon-checkbox-on {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_check_checking.png), url(images/00_check_bg.png);
+  background-repeat: no-repeat;
+}
+.ui-icon-checkbox-off-press {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_check_bg_press.png);
+}
+.ui-icon-checkbox-on-press {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_check_checking.png), url(images/00_check_bg_press.png);
+  background-repeat: no-repeat;
+}
+.favorite .ui-icon-checkbox-off, .favorite .ui-icon-checkbox-off-press {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-image: url(images/00_winset_icon_favorite_off.png);
+}
+.favorite .ui-icon-checkbox-on, .favorite .ui-icon-checkbox-on-press {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-image: url(images/00_winset_icon_favorite_on.png);
+}
+.ui-icon-radio-off {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_button_radio_normal2.png);
+}
+.ui-icon-radio-on {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_button_radio_normal1.png);
+}
+.ui-icon-radio-on-press {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_button_radio_press2.png);
+}
+.ui-icon-radio-off-press {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_button_radio_press1.png);
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.ui-field-contain { padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; }
+.ui-field-contain:first-child { border-top-width: 0; }
+@media all and (min-width: 450px){
+	.ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }
+}	/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.ui-select { display: block; position: relative; }
+.ui-select select { position: absolute; left: -9999px; top: -9999px; }
+.ui-select .ui-btn { overflow: hidden; }
+.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%;  min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); z-index: 2; }
+@-moz-document url-prefix() {.ui-select .ui-btn select { opacity: 0.0001; }}
+.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; text-indent: 0; }
+
+.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } 
+.ui-select .ui-btn-icon-right .ui-icon { right: 15px;  }
+
+/* labels */
+label.ui-select { font-size: 16px; line-height: 1.4;  font-weight: normal; margin: 0 0 .3em; display: block; }
+
+/*listbox*/
+.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; }
+.ui-select .ui-btn-text { text-overflow: ellipsis; overflow: hidden;}
+
+.ui-selectmenu { position: absolute; padding: 0; z-index: 100 !important; width: 80%; max-width: 350px; padding: 6px; }
+.ui-selectmenu .ui-listview { margin: 0; }
+.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; }
+.ui-selectmenu-hidden { top: -9999px; left: -9999px; }
+.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%;  z-index: 99; }
+.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; }
+.ui-selectmenu-list .ui-li .ui-icon { display: block; }
+.ui-li.ui-selectmenu-placeholder { display: none; }
+.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; }
+
+@media all and (min-width: 450px){
+	label.ui-select { vertical-align: top;  display: inline-block;  width: 20%;  margin: 0 2% 0 0; }
+	.ui-select { width: 60%; display: inline-block; }
+}	
+
+/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button.  this shim's content in there */
+.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+label.ui-input-text {
+  font-size: 0.8888888888888888rem;
+  line-height: 1.4;
+  display: block;
+  font-weight: normal;
+  margin: 0 0 .3em;
+}
+input.ui-input-text, textarea.ui-input-text {
+  background-image: none;
+  padding: .4em;
+  line-height: 1.4;
+  font-size: 0.8888888888888888rem;
+  display: block;
+  width: 95%;
+}
+input.ui-input-text {
+  -webkit-appearance: none;
+}
+textarea.ui-input-text {
+  height: 1.3888888888888888rem;
+  -webkit-transition: height 200ms linear;
+  -moz-transition: height 200ms linear;
+  -o-transition: height 200ms linear;
+  transition: height 200ms linear;
+}
+.ui-input-search {
+  padding: 0 0;
+  position: relative;
+}
+.ui-input-search input.ui-input-text {
+  border: none;
+  background: transparent none;
+  outline: 0 !important;
+}
+.ui-input-search .ui-btn-down-s, .ui-input-search .ui-btn-up-s, .ui-input-search .ui-btn-hover-s {
+  border: none;
+  background: transparent none;
+}
+.ui-input-search .ui-btn-icon-notext.ui-input-clear {
+  width: 1.0555555555555556rem;
+  height: 1.0555555555555556rem;
+}
+.ui-input-search .ui-btn-icon-notext.ui-input-clear .ui-btn-inner {
+  padding: 0;
+}
+.ui-input-search .ui-icon-deleteSearch {
+  width: 1.0555555555555556rem;
+  height: 1.0555555555555556rem;
+}
+.ui-input-search .ui-input-clear {
+  position: absolute;
+  right: 0;
+  top: 0;
+  vertical-align: middle;
+  margin: 0.4444444444444444rem;
+}
+.ui-input-search .ui-input-clear-hidden {
+  display: none;
+}
+.ui-image-search {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  margin: 0.4444444444444444rem;
+}
+.ui-image-searchfield:after {
+  margin-left: 1.611111111111111rem;
+  content: "Search";
+  color: #828282;
+}
+/* orientation adjustments - incomplete!*/
+@media all and (min-width: 720*@unit_base) {
+  label.ui-input-text {
+    vertical-align: top;
+    display: inline-block;
+    width: 20%;
+    margin: 0 2% 0 0;
+  }
+  input.ui-input-text, textarea.ui-input-text, .ui-input-search {
+    width: 60%;
+    display: inline-block;
+  }
+  .ui-input-search input.ui-input-text {
+    width: 85%;
+    /*echos rule from above*/
+  }
+}
+/* search bar */
+.ui-body-s > div > .ui-field-contain > .input-search-bar, .ui-body-s > .ui-field-contain > .input-search-bar {
+  margin: -1.3333333333333333rem -0.41666666666666663rem -0.8888888888888888rem -0.41666666666666663rem;
+}
+/* Need to confirm exact concept : Jinhyuk */
+.input-search-bar {
+  position: relative;
+  /* In case searchbar in header : Jinhyuk */
+
+  background-color: #242424;
+  padding: 0.4444444444444444rem;
+  vertical-align: middle;
+}
+.input-search-bar .ui-corner-all {
+  -moz-border-radius: 0.3em;
+  -webkit-border-radius: 0.3em;
+  bordert-radius: 0.3em;
+}
+.input-search-bar .ui-input-search {
+  font-size: 0.8888888888888888rem;
+  display: inline-block;
+  position: relative;
+  width: 70%;
+  padding: 0;
+  background-color: black;
+}
+.input-search-bar .ui-input-search .ui-input-text {
+  height: 2.0555555555555554rem;
+  padding: 0px;
+  margin-left: 0.2777777777777778rem;
+}
+.input-search-bar .ui-input-search-default {
+  width: 70%;
+  -webkit-transition: width 400ms linear;
+  -moz-transition: width 400ms linear;
+  -o-transition: width 400ms linear;
+  transition: width 400ms linear;
+}
+.input-search-bar .ui-input-search-wide {
+  width: 100%;
+  -webkit-transition: width 400ms linear;
+  -moz-transition: width 400ms linear;
+  -o-transition: width 400ms linear;
+  transition: width 400ms linear;
+}
+.input-search-bar .ui-btn-icon-cancel {
+  display: inline-block;
+  position: absolute;
+  left: 70%;
+  vertical-align: middle;
+  margin-left: 0.2777777777777778rem;
+  margin-right: 0.2777777777777778rem;
+  padding: 0px;
+  height: 2.0555555555555554rem;
+  border-color: none;
+}
+.input-search-bar .ui-btn-icon-cancel .ui-btn-text {
+  font-size: 0.8888888888888888rem;
+}
+.input-search-bar .ui-btn-icon-cancel .ui-btn-inner {
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel {
+  width: 26%;
+}
+.input-search-bar .ui-btn-cancel-hide {
+  left: 100%;
+  -webkit-transition: left 400ms linear;
+  -moz-transition: left 400ms linear;
+  -o-transition: left 400ms linear;
+  transition: left 400ms linear;
+}
+.input-search-bar .ui-btn-cancel-show {
+  left: 70%;
+  -webkit-transition: left 400ms linear;
+  -moz-transition: left 400ms linear;
+  -o-transition: left 400ms linear;
+  transition: left 400ms linear;
+}
+.ui-header .input-search-bar {
+  padding-top: 0.4444444444444444rem;
+  padding-bottom: 0.4444444444444444rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-controlgroup, fieldset.ui-controlgroup {
+  padding: 0;
+  margin: .5em 0 1em;
+}
+.ui-bar .ui-controlgroup {
+  margin: 0 .3em;
+}
+.ui-controlgroup-label {
+  font-size: 1em;
+  line-height: 1.4;
+  font-weight: normal;
+  margin: 0 0 .3em;
+}
+.ui-controlgroup-controls {
+  display: block;
+}
+.ui-controlgroup li {
+  list-style: none;
+}
+.ui-controlgroup .ui-btn-inner {
+  white-space: nowrap;
+}
+.ui-controlgroup .ui-checkbox label label, .ui-controlgroup .ui-radio label {
+  font-size: 1em;
+}
+.ui-controlgroup .ui-radio {
+  width: 25%;
+  overflow: hidden;
+}
+.ui-controlgroup .ui-radio label {
+  text-align: center;
+  white-space: nowrap;
+}
+.ui-controlgroup .ui-radio-off, .ui-controlgroup .ui-radio-on {
+  width: 100%;
+  border-right-width: 1px;
+  border-right-color: #252525;
+  border-right-style: solid;
+  border-left-width: 1px;
+  border-left-color: #252525;
+  border-left-style: solid;
+}
+.ui-controlgroup .ui-corner-left {
+  border-left-width: 0px;
+}
+.ui-controlgroup .ui-corner-right {
+  border-right-width: 0px;
+}
+.ui-controlgroup-vertical .ui-btn, .ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio {
+  margin: 0;
+  border-bottom-width: 0;
+}
+.ui-controlgroup-vertical .ui-controlgroup-last {
+  border-bottom-width: 1px;
+}
+.ui-controlgroup-vertical .ui-radio {
+  width: 100%;
+}
+.ui-controlgroup-vertical .ui-radio label {
+  text-align: left;
+}
+.ui-controlgroup-vertical .ui-radio label .ui-btn-inner {
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+}
+.ui-controlgroup-horizontal {
+  padding: 0;
+}
+.ui-controlgroup-horizontal .ui-btn {
+  display: inline-block;
+  margin: 0 -5px 0 0;
+}
+.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio {
+  float: left;
+  margin: 0 -1px 0 0;
+}
+.ui-controlgroup-horizontal .ui-controlgroup-last {
+  margin-right: 0;
+}
+@media all and (min-width: 450px) {
+  .ui-controlgroup-label {
+    vertical-align: top;
+    display: inline-block;
+    width: 20%;
+    margin: 0 2% 0 0;
+  }
+  .ui-controlgroup-controls {
+    display: inline-block;
+  }
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/*** less definitions ***/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/************************/
+.ui-listview {
+  margin: 0;
+  counter-reset: listnumbering;
+  border-top-width: 1px;
+  border-top-style: solid;
+}
+.ui-listview li.ui-btn-up-s > .ui-li > .ui-btn-text > a.ui-link-inherit, .ui-listview li.ui-btn-hover-s > .ui-li > .ui-btn-text > a.ui-link-inherit, .ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+  font-size: 1.222222222222222rem;
+}
+.ui-listview li.ui-btn > .ui-btn-hastxt > .ui-btn-text.ui-btn-text-padding-right {
+  padding-right: 0rem;
+}
+.ui-listview > .ui-li {
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+}
+.ui-content .ui-listview {
+  margin: -0.4444444444444444rem;
+}
+.ui-content .ui-listview .ui-listview {
+  margin: 0;
+}
+.ui-content .ui-listview-inset {
+  margin: 1em 0;
+}
+.ui-listview, .ui-li {
+  list-style: none;
+  padding: 0;
+}
+.ui-li, .ui-li.ui-field-contain {
+  display: block;
+  margin: 0;
+  position: relative;
+  overflow: visible;
+  text-align: left;
+}
+.ui-li .ui-btn {
+  top: 50%;
+  margin-top: -0.8em;
+}
+.ui-li .ui-btn-text {
+  position: relative;
+}
+.ui-li .ui-btn-text a.ui-link-inherit {
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.ui-li:last-child, .ui-li.ui-field-contain:last-child {
+  border-bottom-width: 1px;
+}
+.ui-li > .ui-btn-inner {
+  display: block;
+  position: relative;
+  padding: 0;
+  border-width: 0;
+}
+.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li.ui-li-static {
+  padding: 0.7em 0.4444444444444444rem;
+  display: block;
+}
+.ui-li-divider, .ui-li-static {
+  font-weight: normal;
+  padding: 0px 0.4444444444444444rem;
+}
+.ui-li-static {
+  font-size: 1.222222222222222rem;
+}
+.ui-li-divider {
+  counter-reset: listnumbering;
+  font-size: 0.7777777777777777rem;
+  padding-top: 0.7777777777777777rem;
+}
+.ui-li-divider.ui-bar-s {
+  height: 0.7777777777777777rem;
+}
+ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec {
+  font-size: .8em;
+  display: inline-block;
+  padding-right: .3em;
+  font-weight: normal;
+  counter-increment: listnumbering;
+  content: counter(listnumbering) ". ";
+}
+ol.ui-listview .ui-li-jsnumbering:before {
+  content: "" !important;
+  /* to avoid chance of duplication */
+
+}
+.ui-listview-inset .ui-li {
+  border-right-width: 1px;
+  border-left-width: 1px;
+}
+.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-has-thumb.ui-li-static {
+  min-height: 1.6666666666666665rem;
+  padding-left: 2.7777777777777777rem;
+}
+.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-has-icon.ui-li-static {
+  min-height: 20px;
+  padding-left: 40px;
+}
+.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-has-count.ui-li-static {
+  padding-right: 45px;
+}
+.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-has-arrow.ui-li-static {
+  padding-right: 30px;
+}
+.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-has-arrow.ui-li-static.ui-li-has-count {
+  padding-right: 75px;
+}
+.ui-li-heading {
+  font-size: 16px;
+  font-weight: bold;
+  display: block;
+  margin: .6em 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.ui-li-desc {
+  font-size: 12px;
+  font-weight: normal;
+  display: block;
+  margin: -0.5em 0 0.6em;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.ui-li-thumb, .ui-li-icon {
+  position: absolute;
+  left: 1px;
+  top: 0;
+  max-height: 2.6666666666666665rem;
+  max-width: 2.6666666666666665rem;
+}
+.ui-li-aside {
+  float: right;
+  width: 50%;
+  text-align: right;
+  margin: .3em 0;
+}
+@media all and (min-width: 480px) {
+  .ui-li-aside {
+    width: 45%;
+  }
+}
+.ui-li-divider {
+  cursor: default;
+}
+.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-has-alt.ui-li-static {
+  padding-right: 95px;
+}
+.ui-li-has-count .ui-li-count {
+  position: absolute;
+  font-size: 11px;
+  font-weight: bold;
+  padding: .2em .5em;
+  top: 50%;
+  margin-top: -0.9em;
+  right: 38px;
+}
+.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count {
+  right: 10px;
+}
+.ui-li-has-alt .ui-li-count {
+  right: 55px;
+}
+.ui-li-link-alt {
+  position: absolute;
+  width: 40px;
+  height: 100%;
+  border-width: 0;
+  border-left-width: 1px;
+  top: 0;
+  right: 0;
+  margin: 0;
+  padding: 0;
+  z-index: 2;
+}
+.ui-li-link-alt .ui-btn {
+  overflow: hidden;
+  position: absolute;
+  right: 8px;
+  top: 50%;
+  margin: -11px 0 0 0;
+  border-bottom-width: 1px;
+  z-index: -1;
+}
+.ui-li-link-alt .ui-btn-inner {
+  padding: 0;
+  height: 100%;
+  position: absolute;
+  width: 100%;
+  top: 0;
+  left: 0;
+}
+.ui-li-link-alt .ui-btn .ui-icon {
+  right: 50%;
+  margin-right: -9px;
+}
+.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner {
+  border-top: 0px;
+}
+.ui-listview-filter {
+  border-width: 0;
+  overflow: hidden;
+  margin: -15px -15px 15px -15px;
+}
+.ui-listview-filter .ui-input-search {
+  margin: 5px;
+  width: auto;
+  display: block;
+}
+.ui-listview-filter-inset {
+  margin: -15px -5px -15px -5px;
+  background: transparent;
+}
+.ui-li.ui-screen-hidden {
+  display: none;
+}
+.ui-li-sub, .ui-li-sub-setting {
+  float: right;
+  text-align: right;
+  font-size: 0.8888888888888888rem;
+  margin: .3em 0;
+}
+/* listview: size for li with a link */
+/*
+.ui-listview li.ui-btn-up-s > .ui-li > .ui-btn-text > a.ui-link-inherit,
+.ui-listview li.ui-btn-hover-s > .ui-li > .ui-btn-text > a.ui-link-inherit,
+.ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+	margin: 0;
+	min-height: @height;
+	padding-left: 0;
+}
+*/
+.ui-li-long-text {
+  display: inline-block;
+  text-overflow: ellipsis;
+  overflow-x: hidden;
+  white-space: nowrap;
+}
+ul.ui-listview {
+  /* 1.11 Hidden style with 2 button */
+
+  /* For Contacts list : wongi_1108 */
+
+}
+ul.ui-listview > li.ui-li-1-11 {
+  height: 96px;
+  padding: 0px;
+  padding-left: 16px;
+  padding-right: 16px;
+}
+ul.ui-listview > li.ui-li-1-11 > div.ui-btn {
+  position: absolute;
+  padding: 0px;
+  margin-top: 0px;
+  width: 336px;
+  top: 18px;
+}
+ul.ui-listview > li.ui-li-1-11 > div.ui-btn > span.ui-btn-hastxt {
+  padding-top: 0.4em;
+}
+ul.ui-listview > li.ui-li-1-11 > div.ui-btn:nth-child(1) {
+  left: 16px;
+}
+ul.ui-listview > li.ui-li-1-11 > div.ui-btn:nth-child(2) {
+  left: 372px;
+}
+ul.ui-listview > li.ui-li-1line .ui-li-text-main, ul.ui-listview > li.ui-li-1line-sub .ui-li-text-main, ul.ui-listview > li.ui-li-1line-setting .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line .ui-li-text-sub, ul.ui-listview > li.ui-li-1line-sub .ui-li-text-sub, ul.ui-listview > li.ui-li-1line-setting .ui-li-text-sub {
+  float: right;
+  text-align: right;
+  font-size: 0.8888888888888888rem;
+  color: #646464;
+  top: 50%;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-setting .ui-li-text-sub {
+  color: #008cd2;
+}
+ul.ui-listview > li.ui-li-1line-btn1 .ui-li-text-main, ul.ui-listview > li.ui-li-1line-btn2 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-btn1 > .ui-btn, ul.ui-listview > li.ui-li-1line-btn2 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-1line-toggle .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-toggle .ui-toggleswitch {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-1line-bigicon1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-bigicon2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-bigicon4 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-bigicon5 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-bigicon6 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 2.6666666666666665rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-bigicon1 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon2 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon4 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon5 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon6 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-bigicon1 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon2 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon4 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon5 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon6 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-1line-bigicon2 .ui-li-text-sub {
+  float: right;
+  text-align: right;
+  font-size: 0.8888888888888888rem;
+  color: #646464;
+  top: 50%;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-bigicon6 .ui-toggleswitch {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-1line-check1,
+ul.ui-listview > li.ui-li-1line-check2,
+ul.ui-listview > li.ui-li-1line-radio1,
+ul.ui-listview > li.ui-li-1line-radio3,
+ul.ui-listview > li.ui-li-1line-radio5 {
+  margin: 0;
+  height: 1.6666666666666665rem !important;
+  min-height: 1.6666666666666665rem;
+  padding-left: 2.0555555555555554rem;
+}
+ul.ui-listview > li.ui-li-1line-check1 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-check2 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-check1 .ui-radio,
+ul.ui-listview > li.ui-li-1line-check2 .ui-radio,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-radio,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-radio,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-radio,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-1line-check1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-check2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-check3, ul.ui-listview > li.ui-li-1line-check4, ul.ui-listview > li.ui-li-1line-radio4 {
+  margin: 0;
+  height: 1.6666666666666665rem !important;
+  min-height: 1.6666666666666665rem;
+  padding-left: 4.277777777777778rem;
+}
+ul.ui-listview > li.ui-li-1line-check3 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-check4 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-check3 .ui-radio,
+ul.ui-listview > li.ui-li-1line-check4 .ui-radio,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-radio,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-1line-check3 img.ui-li-bigicon, ul.ui-listview > li.ui-li-1line-check4 img.ui-li-bigicon, ul.ui-listview > li.ui-li-1line-radio4 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-check3 img.ui-li-bigicon, ul.ui-listview > li.ui-li-1line-check4 img.ui-li-bigicon, ul.ui-listview > li.ui-li-1line-radio4 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 2.0555555555555554rem;
+}
+ul.ui-listview > li.ui-li-1line-check3 .ui-li-text-main, ul.ui-listview > li.ui-li-1line-check4 .ui-li-text-main, ul.ui-listview > li.ui-li-1line-radio4 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-bigicon4 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-bigicon5 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-check2 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-check4 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-radio3 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-radio5 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-1line-radio5 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-radio5 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: auto;
+  right: 2.6666666666666665rem;
+}
+ul.ui-listview > li.ui-li-1line-radio6 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-radio6 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-radio6 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: auto;
+  right: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line, ul.ui-listview > li.ui-li-2line-setting, ul.ui-listview > li.ui-li-2line-toggle-setting {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line .ui-li-text-main, ul.ui-listview > li.ui-li-2line-setting .ui-li-text-main, ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-setting .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line .ui-toggleswitch, ul.ui-listview > li.ui-li-2line-setting .ui-toggleswitch, ul.ui-listview > li.ui-li-2line-toggle-setting .ui-toggleswitch {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-sub-main, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-sub-main .ui-li-text-main, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 1.6111111111111112rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-sub-main .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-sub-main img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-sub-main img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: auto;
+  right: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-2sub {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-btn1,
+ul.ui-listview > li.ui-li-2line-btn2,
+ul.ui-listview > li.ui-li-2line-btn-setting,
+ul.ui-listview > li.ui-li-2line-bigicon0 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-btn2 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-btn-setting > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon0 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-sub > img,
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-sub > img,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-sub > img,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-sub > img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-star1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-star1 img.ui-li-icon-sub {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-star2 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-star2 img.ui-li-icon-sub {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-sub > img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0.4444444444444444rem 0 0;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1,
+ul.ui-listview > li.ui-li-2line-bigicon2,
+ul.ui-listview > li.ui-li-2line-bigicon3,
+ul.ui-listview > li.ui-li-2line-bigicon4,
+ul.ui-listview > li.ui-li-2line-colorbar3,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon4 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.6666666666666665rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon4 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.6666666666666665rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon2 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon3 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon4 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-colorbar3 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon2 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon3 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon4 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-colorbar3 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon2 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon3 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon4 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-colorbar3 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-sub {
+  color: #008cd2;
+}
+ul.ui-listview > li.ui-li-2line-check1, ul.ui-listview > li.ui-li-2line-check2, ul.ui-listview > li.ui-li-2line-radio1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-check1 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-check2 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-check1 .ui-radio,
+ul.ui-listview > li.ui-li-2line-check2 .ui-radio,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-radio,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-2line-check1 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-check2 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-radio1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.0555555555555554rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-check1 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-check2 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-radio1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.0555555555555554rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-check1 > .ui-btn, ul.ui-listview > li.ui-li-2line-check2 > .ui-btn, ul.ui-listview > li.ui-li-2line-radio1 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-check3, ul.ui-listview > li.ui-li-2line-radio2, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-check3 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-check3 .ui-radio,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-radio,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-radio,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-2line-check3 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-radio2 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-check3 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-radio2 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 2.0555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-check3 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-radio2 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 4.277777777777778rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-check3 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-radio2 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 4.277777777777778rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-check3 > .ui-btn, ul.ui-listview > li.ui-li-2line-radio2 > .ui-btn, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-color-bar, ul.ui-listview > li.ui-li-2line-colorbar2 .ui-li-color-bar, ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-color-bar {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 0.2777777777777778rem;
+  height: 0.5555555555555556rem;
+  background-color: #506bcf;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-btn {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  margin: 0 0 0 0.4444444444444444rem;
+  max-height: 1.6666666666666665rem;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 .ui-li-text-main img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.6666666666666665rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.6666666666666665rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 img.ui-li-icon-sub {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 2.1666666666666665rem;
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-2line-thumb1, ul.ui-listview > li.ui-li-2line-thumb2, ul.ui-listview > li.ui-li-2line-thumb3 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-thumb2 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-thumb3 img.ui-li-bigicon {
+  width: 2.6666666666666665rem;
+  height: 2.6666666666666665rem;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-thumb2 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-thumb3 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -1.3333333333333333rem;
+  left: auto;
+  right: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-main img, ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-main img, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-main img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-sub img, ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-sub img, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-sub img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0.4444444444444444rem 0 0;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.6666666666666665rem;
+  top: 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.6666666666666665rem;
+  top: 2.1111111111111107rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 4.611111111111111rem;
+  top: 2.1111111111111107rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-btn {
+  max-width: 3.722222222222222rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-progressbar {
+  left: 2.6666666666666665rem;
+  top: 1.6666666666666665rem;
+  height: 0.4444444444444444rem;
+  width: 13rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.6666666666666665rem;
+  top: 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.6666666666666665rem;
+  top: 2.1111111111111107rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 2.1111111111111107rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-progressbar {
+  left: 2.6666666666666665rem;
+  top: 1.6666666666666665rem;
+  height: 0.4444444444444444rem;
+  width: 16.88888888888889rem;
+}
+ul.ui-listview > li.ui-li-2line .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-sub-main .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-setting .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-sub-main .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-setting .ui-li-text-sub {
+  max-width: 95%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-main, ul.ui-listview > li.ui-li-3-2-6 .ui-li-text-main {
+  max-width: 65%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-sub, ul.ui-listview > li.ui-li-3-2-6 .ui-li-text-sub {
+  max-width: 95%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-sub2, ul.ui-listview > li.ui-li-3-2-6 .ui-li-text-sub2 {
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-sub {
+  max-width: 65%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-btn,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-btn,
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-btn,
+ul.ui-listview > li.ui-li-2line-thumb2 .ui-btn {
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-check1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-check1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 .ui-li-text-sub {
+  max-width: 80%;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-main {
+  max-width: 85%;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub {
+  max-width: 65%;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-sub2, ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub2 {
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-main {
+  max-width: 85%;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-sub {
+  max-width: 95%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-main {
+  max-width: 55%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-sub {
+  max-width: 80%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-sub2 {
+  max-width: 20%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon4 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-check2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-check3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon4 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-check2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-check3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-li-text-sub {
+  max-width: 65%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 .ui-li-text-main {
+  max-width: 75%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 .ui-li-text-sub {
+  max-width: 70%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-main {
+  max-width: 60%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-sub {
+  max-width: 40%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-sub2 {
+  max-width: 20%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 .ui-li-text-sub {
+  max-width: 55%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-main {
+  max-width: 80%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-sub {
+  max-width: 60%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-sub2 {
+  max-width: 20%;
+}
+ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-sub {
+  max-width: 75%;
+}
+ul.ui-listview > li.ui-li-3-4-1 {
+  font-size: 1rem;
+  padding: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-3-4-1 h1.ui-li-heading {
+  font-size: 1.3333333333333333rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+}
+ul.ui-listview > li.ui-li-3-4-5 h1.ui-li-heading {
+  display: inline-block;
+  width: 6.222222222222221rem;
+  height: 100%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn,
+ul.ui-listview > li.ui-li-email-name2-btn,
+ul.ui-listview > li.ui-li-email-name1,
+ul.ui-listview > li.ui-li-email-name2,
+ul.ui-listview > li.ui-li-email-name1-btn-warning,
+ul.ui-listview > li.ui-li-email-name2-btn-warning,
+ul.ui-listview > li.ui-li-email-name1-warning,
+ul.ui-listview > li.ui-li-email-name2-warning,
+ul.ui-listview > li.ui-li-email-name1-btn-attach,
+ul.ui-listview > li.ui-li-email-name2-btn-attach,
+ul.ui-listview > li.ui-li-email-name1-attach,
+ul.ui-listview > li.ui-li-email-name2-attach,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach,
+ul.ui-listview > li.ui-li-email-name1-warning-attach,
+ul.ui-listview > li.ui-li-email-name2-warning-attach {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 4.444444444444445rem;
+  min-height: 4.444444444444445rem;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-color-bar {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 0.2777777777777778rem;
+  height: 0.5555555555555556rem;
+  background-color: #506bcf;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1 .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2 .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-radio,
+ul.ui-listview > li.ui-li-email-name1 .ui-radio,
+ul.ui-listview > li.ui-li-email-name2 .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1 .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2 .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-radio,
+ul.ui-listview > li.ui-li-email-name1 .ui-radio,
+ul.ui-listview > li.ui-li-email-name2 .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-on-press {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 0.2222222222222222rem;
+  width: 1.5555555555555554rem;
+  height: 1.6666666666666665rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1 .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2 .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text {
+  margin-left: 1.6666666666666665rem;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #d2d2d2;
+  left: 2.0555555555555554rem;
+  top: 3rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-text-sub3 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 3rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.0555555555555554rem;
+  top: 0.2222222222222222rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #818181;
+  left: 2.0555555555555554rem;
+  top: 2rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.0555555555555554rem;
+  top: 0.2222222222222222rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #818181;
+  left: 3.388888888888889rem;
+  top: 2rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name2-btn-warning img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name1-warning img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name2-warning img.ui-li-icon-warning {
+  position: absolute;
+  left: 2.0555555555555554rem;
+  right: auto;
+  top: 2.1111111111111107rem;
+  width: 0.8333333333333333rem;
+  height: 0.8333333333333333rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 3.388888888888889rem;
+  top: 0.2222222222222222rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #818181;
+  left: 2.0555555555555554rem;
+  top: 2rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name2-btn-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name1-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name2-attach img.ui-li-icon-attach {
+  position: absolute;
+  left: 2.0555555555555554rem;
+  right: auto;
+  top: 0.4444444444444444rem;
+  width: 1.1111111111111112rem;
+  height: 1.1111111111111112rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 3.388888888888889rem;
+  top: 0.2222222222222222rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #818181;
+  left: 3.388888888888889rem;
+  top: 2rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name1-warning-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name2-warning-attach img.ui-li-icon-attach {
+  position: absolute;
+  left: 2.0555555555555554rem;
+  right: auto;
+  top: 0.4444444444444444rem;
+  width: 1.1111111111111112rem;
+  height: 1.1111111111111112rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name1-warning-attach img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name2-warning-attach img.ui-li-icon-warning {
+  position: absolute;
+  left: 2.0555555555555554rem;
+  right: auto;
+  top: 2.1111111111111107rem;
+  width: 0.8333333333333333rem;
+  height: 0.8333333333333333rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn > .ui-btn,
+ul.ui-listview > li.ui-li-email-name2-btn > .ui-btn,
+ul.ui-listview > li.ui-li-email-name1-btn-warning > .ui-btn,
+ul.ui-listview > li.ui-li-email-name2-btn-warning > .ui-btn,
+ul.ui-listview > li.ui-li-email-name1-btn-attach > .ui-btn,
+ul.ui-listview > li.ui-li-email-name2-btn-attach > .ui-btn,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach > .ui-btn,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach > .ui-btn {
+  position: absolute;
+  right: 2.444444444444444rem;
+  top: 24%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-sub1 {
+  color: #008cd2;
+}
+ul.ui-listview > li.ui-li-1line-leftsub1 .ui-li-text-sub-left {
+  font-size: 0.8888888888888888rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  width: 5.194444444444444rem;
+  line-height: 1.6666666666666665rem;
+  margin-top: -0.5em;
+  vertical-align: top;
+}
+ul.ui-listview > li.ui-li-1line-leftsub1 .ui-li-text-main-right {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 5.194444444444444rem;
+  margin-top: -0.5em;
+  padding-left: 0.4444444444444444rem;
+  border-left: 1px #444444 solid;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 {
+  margin: 0;
+  height: 1.6666666666666665rem !important;
+  min-height: 1.6666666666666665rem;
+  padding-left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 .ui-li-text-sub-left {
+  font-size: 0.8888888888888888rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  width: 5.194444444444444rem;
+  line-height: 1.6666666666666665rem;
+  margin-top: -0.5em;
+  vertical-align: top;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 .ui-li-text-main-right {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 5.194444444444444rem;
+  margin-top: -0.5em;
+  padding-left: 0.4444444444444444rem;
+  border-left: 1px #444444 solid;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: auto;
+  right: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-4-2-3 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-sub {
+  color: #008cd2;
+}
+ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-main, ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-sub {
+  max-width: 95%;
+}
+ul.ui-listview > li.ui-li-4-2-10 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-4-2-10 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 1.6111111111111112rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-2-10 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-2-10 .ui-li-text-main, ul.ui-listview > li.ui-li-4-2-10 .ui-li-text-sub {
+  max-width: 80%;
+}
+ul.ui-listview > li.ui-li-4-2-10 .ui-checkbox {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 1.8055555555555554rem 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-4-2-11 .ui-li-text-sub-left {
+  font-size: 0.8888888888888888rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  width: 5.194444444444444rem;
+  line-height: 1.6666666666666665rem;
+  margin-top: -0.5em;
+  vertical-align: top;
+}
+ul.ui-listview > li.ui-li-4-2-11 .ui-li-text-main-right {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 5.194444444444444rem;
+  margin-top: -0.5em;
+  padding-left: 0.4444444444444444rem;
+  border-left: 1px #444444 solid;
+}
+ul.ui-listview > li.ui-li-4-2-11 .ui-li-text-main-right {
+  display: inline-block;
+  word-wrap: normal;
+}
+ul.ui-listview > li.ui-li-3line-dgroup1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 4.444444444444445rem;
+  min-height: 4.444444444444445rem;
+}
+ul.ui-listview > li.ui-li-3line-dgroup1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.3333333333333333rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-3line-dgroup1 .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.6111111111111112rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-3line-dgroup1 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 2.944444444444444rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-3-2 {
+  height: 190px;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-4-3-2 .ui-li-thumb {
+  float: left;
+  height: 128px;
+  max-height: 128px;
+  width: 128px;
+  max-width: 128px;
+  left: 32px;
+  top: 28px;
+}
+ul.ui-listview > li.ui-li-4-3-2 span.contact_name_field {
+  position: absolute;
+  font-size: 1.0555555555555556rem;
+  color: #f9f9f9;
+  left: 184px;
+  top: 32px;
+  height: 54px;
+}
+ul.ui-listview > li.ui-li-4-3-2 span.contact_subname_field {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  color: #929292;
+  left: 184px;
+  top: 94px;
+}
+ul.ui-listview > li.ui-li-4-3-2 span.companyname_field {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  color: #929292;
+  left: 184px;
+  top: 126px;
+}
+ul.ui-listview > div.ui-li-dialogue-editor-photo {
+  width: 160px;
+  left: 16px;
+  top: 34px;
+  position: absolute;
+}
+ul.ui-listview > div.ui-li-dialogue-editor-photo > img {
+  width: 128px;
+  height: 128px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 {
+  border-left: 0.4444444444444444rem #444444 solid;
+  border-top-width: 0px;
+  left: 160px;
+  width: 790px;
+  padding-left: 12px;
+  padding-right: 0px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 > .ui-field-contain {
+  margin: 0;
+  padding: 8px;
+  width: 782px;
+  /* wongi_1215 : Default Text */
+
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 > .ui-field-contain > input {
+  border: none;
+  outline: none;
+  width: 782px;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 > .ui-field-contain > div.ui-input-default-text {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  margin: 0px;
+  color: #464646;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 > .ui-field-contain > div.ui-input-default-text.ui-input-default-hidden {
+  display: none;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1.ui-li-expanded {
+  background-color: #000000;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 {
+  padding: 0px !important;
+  height: 130px;
+  border-left: 0.4444444444444444rem #444444 solid;
+  border-top-width: 0px;
+  left: 0px;
+  width: 962px;
+  font-size: 32px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > div.ui-li-dialogue-editor-border {
+  border-right: 1px #444444 solid;
+  width: 160px;
+  height: 130px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > div div.ui-li-dialogue-editor-2-label {
+  margin-left: 16px;
+  line-height: 32px;
+  position: absolute;
+  top: 50%;
+  margin-top: -16px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > .ui-field-contain {
+  margin: 0;
+  width: 676px;
+  position: absolute;
+  top: 50%;
+  margin-top: -16px;
+  left: 200px;
+  /* wongi_1215 : Default Text */
+
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > .ui-field-contain > input {
+  border: none;
+  outline: none;
+  width: 676px;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > .ui-field-contain > div.ui-input-default-text {
+  position: absolute;
+  top: 0;
+  width: 100%;
+  margin: 0px;
+  color: #464646;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > .ui-field-contain > div.ui-input-default-text.ui-input-default-hidden {
+  display: none;
+}
+ul.ui-listview > li.ui-li-dialogue {
+  border-left: 0.4444444444444444rem #444444 solid;
+  border-top-width: 0px;
+}
+ul.ui-listview > li.ui-li-dialogue.ui-li-divider {
+  height: 0.8888888888888888rem;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-divider {
+  height: 0.8888888888888888rem;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-group-title {
+  padding-top: 0.8888888888888888rem;
+}
+ul.ui-listview > li.ui-li-group-title span {
+  padding-left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-3-button {
+  padding-left: 8px;
+  padding-right: 8px;
+  height: 60px;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn {
+  margin-left: 8px;
+  margin-right: 8px;
+  height: 74px;
+  width: 224px;
+  top: 24px;
+  position: absolute;
+  padding: 0px;
+  margin-top: 0px;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn .ui-btn-inner.ui-btn-hastxt {
+  padding-top: 0.6em;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn:nth-child(1) {
+  left: 0%;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn:nth-child(2) {
+  left: 33%;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn:nth-child(3) {
+  left: 66%;
+}
+.ui-listview .ui-li-bubble-left img, .ui-listview .ui-li-bubble-right img, .ui-listview .ui-li-bubble-sos img {
+  position: relative;
+  min-width: 4.444444444444445rem;
+  min-height: 4.444444444444445rem;
+}
+.ui-listview .ui-li-bubble-left {
+  word-wrap: break-word;
+  -moz-border-radius-topright: 0.25rem;
+  -webkit-border-top-right-radius: 0.25rem;
+  border-top-right-radius: 0.25rem;
+  -moz-border-radius-bottomright: 0.25rem;
+  -webkit-border-bottom-right-radius: 0.25rem;
+  border-bottom-right-radius: 0.25rem;
+  font-size: 1.0555555555555556rem;
+  margin-top: 0.3333333333333333rem;
+  margin-bottom: 0.3333333333333333rem;
+  margin-left: 0;
+  margin-right: auto;
+  max-width: 80%;
+  min-width: 30%;
+  padding: 16px 22px 16px 16px;
+}
+.ui-listview .ui-li-bubble-left p, .ui-listview .ui-li-bubble-left span {
+  font-size: 1.0555555555555556rem;
+}
+.ui-listview .ui-li-bubble-right {
+  word-wrap: break-word;
+  -moz-border-radius-topleft: 0.25rem;
+  -webkit-border-top-left-radius: 0.25rem;
+  border-top-left-radius: 0.25rem;
+  -moz-border-radius-bottomleft: 0.25rem;
+  -webkit-border-bottom-left-radius: 0.25rem;
+  border-bottom-left-radius: 0.25rem;
+  margin: 12px 0% 12px 20%;
+  padding: 16px 16px 16px 22px;
+}
+.ui-listview .ui-li-bubble-date {
+  height: 40px;
+  font-size: 0.7222222222222222rem;
+  margin: 12px 0%;
+  padding: 0% 16px;
+  padding-top: 15px;
+}
+.ui-listview span.ui-li-bubble-time {
+  margin-left: 12px;
+  font-size: 0.7222222222222222rem;
+  display: inline-block;
+}
+.ui-listview .ui-li-expandable-shown .ui-li-expanded-icon {
+  background-image: url(images/00_button_expand_opened.png);
+  background-size: 100%;
+  position: absolute;
+  top: 50%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  margin-top: -0.8888888888888888rem;
+  right: 0.4444444444444444rem;
+}
+.ui-listview .ui-li-expandable-hidden .ui-li-expand-icon {
+  background-image: url(images/00_button_expand_closed.png);
+  background-size: 100%;
+  position: absolute;
+  top: 50%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  margin-top: -0.8888888888888888rem;
+  right: 0.4444444444444444rem;
+}
+.ui-listview .ui-li-expanded {
+  overflow: hidden;
+  -webkit-transition: all 0.2s ease;
+  -moz-transition: all 0.2s ease;
+  -o-transition: all 0.2s ease;
+  transition: all 0.2s ease;
+}
+.ui-listview .ui-li-expand-transition-show {
+  visibility: visible;
+}
+.ui-listview .ui-li-expand-transition-hide {
+  visibility: hidden;
+  height: 0px;
+  padding-top: 0px;
+  padding-bottom: 0px;
+  border: 0px;
+}
+/* Odd iPad positioning issue. */
+@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
+  .ui-li .ui-btn-text {
+    overflow: visible;
+  }
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-controlgroup .ui-radio-on, .ui-controlgroup .ui-radio-off.ui-btn-hover-s.ui-btn-down-s {
+  background: #e6e6e6;
+}
+.ui-controlgroup .ui-radio-off {
+  background: #3d3d3d;
+}
+.ui-controlgroup .ui-btn-inner .ui-corner-left .ui-controlgroup-first {
+  -moz-border-radius: .3em ;
+  -webkit-border-radius: .3em ;
+  border-radius: .3em ;
+}
+.ui-controlgroup .ui-btn-inner .ui-corner-right .ui-controlgroup-last {
+  -moz-border-radius: .3em ;
+  -webkit-border-radius: .3em ;
+  border-radius: .3em ;
+}
+.ui-controlgroup .ui-radio-off.ui-btn-hover-s.ui-btn-down-s .ui-btn-inner, .ui-controlgroup .ui-radio-on .ui-btn-inner {
+  color: #000000;
+}
+.ui-controlgroup .ui-radio-off .ui-btn-inner {
+  color: #909090;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-option-header {
+  overflow: hidden;
+  background: #484848;
+}
+.ui-option-header-1-row {
+  height: 2.944444444444444rem;
+  border: none;
+}
+.ui-option-header-2-row {
+  height: 5.444444444444444rem;
+  border: none;
+}
+.ui-option-header-row-1 {
+  height: 2.944444444444444rem;
+}
+.ui-option-header-row-2 {
+  height: 5.444444444444444rem;
+  margin-top: -2px;
+  padding: 0rem 0.1388888888888889rem 0.16666666666666666rem 0.1388888888888889rem;
+}
+.ui-option-header-row-2 div {
+  margin-top: 0.1388888888888889rem;
+  margin-bottom: 0.1388888888888889rem;
+}
+.ui-option-header .ui-btn {
+  display: block;
+  margin: 0.08333333333333333rem 0.1388888888888889rem 0.1388888888888889rem 0.1388888888888889rem;
+}
+.ui-option-header .ui-input-search .ui-btn {
+  display: none;
+}
+.ui-option-header .ui-btn-text {
+  line-height: 0.9444444444444444rem;
+}
+.ui-option-header .ui-btn-down-s.ui-btn-hover-s .ui-btn-inner, .ui-option-header .ui-btn-down-s .ui-btn-inner {
+  background: #2384b6;
+}
+.ui-option-header .ui-btn-hover-s .ui-btn-inner, .ui-option-header .ui-btn-up-s .ui-btn-inner {
+  background: #202020;
+}
+.ui-option-header .ui-btn-inner {
+  padding-top: 0.16666666666666666rem;
+  padding-bottom: 0.16666666666666666rem;
+  color: #f9f9f9;
+}
+.ui-option-header .ui-controlgroup-horizontal .ui-btn {
+  display: inline-block !important;
+  margin: -0.08333333333333333rem !important;
+}
+.ui-option-header .ui-controlgroup, .ui-option-header fieldset.ui-controlgroup {
+  margin-bottom: 0px !important;
+}
+.ui-option-header .ui-controlgroup-horizontal .ui-corner-left {
+  margin-left: 0.1388888888888889rem !important;
+}
+.ui-option-header .ui-controlgroup-horizontal .ui-corner-right {
+  margin-right: 0.1388888888888889rem !important;
+}
+.ui-option-header-triangle-arrow {
+  top: -0.2777777777777778rem;
+  height: 0.2777777777777778rem;
+  width: 100%;
+  position: relative;
+  margin-bottom: -0.2777777777777778rem;
+}
+.ui-header.ui-option-header-resizing .ui-option-header .ui-btn {
+  background: transparent;
+  border: none;
+  width: 100%;
+  top: 0.4444444444444444rem;
+}
+.ui-header.ui-option-header-resizing .ui-option-header .ui-btn .ui-btn-inner {
+  width: 92%;
+  padding: 0.66em 0px 0.66em;
+  margin: 0px auto;
+}
+.ui-header.ui-option-header-resizing .ui-option-header .input-search-bar .ui-btn {
+  width: 28%;
+  /* 134  * @unit_base; */
+
+}
+/*
+.ui-triangle {
+  color : @color_optionheader_Background; 
+
+  position: absolute;
+  bottom: 0px;
+  border-style: solid;
+	
+	margin-left : -10 * @unit_base;
+
+	border-left-width : 10 * @unit_base;
+	border-top-width : 0 * @unit_base;
+	border-right-width :10 * @unit_base;
+	border-bottom-width : 10 * @unit_base;
+	border-bottom-color : @color_optionheader_Background;
+}
+*/
+.ui-triangle-image {
+  background-image: url(images/00_winset_control_top_arrow.png);
+  background-size: 100% 100%;
+  position: absolute;
+  width: 0.7777777777777777rem;
+  height: 0.6666666666666666rem;
+  left: 50%;
+}
+.ui-icon-optiontray {
+  background-size: 100% 100%;
+  background-image: url(images/00_winset_btn_optiontray.png);
+}
+.ui-header .ui-btn .ui-btn-icon-only {
+  padding: 0 0 0 0;
+  height: 100%;
+}
+.ui-header .ui-btn .ui-btn-icon-only .ui-icon-optiontray {
+  width: 1.3333333333333333rem;
+  height: 1.0555555555555556rem;
+  top: 0.5rem;
+  /* temporary center align */
+
+  left: 1.0277777777777777rem;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/*** less definitions ***/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+ul.ui-virtual-list-container > li.position_absolute {
+  position: absolute;
+}
+ul.ui-virtual-list-container > ul.position_absolute {
+  position: absolute;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-scrollview-clip {
+  position: relative;
+}
+.ui-scrolllistview .ui-li-divider {
+  z-index: 10;
+}
+.ui-scrollbar {
+  position: absolute;
+  overflow: hidden;
+  opacity: 0;
+}
+.ui-scrollbar-visible {
+  opacity: 1;
+}
+.ui-scrollbar-y {
+  top: 0.05555555555555555rem;
+  right: 0.05555555555555555rem;
+  bottom: 0.05555555555555555rem;
+  width: 0.2777777777777778rem;
+}
+.ui-scrollbar-x {
+  right: 0.05555555555555555rem;
+  bottom: 0.05555555555555555rem;
+  left: 0.05555555555555555rem;
+  height: 0.2777777777777778rem;
+}
+.ui-scrollbar-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-scrollbar-thumb {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background-color: #44444a;
+}
+.ui-scrollbar-y .ui-scrollbar-thumb {
+  width: 0.2777777777777778rem;
+  height: 100%;
+}
+.ui-scrollbar-x .ui-scrollbar-thumb {
+  width: 100%;
+  height: 0.2777777777777778rem;
+}
+/*
+ * the values below are for the group index
+ */
+/*
+ * padding here set to zero - otherwise the list scrolls underneith the top heading and can be seen above it
+ */
+.ui-content.ui-scrollview-clip {
+  padding: 0;
+  padding-bottom: 0.4444444444444444rem;
+}
+.ui-content.ui-scrollview-clip > div.ui-scrollview-view {
+  margin: 0;
+  padding: 0.4444444444444444rem;
+}
+/*
+ * this seems to effect how far the top divider is place wrt to the scrollview
+ * without this, it is placed too high, so it is clipped in half
+ */
+.ui-content.ui-scrollview-clip > .ui-listview.ui-scrollview-view {
+  margin: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-hsvpicker .hsvpicker-clrchannel-container {
+  display: table;
+  padding-left: 0.75rem;
+  padding-right: 0.75rem;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-arrow-btn-container {
+  display: table-cell;
+  vertical-align: middle;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-arrow-btn {
+  float: left;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container {
+  float: left;
+  position: relative;
+  width: 8.333333333333332rem;
+  height: 1.0555555555555556rem;
+  margin-left: 0px;
+  margin-right: 0px;
+  margin-top: 0px;
+  margin-bottom: 0px;
+  padding-left: 0.2777777777777778rem;
+  padding-right: 0.2777777777777778rem;
+  padding-top: 0.16666666666666669rem;
+  padding-bottom: 0.16666666666666669rem;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container .hsvpicker-clrchannel-mask {
+  position: absolute;
+  width: 8.333333333333332rem;
+  height: 1.0555555555555556rem;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container .hsvpicker-clrchannel-mask-black {
+  background: #000000;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container .hsvpicker-clrchannel-mask-white {
+  background: #ffffff;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container .hsvpicker-clrchannel-selector {
+  position: absolute;
+  left: 0rem;
+  top: 0rem;
+  width: 0.2777777777777778rem;
+  height: 1.1111111111111112rem;
+  border: 0.1388888888888889rem solid black;
+}
+.ui-popupwindow .colorpickerbutton-popup-container-style {
+  display: table;
+  width: 50%;
+  margin: 0 auto;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.todons-colorpalette-disabled .colorpalette-table .colorpalette-choice-active {
+  border-color: #999999 !important;
+}
+.ui-colorpalette {
+  display: table;
+  padding-left: 0.6666666666666666rem;
+  padding-right: 0.6666666666666666rem;
+  padding-top: 0.41666666666666663rem;
+  padding-bottom: 0.41666666666666663rem;
+}
+.ui-colorpalette .colorpalette-preview-container {
+  padding-top: 1.3333333333333333rem;
+  padding-bottom: 1.0833333333333333rem;
+  display: table;
+  margin: auto;
+}
+.ui-colorpalette .colorpalette-preview-container .colorpalette-preview {
+  display: table;
+  margin: auto;
+  width: 8.222222222222223rem;
+  height: 2.8055555555555554rem;
+  border: #c0c0c0 0.1111111111111111rem solid;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-bottom-row {
+  display: table-row;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-normal-row {
+  display: table-row;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-choice-container-left {
+  display: table-cell;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-choice-container-rest {
+  display: table-cell;
+  padding-bottom: 0.4444444444444444rem;
+  padding-left: 1.0555555555555556rem;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-normal-row .colorpalette-choice-container-left {
+  padding-bottom: 0.4444444444444444rem;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-choice {
+  width: 1.2777777777777777rem;
+  height: 1.2777777777777777rem;
+  border-width: 0.1111111111111111rem;
+  border-style: solid;
+  border-color: #c0c0c0;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-choice-active {
+  border-color: #d9931a;
+}
+label.colorpickerbutton_label.ui-input-text {
+  display: block !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-colortitle h1 {
+  margin-left: 0.2777777777777778rem;
+}
+.todons-colortitle-disabled h1 {
+  color: #888888;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-datefield {
+  display: inline-block;
+}
+.ui-datefield div {
+  display: inline-block;
+}
+.ui-datefield div span {
+  margin-right: 0.5555555555555556rem;
+}
+.ui-datefield div .ui-datefield-selected {
+  color: #008cd2;
+}
+.ui-datefield div .ui-datefield-ampm {
+  margin-right: 0;
+  margin-top: 0;
+  top: -0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-datefield div .ui-datefield-ampm span.ui-btn-inner.ui-btn-hastxt {
+  margin-right: 0;
+  padding: 0 0.6944444444444444rem;
+}
+.ui-datefield div .ui-datefield-ampm span.ui-btn-inner.ui-btn-hastxt span {
+  margin-right: 0;
+}
+.ui-datefield .ui-datefield-tab {
+  display: inline-block;
+  min-width: 1.6666666666666665rem;
+}
+.ui-datetimepicker-selector div ul {
+  padding: 0;
+  display: inline;
+  list-style: none;
+  vertical-align: middle;
+  margin: 0;
+}
+.ui-datetimepicker-selector div ul li {
+  font-size: 1.222222222222222rem;
+  float: left;
+  padding: 0.8333333333333333rem 0.2222222222222222rem 0 0.2222222222222222rem;
+  max-width: 5.555555555555555rem;
+  min-width: 5.555555555555555rem;
+}
+.ui-datetimepicker-selector div ul li a.ui-link {
+  text-decoration: none;
+  color: #6997ad;
+}
+.ui-datetimepicker-selector div ul li a.ui-link:hover {
+  color: #6997ad;
+}
+.ui-datetimepicker-selector div ul li.current a.ui-link {
+  color: #f9f9f9;
+}
+.ui-datetimepicker {
+  left: 0 !important;
+  padding: 0;
+}
+.ui-datetimepicker .ui-popupwindow-padding {
+  background: #008cd2 !important;
+  border-radius: 0 !important;
+  -webkit-border-radius: 0 !important;
+  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.6) !important;
+  border-width: 0 !important;
+  text-align: center !important;
+}
+.ui-datetimepicker .ui-popupwindow-padding div {
+  height: 2.944444444444444rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-popupwindow-screen {
+  background: #000000;
+  opacity: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1200;
+}
+.ui-popupwindow {
+  position: absolute;
+  z-index: 1201 !important;
+  background: #536771;
+  color: white;
+  padding: 0.05555555555555555rem 0.05555555555555555rem;
+}
+.ui-popupwindow .center_info {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+}
+.ui-popupwindow .center_info .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_info .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_title {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_title .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_title .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_title .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_basic_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_1btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_basic_1btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_basic_1btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_1btn .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .center_basic_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_2btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_basic_2btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_basic_2btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_2btn .popup-button-bg .ui-btn {
+  width: 7.611111111111111rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_basic_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_3btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_basic_3btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_basic_3btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_3btn .popup-button-bg .ui-btn {
+  width: 5.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_title_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_1btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_title_1btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_title_1btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_title_1btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_title_1btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_1btn .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .center_title_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_2btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_title_2btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_title_2btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_title_2btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_title_2btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_2btn .popup-button-bg .ui-btn {
+  width: 7.611111111111111rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_title_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_3btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_title_3btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_title_3btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_title_3btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_title_3btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_3btn .popup-button-bg .ui-btn {
+  width: 5.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_button_vertical {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_button_vertical .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_button_vertical .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_button_vertical .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 1px;
+  padding-bottom: 0.4444444444444444rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_button_vertical .popup-button-bg .ui-btn {
+  width: 9.888888888888888rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0.4444444444444444rem;
+  margin-bottom: 0rem;
+  margin-left: auto;
+  margin-right: auto;
+}
+.ui-popupwindow .center_checkbox {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_checkbox .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_checkbox .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+  padding-top: 0rem;
+  padding-bottom: 0.611111111111111rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg .ui-checkbox .ui-btn {
+  text-align: center;
+  background: #213c49;
+  border: 0rem;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg .ui-checkbox .ui-btn .ui-btn-inner {
+  border: 0rem;
+}
+.ui-popupwindow .center_checkbox .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_checkbox .popup-button-bg .ui-btn {
+  width: 7.611111111111111rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_liststyle_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: black;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-scroller-bg .ui-listview {
+  height: 14.222222222222221rem;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .center_liststyle_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: black;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-scroller-bg .ui-listview {
+  height: 14.222222222222221rem;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-button-bg .ui-btn {
+  width: 7.611111111111111rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_liststyle_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: black;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-scroller-bg .ui-listview {
+  height: 14.222222222222221rem;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-button-bg .ui-btn {
+  width: 5.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_progressbar .popup-text {
+  font-size: 0.7222222222222222rem;
+  font-color: #999999;
+  background: #213c49;
+  width: 100%;
+  height: 1.9444444444444444rem;
+}
+.ui-popupwindow .center_progressbar .popup-text p {
+  height: 100%;
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem 0rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg {
+  font-size: 0.7222222222222222rem;
+  font-color: #999999;
+  background: #213c49;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 1.3333333333333333rem;
+  padding: 0rem 0.4444444444444444rem 0rem 0.4444444444444444rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 1.3333333333333333rem;
+  padding: 0rem 0.4444444444444444rem 0rem 0.4444444444444444rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_progressbar .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .center_progressbar .popup-progress-bg {
+  background: #213c49;
+  width: 100%;
+  height: 100%;
+}
+.ui-popupwindow .centertext_progressbar {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .centertext_progressbar .popup-text {
+  font-size: 0.7222222222222222rem;
+  font-color: #999999;
+  background: #213c49;
+  width: 100%;
+  padding-top: 0.611111111111111rem;
+  padding-bottom: 0.4444444444444444rem;
+}
+.ui-popupwindow .centertext_progressbar .popup-text p {
+  text-align: center;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg {
+  font-size: 0.7222222222222222rem;
+  font-color: #999999;
+  background: #213c49;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 1.1111111111111112rem;
+  padding: 0.4444444444444444rem 0.4444444444444444rem 0.611111111111111rem 0.4444444444444444rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 1.1111111111111112rem;
+  padding: 0.4444444444444444rem 0.4444444444444444rem 0.611111111111111rem 0.4444444444444444rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popupwindow .centertext_progressbar .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .centertext_progressbar .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .centertext_progressbar .popup-progress-bg {
+  background: #213c49;
+  width: 100%;
+  height: 100%;
+}
+.ui-popupwindow > .ui-volumecontrol {
+  display: table;
+  margin: auto;
+  background: rgba(0, 0, 0, 0.666667);
+  width: 11.555555555555555rem;
+  height: 18.777777777777775rem;
+  padding-top: 0.611111111111111rem;
+}
+.ui-popupwindow > .ui-volumecontrol h1 {
+  font-size: 1.1666666666666665rem;
+  display: table;
+  margin: auto;
+  color: #c0c0c0;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-volumecontrol-icon {
+  display: table;
+  width: 100%;
+  height: 3.5555555555555554rem;
+  padding-top: 0.5833333333333333rem;
+  padding-bottom: 0.5833333333333333rem;
+  padding-left: 4.583333333333333rem;
+  padding-right: 4.583333333333333rem;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-volumecontrol-indicator {
+  display: table;
+  width: 100%;
+  height: 11.666666666666666rem;
+  padding-left: 1.8888888888888888rem;
+  padding-right: 1.8888888888888888rem;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-corner-all {
+  -moz-border-radius: 0.3em !important;
+  -webkit-border-radius: 0.3em !important;
+  border-radius: 0.3em !important;
+}
+.ui-popupwindow-corner-all {
+  -moz-border-radius: 0em !important;
+  -webkit-border-radius: 0em !important;
+  border-radius: 0em !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-ctxpopup {
+  display: table;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-triangle-top {
+  top: 2px;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-triangle-left {
+  left: 2px;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-triangle-right {
+  right: 2px;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-triangle-bottom {
+  bottom: 2px;
+}
+.ui-ctxpopup .ui-ctxpopup-row {
+  display: table-row;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-ctxpopup-cell {
+  display: table-cell;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-popupwindow-padding {
+  background: #2d2d2d;
+  border: none;
+  -webkit-box-shadow: 0rem 0rem 0.3333333333333333rem rgba(0, 0, 0, 0.6);
+  box-shadow: 0rem 0rem 0.3333333333333333rem rgba(0, 0, 0, 0.6);
+  -webkit-border-radius: 0.3em;
+  border-radius: 0.3em;
+}
+.ui-ctxpopup .ui-listview li.ui-btn-up-s, .ui-ctxpopup .ui-listview li.ui-btn-hover-s {
+  background: transparent;
+}
+.ui-ctxpopup .ui-listview li.ui-btn-down-s {
+  background: #0a8cd2;
+}
+.ui-ctxpopup .ui-listview li:last-child {
+  border-bottom-left-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-ctxpopup .ui-listview li:first-child {
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-ctxpopup .ui-listview {
+  border: none;
+}
+.ui-ctxpopup .ui-listview > .ui-li {
+  padding: 0 0.19444444444444442rem;
+}
+.ui-ctxpopup .ui-listview > .ui-li:last-child {
+  border: none;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn {
+  padding: 0;
+  background: transparent;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn .ui-btn-icon-only {
+  width: 3.5555555555555554rem;
+  height: 2.5555555555555554rem;
+  padding: 0;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn .ui-icon {
+  padding: 0.8888888888888888rem 0;
+  height: inherit;
+  width: inherit;
+  margin: 0;
+  background-position: center;
+  -moz-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -o-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -webkit-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  background-size: 1.7777777777777777rem 1.7777777777777777rem;
+}
+.ui-ctxpopup .horizontal .text {
+  padding: 0 0.5555555555555556rem;
+}
+.ui-ctxpopup .horizontal a.ui-link {
+  color: #f9f9f9;
+  text-decoration: none;
+}
+.ui-ctxpopup .horizontal table {
+  border: none;
+  border-spacing: 0;
+}
+.ui-ctxpopup .horizontal td {
+  border-left: 0.027777777777777776rem solid #464646;
+  border-right: 0.027777777777777776rem solid #000000;
+  border-top: 0.027777777777777776rem solid #000000;
+  border-bottom: 0.027777777777777776rem solid #464646;
+}
+.ui-ctxpopup .horizontal td:first-of-type {
+  border-left: none;
+}
+.ui-ctxpopup .horizontal td:last-of-type {
+  border-right: none;
+}
+.ui-ctxpopup .horizontal tr:first-of-type > td {
+  border-top: none;
+}
+.ui-ctxpopup .horizontal tr:last-of-type > td {
+  border-bottom: none;
+}
+.ui-ctxpopup .horizontal tr:first-of-type > td:first-of-type {
+  border-top-left-radius: 0.3em;
+}
+.ui-ctxpopup .horizontal tr:first-of-type > td:last-of-type {
+  border-top-right-radius: 0.3em;
+}
+.ui-ctxpopup .horizontal tr:last-of-type > td:first-of-type {
+  border-bottom-left-radius: 0.3em;
+}
+.ui-ctxpopup .horizontal tr:last-of-type > td:last-of-type {
+  border-bottom-right-radius: 0.3em;
+}
+.ui-ctxpopup .horizontal ul {
+  padding: 0;
+  display: inline-block;
+  list-style: none;
+  vertical-align: middle;
+  margin: 0;
+}
+.ui-ctxpopup .horizontal li {
+  line-height: 2.5555555555555554rem;
+  min-height: 2.5555555555555554rem;
+  float: left;
+  display: inline-block;
+  border-left: 0.027777777777777776rem solid #464646;
+  border-right: 0.027777777777777776rem solid #000000;
+  text-align: center;
+}
+.ui-ctxpopup .horizontal li:first-of-type {
+  border-top-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+  border-left: none;
+}
+.ui-ctxpopup .horizontal li:last-of-type {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+  border-right: none;
+  margin-right: 0;
+}
+.ui-ctxpopup .horizontal li:active, .ui-ctxpopup .horizontal td:active {
+  background: #0a8cd2;
+}
+.ui-ctxpopup .button table .ui-btn {
+  margin: 0.2222222222222222rem;
+  padding: 0;
+  height: 2.0555555555555554rem;
+  width: 4.777777777777778rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+@-webkit-keyframes ui-scale-animation {
+  from {
+    -webkit-transform: scalex(0);
+  }
+  to {
+    -webkit-transform: scalex(1);
+  }
+}
+.ui-progressbar-value {
+  background-image: url(images/00_winset_list_progress_bar.png);
+  height: 100%;
+}
+.ui-progressbar {
+  position: relative;
+  background-image: url(images/00_winset_list_progress_bg.png);
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  height: 0.4444444444444444rem;
+}
+.ui-progress-bg {
+  position: relative;
+  top: 0;
+  background-image: url(images/00_winset_list_progress_bg.png);
+  width: 100%;
+  height: 0.4444444444444444rem;
+}
+.ui-progress-bar {
+  position: relative;
+  top: -0.4444444444444444rem;
+  width: 100%;
+  height: 0.4444444444444444rem;
+  background-image: url(images/00_winset_list_progress_bar.png);
+  -webkit-animation: ui-scale-animation 5s infinite linear;
+  -webkit-transform-origin: 0% 0%;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* Progress - circle style */
+@-webkit-keyframes ui-rotate-animation {
+  from {
+    -webkit-transform: rotate(0deg);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+  }
+}
+.ui-progress-container-circle-bg {
+  position: relative;
+  margin-top: 0.027777777777777776rem;
+  margin-bottom: 0.027777777777777776rem;
+  width: 100%;
+  height: 1.7777777777777777rem;
+}
+.ui-progress-container-circle {
+  position: relative;
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  height: 1.7777777777777777rem;
+  width: 1.7777777777777777rem;
+  float: right;
+  vertical-align: middle;
+}
+.ui-progress-circle {
+  position: relative;
+  top: 0;
+  height: 1.7777777777777777rem;
+  width: 1.7777777777777777rem;
+  background: url(images/process/00_winset_list_process_01.png) no-repeat;
+  -moz-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -o-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -webkit-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  background-size: 1.7777777777777777rem 1.7777777777777777rem;
+}
+.ui-progress-circle-running {
+  -webkit-animation: ui-rotate-animation 1s infinite linear;
+}
+/* Progress - pending style */
+@-webkit-keyframes ui-move-animation {
+  from {
+    -webkit-transform: translatey(-0.8888888888888888rem);
+  }
+  to {
+    -webkit-transform: translatey(0);
+  }
+}
+.ui-progress-container-pending {
+  position: relative;
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  height: 0.4444444444444444rem;
+  overflow: hidden;
+}
+.ui-progress-pending {
+  position: relative;
+  top: 0;
+  width: 100%;
+  height: 1.3333333333333333rem;
+  padding-top: 0;
+  padding-bottom: 0;
+  background: -webkit-linear-gradient(-45deg, transparent, transparent 25%, #008cd2 25%, #008cd2 50%, transparent 50%, transparent 75%, #008cd2 75%);
+  background: -webkit-gradient(linear, left top, right bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(25%, rgba(0, 0, 0, 0)), color-stop(25%, #008cd2), color-stop(50%, #008cd2), color-stop(50%, rgba(0, 0, 0, 0)), color-stop(75%, rgba(0, 0, 0, 0)), color-stop(75%, #008cd2));
+  background-color: #373737;
+  -moz-background-size: 0.8888888888888888rem 0.8888888888888888rem;
+  -o-background-size: 0.8888888888888888rem 0.8888888888888888rem;
+  -webkit-background-size: 0.8888888888888888rem 0.8888888888888888rem;
+  background-size: 0.8888888888888888rem 0.8888888888888888rem;
+}
+.ui-progress-pending-running {
+  -webkit-animation: ui-move-animation 0.5s infinite linear;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+label.ui-slider {
+  display: block;
+}
+input.ui-slider-input {
+  display: inline-block;
+  width: 1.3888888888888888rem;
+}
+select.ui-slider-switch {
+  display: none;
+}
+.ui-slider-bg, .ui-slider-icon-bg {
+  position: relative;
+  margin-left: 0.8888888888888888rem;
+  margin-right: 0.8888888888888888rem;
+  margin-bottom: 0.2em;
+  vertical-align: middle;
+}
+.ui-slider-icon-bg {
+  margin-left: 2.6666666666666665rem;
+  margin-right: 2.6666666666666665rem;
+}
+.ui-slider-left-volume, .ui-slider-left-bright {
+  position: absolute;
+  top: -0.2em;
+  left: -2.6666666666666665rem;
+  height: 2.2222222222222223rem;
+  width: 2.2222222222222223rem;
+  vertical-align: middle;
+  background: url(images/00_slider_btn_brightness01.png) no-repeat;
+  -moz-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -o-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -webkit-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  background-size: 2.2222222222222223rem 2.2222222222222223rem;
+}
+.ui-slider-left-volume {
+  background: url(images/00_slider_btn_volume01.png) no-repeat;
+  -moz-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -o-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -webkit-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  background-size: 2.2222222222222223rem 2.2222222222222223rem;
+}
+.ui-slider-right-volume, .ui-slider-right-bright {
+  position: absolute;
+  top: -0.2em;
+  right: -2.6666666666666665rem;
+  height: 2.2222222222222223rem;
+  width: 2.2222222222222223rem;
+  vertical-align: middle;
+  background: url(images/00_slider_btn_brightness02.png) no-repeat;
+  -moz-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -o-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -webkit-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  background-size: 2.2222222222222223rem 2.2222222222222223rem;
+}
+.ui-slider-right-volume {
+  background: url(images/00_slider_btn_volume02.png) no-repeat;
+  -moz-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -o-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -webkit-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  background-size: 2.2222222222222223rem 2.2222222222222223rem;
+}
+.ui-slider-left-text {
+  position: absolute;
+  top: -0.2em;
+  left: -2.6666666666666665rem;
+  height: 2.2222222222222223rem;
+  width: 2.2222222222222223rem;
+  text-align: center;
+  color: #646464;
+}
+.ui-slider-right-text {
+  position: absolute;
+  top: -0.2em;
+  right: -2.6666666666666665rem;
+  height: 2.2222222222222223rem;
+  width: 2.2222222222222223rem;
+  text-align: center;
+  color: #646464;
+}
+div.ui-slider {
+  display: inline-block;
+  overflow: visible;
+  height: 0.4444444444444444rem;
+  width: 100%;
+  background-image: url(images/00_winset_list_progress_bg.png);
+}
+div.ui-slider .ui-btn {
+  top: 0.15em !important;
+}
+div.ui-slider .ui-btn-inner {
+  padding: 0.4em 0rem;
+}
+div.ui-slider .ui-btn-text {
+  color: #2a6d8c;
+}
+a.ui-slider-handle {
+  position: relative;
+  z-index: 10;
+  top: -0.5833333333333333rem;
+  width: 1.611111111111111rem;
+  height: 1.611111111111111rem;
+  margin-top: -0.8055555555555555rem;
+  margin-left: -0.8055555555555555rem;
+  color: #2a6d8c;
+  background: url(images/00_slider_handle.png) no-repeat;
+  -moz-background-size: 1.611111111111111rem 1.611111111111111rem;
+  -o-background-size: 1.611111111111111rem 1.611111111111111rem;
+  -webkit-background-size: 1.611111111111111rem 1.611111111111111rem;
+  background-size: 1.611111111111111rem 1.611111111111111rem;
+}
+.ui-slider-popup {
+  position: absolute !important;
+  width: 2.833333333333333rem;
+  height: 2.833333333333333rem;
+  text-align: center;
+  padding-top: 0.5em;
+  z-index: 100;
+  opacity: 0.9;
+  background: url(images/00_slider_popup_bg.png) no-repeat;
+  -moz-background-size: 2.833333333333333rem 2.833333333333333rem;
+  -o-background-size: 2.833333333333333rem 2.833333333333333rem;
+  -webkit-background-size: 2.833333333333333rem 2.833333333333333rem;
+  background-size: 2.833333333333333rem 2.833333333333333rem;
+}
+.ui-slider-bar {
+  position: absolute;
+  top: 0.8em;
+  height: 0.4444444444444444rem;
+  width: 0;
+  background-image: url(images/00_winset_list_progress_bar.png);
+}
+.ui-slider-handle-press {
+  position: absolute;
+  z-index: 15;
+  width: 1.611111111111111rem;
+  height: 1.611111111111111rem;
+  background: url(images/00_slider_handle_press.png) no-repeat;
+  -moz-background-size: 1.611111111111111rem 1.611111111111111rem;
+  -o-background-size: 1.611111111111111rem 1.611111111111111rem;
+  -webkit-background-size: 1.611111111111111rem 1.611111111111111rem;
+  background-size: 1.611111111111111rem 1.611111111111111rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-imageslider {
+  position: relative;
+  width: 100%;
+}
+.ui-imageslider-bg {
+  display: none;
+  position: absolute;
+  text-align: center;
+  width: 100%;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* tickernoti */
+@-webkit-keyframes ui-ticker-show {
+  from {
+    opacity: 0;
+    -webkit-transform: translatey(-2.7777777777777777rem);
+    top: -2.7777777777777777rem;
+  }
+  to {
+    opacity: 1;
+    -webkit-transform: translatey(0);
+    top: 0;
+  }
+}
+@-webkit-keyframes ui-ticker-hide {
+  from {
+    opacity: 1;
+    -webkit-transform: translatey(0);
+    top: 0;
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translatey(-2.7777777777777777rem);
+    top: -2.7777777777777777rem;
+  }
+}
+.ui-ticker {
+  position: fixed;
+  display: none;
+  left: 0;
+  width: 100%;
+  height: 2.7777777777777777rem;
+  z-index: 2147483547;
+  background: #6c6c6c;
+}
+.ui-ticker.fix {
+  display: block;
+}
+.ui-ticker.show {
+  display: block;
+  -webkit-animation: ui-ticker-show 0.8s 1 ease;
+  top: 0;
+}
+.ui-ticker.hide {
+  display: block;
+  -webkit-animation: ui-ticker-hide 0.8s 1 ease;
+  top: -2.7777777777777777rem;
+}
+.ui-ticker-btn {
+  position: relative;
+  height: 1.5rem;
+  margin-top: 0.6388888888888888rem;
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  vertical-align: middle;
+  float: right;
+}
+.ui-ticker-btn .ui-btn-inner {
+  padding: 0.3em 0.7em;
+}
+.ui-ticker-icon {
+  position: absolute;
+  top: 0;
+  height: 1.7777777777777777rem;
+  width: 1.7777777777777777rem;
+  margin-top: 0.5rem;
+  margin-bottom: 0.5rem;
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  vertical-align: middle;
+  /* FIXME: please fix this image file */
+
+  background: url(images/00_button_call.png) no-repeat;
+  -moz-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -o-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -webkit-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  background-size: 1.7777777777777777rem 1.7777777777777777rem;
+}
+.ui-ticker-text1-bg {
+  position: absolute;
+  top: 0;
+  height: 0.7777777777777777rem;
+  left: 2.6666666666666665rem;
+  margin-top: 0.5555555555555556rem;
+  font-size: 0.8em;
+  color: #bababa;
+}
+.ui-ticker-text2-bg {
+  position: absolute;
+  top: 0;
+  height: 0.8888888888888888rem;
+  left: 2.6666666666666665rem;
+  margin-top: 1.3333333333333333rem;
+  color: #f4f4f4;
+}
+/* smallpopup */
+@-webkit-keyframes ui-smallpopup-show {
+  from {
+    opacity: 0;
+    -webkit-transform: scaley(0);
+  }
+  to {
+    opacity: 1;
+    -webkit-transform: scaley(1);
+  }
+}
+@-webkit-keyframes ui-smallpopup-hide {
+  from {
+    opacity: 1;
+    height: 1.3333333333333333rem;
+    left: 0;
+    -webkit-transform: scaley(1);
+  }
+  to {
+    opacity: 0;
+    height: 0;
+    left: 0;
+    -webkit-transform: scaley(0);
+  }
+}
+.ui-smallpopup {
+  position: fixed;
+  display: none;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 1.3333333333333333rem;
+  z-index: 1100;
+  background: #344a55;
+  vertical-align: middle;
+}
+.ui-smallpopup.fix {
+  display: block;
+}
+.ui-smallpopup.show {
+  display: block;
+  -webkit-animation: ui-smallpopup-show 0.5s 1 ease;
+}
+.ui-smallpopup.hide {
+  display: block;
+  left: -100%;
+  -webkit-animation: ui-smallpopup-hide 0.5s 1 ease;
+}
+.ui-smallpopup-text-bg {
+  position: relative;
+  margin-top: 0.16666666666666666rem;
+  margin-left: 0.4444444444444444rem;
+  color: #f9f9f9;
+}
+/*
+ * pagrcontrol stylesheet
+ * by Youmin Ha <youmin.ha@samsung.com>
+ */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+div.pagecontrol {
+  text-align: center;
+}
+div.pagecontrol > div.page_n {
+  display: inline-block;
+  border: 0;
+  width: 1.4444444444444444rem;
+  height: 1.4444444444444444rem;
+}
+div.pagecontrol > div.page_n_margin_44 {
+  margin-left: 0.611111111111111rem;
+  margin-right: 0.611111111111111rem;
+}
+div.pagecontrol > div.page_n_margin_35 {
+  margin-left: 0.4722222222222222rem;
+  margin-right: 0.4444444444444444rem;
+}
+div.pagecontrol > div.page_n_margin_26 {
+  margin-left: 0.3333333333333333rem;
+  margin-right: 0.3333333333333333rem;
+}
+div.pagecontrol > div.page_n_margin_19 {
+  margin-left: 0.25rem;
+  margin-right: 0.2222222222222222rem;
+}
+div.pagecontrol > div.page_n_dot {
+  background-image: url('images/00_mainmenu_page_bar_001.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_1 {
+  background-image: url('images/00_mainmenu_page_bar_1.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_2 {
+  background-image: url('images/00_mainmenu_page_bar_2.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_3 {
+  background-image: url('images/00_mainmenu_page_bar_3.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_4 {
+  background-image: url('images/00_mainmenu_page_bar_4.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_5 {
+  background-image: url('images/00_mainmenu_page_bar_5.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_6 {
+  background-image: url('images/00_mainmenu_page_bar_6.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_7 {
+  background-image: url('images/00_mainmenu_page_bar_7.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_8 {
+  background-image: url('images/00_mainmenu_page_bar_8.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_9 {
+  background-image: url('images/00_mainmenu_page_bar_9.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_10 {
+  background-image: url('images/00_mainmenu_page_bar_10.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-swipelist {
+  list-style-type: none;
+}
+.ui-swipelist-item {
+  -webkit-user-select: none;
+  -user-select: none;
+}
+.ui-swipelist-item .ui-btn {
+  margin-top: -0.3em !important;
+}
+.ui-swipelist-item-cover {
+  position: absolute;
+  border: none;
+  top: 0%;
+  left: 0%;
+  width: 100%;
+  height: 100%;
+  z-index: 100;
+}
+.ui-swipelist-item-cover .ui-li-text-main {
+  position: absolute;
+}
+.ui-swipelist-item-cover .ui-li-text-sub-left {
+  margin-top: 0.8em !important;
+  margin-left: 0.4444444444444444rem !important;
+}
+.ui-swipelist-item-cover .ui-li-text-main-right {
+  margin-top: 0.7em !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-nocontents {
+  position: relative;
+  left: 0;
+  width: 100%;
+  height: 14.11111111111111rem;
+}
+.ui-nocontents-icon-text,
+.ui-nocontents-icon-picture,
+.ui-nocontents-icon-multimedia,
+.ui-nocontents-icon-unnamed {
+  position: absolute;
+  display: block;
+  width: 8.722222222222221rem;
+  height: 8.61111111111111rem;
+  background: url(images/00_Nocontents_text.png) no-repeat;
+  -moz-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -o-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -webkit-background-size: 8.61111111111111rem 8.722222222222221rem;
+  background-size: 8.61111111111111rem 8.722222222222221rem;
+}
+.ui-nocontents-icon-picture {
+  background: url(images/00_Nocontents_picture.png) no-repeat;
+  -moz-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -o-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -webkit-background-size: 8.61111111111111rem 8.722222222222221rem;
+  background-size: 8.61111111111111rem 8.722222222222221rem;
+}
+.ui-nocontents-icon-multimedia {
+  background: url(images/00_Nocontents_multimedia.png) no-repeat;
+  -moz-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -o-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -webkit-background-size: 8.61111111111111rem 8.722222222222221rem;
+  background-size: 8.61111111111111rem 8.722222222222221rem;
+}
+.ui-nocontents-icon-unnamed {
+  background: url(images/00_Nocontents_unnamed.png) no-repeat;
+  -moz-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -o-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -webkit-background-size: 8.61111111111111rem 8.722222222222221rem;
+  background-size: 8.61111111111111rem 8.722222222222221rem;
+}
+.ui-nocontents-text {
+  position: absolute;
+  height: 1.2777777777777777rem;
+  width: 100%;
+  text-align: center;
+  color: #514e4c;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-shortcutscroll {
+  position: absolute;
+  right: 0rem;
+  background-color: rgba(68, 68, 68, 0.5);
+  width: 0.8333333333333333rem;
+  -webkit-user-select: none;
+  margin: 0;
+  padding-right: 0.08em;
+  opacity: 1;
+}
+.ui-shortcutscroll ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+.ui-shortcutscroll li {
+  cursor: pointer;
+  color: rgba(180, 180, 180, 0.6);
+  padding: 0.05555555555555555rem 0.05555555555555555rem 0.05555555555555555rem 0.05555555555555555rem;
+  text-align: right;
+}
+.ui-shortcutscroll2 {
+  position: absolute;
+  right: 0rem;
+  -webkit-user-select: none;
+  margin: 0;
+  padding-right: 0.08em;
+  opacity: 1;
+}
+.ui-shortcutscroll2 ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+.ui-shortcutscroll2 li {
+  cursor: pointer;
+  color: rgba(180, 180, 180, 0.6);
+  padding: 0.05555555555555555rem 0.05555555555555555rem 0.05555555555555555rem 0.05555555555555555rem;
+  text-align: right;
+}
+.ui-shortcutscroll-bg {
+  position: absolute;
+  right: 0rem;
+  background-color: rgba(68, 68, 68, 0.5);
+  width: 0.8333333333333333rem;
+  z-index: 10;
+  top: 0;
+}
+.ui-shortcutscroll-popup {
+  position: absolute;
+  background: #738993;
+  color: #f9f9f9;
+  padding: 0.2777777777777778rem 0.8333333333333333rem;
+  -moz-box-shadow: 0.2222222222222222rem 0.2777777777777778rem 0rem rgba(199, 199, 199, 0.5);
+  -webkit-box-shadow: 0.2222222222222222rem 0.2777777777777778rem 0rem rgba(199, 199, 199, 0.5);
+  box-shadow: 0.2222222222222222rem 0.2777777777777778rem 0rem rgba(199, 199, 199, 0.5);
+  text-align: center;
+  font-size: 2.083333333333333rem;
+  font-weight: bold;
+  display: none;
+  box-sizing: border-box;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* dayselector CSS */
+.ui-dayselector label {
+  height: 1.5555555555555554rem;
+  width: 1.7777777777777777rem;
+}
+.ui-dayselector {
+  display: inline-block;
+}
+.ui-dayselector .ui-btn {
+  border-color: #646464;
+  border-style: solid;
+  border-width: 0.027777777777777776rem;
+}
+.ui-dayselector .ui-btn .ui-btn-inner {
+  text-align: center;
+  padding: 0.8em 0px;
+}
+.ui-dayselector .ui-checkbox-off {
+  background: #3b3b3b;
+}
+.ui-dayselector .ui-checkbox-off .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-dayselector .ui-checkbox-off.ui-btn-down-s.ui-btn-hover-s {
+  background: #008cd2;
+}
+.ui-dayselector .ui-checkbox-on {
+  background: #008cd2;
+}
+.ui-dayselector .ui-checkbox-on .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-dayselector .ui-checkbox-on.ui-btn-down-s.ui-btn-hover-s {
+  background: #3b3b3b;
+}
+.ui-dayselector .ui-dayselector-label-6 .ui-btn-text {
+  color: #00a8e7;
+}
+.ui-dayselector .ui-dayselector-label-6.ui-checkbox-on .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-dayselector .ui-dayselector-label-0 .ui-btn-text {
+  color: #f01402;
+}
+.ui-dayselector .ui-checkbox {
+  height: 2.5rem;
+}
+.ui-dayselector .ui-checkbox .ui-btn {
+  width: 2.611111111111111rem;
+}
+.ui-dayselector .ui-checkbox .ui-btn.ui-corner-left {
+  border-top-left-radius: 0.1388888888888889rem;
+  border-bottom-left-radius: 0.1388888888888889rem;
+}
+.ui-dayselector .ui-checkbox .ui-btn.ui-corner-right {
+  border-top-right-radius: 0.1388888888888889rem;
+  border-bottom-right-radius: 0.1388888888888889rem;
+}
+.ui-dayselector .todons-dayselector-disabled .ui-dayselector-label-6 {
+  color: #121212;
+}
+.ui-dayselector .todons-dayselector-disabled .ui-dayselector-label-0 {
+  color: #363636;
+}
+.ui-dayselector.ui-controlgroup-vertical .ui-checkbox .ui-btn {
+  width: 2.7777777777777777rem;
+}
+.ui-dayselector.ui-controlgroup-vertical .ui-checkbox .ui-btn .ui-btn-text {
+  margin-left: 0rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-toggleswitch {
+  position: relative;
+  overflow: hidden;
+  background: #3b3b3b;
+}
+.ui-toggleswitch .toggleswitch-background {
+  position: absolute;
+  margin: 0px;
+  border: 0px;
+  left: 0px;
+  right: 0px;
+  top: 0px;
+  bottom: 0px;
+  pointer-events: none;
+}
+.ui-toggleswitch .toggleswitch-sizer {
+  margin: 0px;
+  opacity: 0;
+  pointer-events: none;
+}
+.ui-toggleswitch .toggleswitch-floating-button {
+  background: #f9f9f9;
+  position: absolute;
+  margin: 0px;
+  left: 0px;
+  right: 0px;
+}
+.ui-toggleswitch .ui-btn-inner {
+  padding: 0.05555555555555555rem 0.19444444444444442rem !important;
+}
+.ui-toggleswitch .toggleswitch-mover {
+  border-color: transparent;
+  background: none;
+  pointer-events: none;
+}
+.tizen-huegradient {
+    background: none; /* Old browsers */
+    background: -webkit-gradient(linear, left top, right top,
+        color-stop(  0%          ,rgba(255,  0,  0,1)),
+        color-stop( 16.666666667%,rgba(255,255,  0,1)),
+        color-stop( 33.333333333%,rgba(0  ,255,  0,1)),
+        color-stop( 50%          ,rgba(0  ,255,255,1)),
+        color-stop( 66.666666667%,rgba(0  ,  0,255,1)),
+        color-stop( 83.333333333%,rgba(255,  0,255,1)),
+        color-stop(100%          ,rgba(255,  0,  0,1))); /* Chrome,Safari4+ */
+    background: -moz-linear-gradient(left, 
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+    background: -webkit-linear-gradient(left,
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+    background: -o-linear-gradient(left,
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+    background: -ms-linear-gradient(left,
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+    background: linear-gradient(left,
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+}
+
+/* Full-saturation magic grayscale values were taken from the Gimp */
+.tizen-huegradient-disabled {
+    background: none; /* Old browsers */
+    background: -webkit-gradient(linear, left top, right top,
+        color-stop(  0%          ,rgba( 54, 54, 54,1)),
+        color-stop( 16.666666667%,rgba(237,237,237,1)),
+        color-stop( 33.333333333%,rgba(182,182,182,1)),
+        color-stop( 50%          ,rgba(201,201,201,1)),
+        color-stop( 66.666666667%,rgba( 18, 18, 18,1)),
+        color-stop( 83.333333333%,rgba( 73, 73, 73,1)),
+        color-stop(100%          ,rgba( 54, 54, 54,1))); /* Chrome,Safari4+ */
+    background: -moz-linear-gradient(left, 
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+    background: -webkit-linear-gradient(left,
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+    background: -o-linear-gradient(left,
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+    background: -ms-linear-gradient(left,
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+    background: linear-gradient(left,
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+}
+/* Own CSS */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* @selector-size should be an odd number, in order to pixel-perfectly center on a given colour */
+.ui-colorpicker {
+  display: table;
+}
+.ui-colorpicker .colorpicker-hs-container {
+  position: relative;
+  display: table-cell;
+  float: left;
+  width: 7.111111111111111rem;
+  height: 7.111111111111111rem;
+  padding: 1.1388888888888888rem;
+}
+.ui-colorpicker .colorpicker-hs-container .colorpicker-hs-mask {
+  position: absolute;
+  width: 7.111111111111111rem;
+  height: 7.111111111111111rem;
+}
+.ui-colorpicker .colorpicker-hs-container .colorpicker-hs-selector {
+  position: absolute;
+  width: 2rem;
+  height: 2rem;
+  border: 0.1388888888888889rem solid black;
+}
+.ui-colorpicker .colorpicker-l-container {
+  position: relative;
+  float: left;
+  width: 0.5rem;
+  height: 7.111111111111111rem;
+  padding-left: 1px;
+  padding-right: 1px;
+  padding-top: 1.1388888888888888rem;
+  padding-bottom: 1.1388888888888888rem;
+}
+.ui-colorpicker .colorpicker-l-container .colorpicker-l-mask {
+  position: absolute;
+  width: 0.5rem;
+  height: 7.111111111111111rem;
+  left: 0.8888888888888888rem;
+}
+.ui-colorpicker .colorpicker-l-container .colorpicker-l-selector {
+  left: 0px;
+  position: absolute;
+  width: 2rem;
+  height: 2rem;
+  border: 0.1388888888888889rem solid black;
+}
+.ui-colorpicker .colorpicker-hs-container .sat-gradient {
+  background: none;
+  /* Old browsers */
+
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(128, 128, 128, 0)), color-stop(100%, #808080));
+  /* Chrome,Safari4+ */
+
+  background: -moz-linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* FF3.6+ */
+
+  background: -webkit-linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* Chrome10+,Safari5.1+ */
+
+  background: -o-linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* Opera11.10+ */
+
+  background: -ms-linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* IE10+ */
+
+  background: linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* W3C */
+
+  /* filter: progid:DXImageTransform.Microsoft.gradient (startColorstr='#00808080', endColorstr="#808080", GradientType = 0); */
+
+}
+.ui-colorpicker .colorpicker-l-container .l-gradient {
+  background: none;
+  /* Old browsers */
+
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #000000), color-stop(100%, #ffffff));
+  /* Chrome,Safari4+ */
+
+  background: -moz-linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* FF3.6+ */
+
+  background: -webkit-linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* Chrome10+,Safari5.1+ */
+
+  background: -o-linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* Opera11.10+ */
+
+  background: -ms-linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* IE10+ */
+
+  background: linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* W3C */
+
+  /* filter: progid:DXImageTransform.Microsoft.gradient (startColorstr='#000000', endColorstr="#ffffff", GradientType = 0); */
+
+}
+/* Need to add !important below, because these classes are added before jqm enhancement */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-colorpickerbutton-input {
+  max-width: 4.166666666666666rem;
+  display: inline-block !important;
+}
+.ui-colorpickerbutton-input-hidden {
+  display: none !important;
+}
+.ui-triangle-container {
+  position: relative;
+}
+.ui-triangle-container .ui-triangle {
+  position: absolute;
+  border-style: solid;
+  border-color: transparent;
+  border-width: 12px;
+}
+.ui-triangle-container .ui-triangle-top {
+  top: 0px;
+  border-top-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -12px;
+}
+.ui-triangle-container .ui-triangle-bottom {
+  bottom: 0px;
+  border-bottom-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -12px;
+}
+.ui-triangle-container .ui-triangle-left {
+  left: 0px;
+  margin-top: -12px;
+  border-left-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container .ui-triangle-right {
+  right: 0px;
+  margin-top: -12px;
+  border-right-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container-top {
+  height: 12px;
+  top: 0px;
+  margin-top: -12px;
+}
+.ui-triangle-container-bottom {
+  height: 12px;
+  bottom: 0px;
+  margin-bottom: -12px;
+}
+.ui-triangle-container-left {
+  width: 12px;
+}
+.ui-triangle-container-right {
+  width: 12px;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-multibuttonentry {
+  display: table;
+  background-color: #DDDDDD;
+  outline: none;
+}
+.ui-multibuttonentry .ui-multibuttonentry-label {
+  display: inline-block;
+  text-align: center;
+  position: relative;
+  margin: .3em;
+  padding: .2em .5em;
+  color: #222222;
+  font-weight: bold;
+  text-align: center;
+  font-size: 1em;
+  background-color: #DDDDDD;
+}
+.ui-multibuttonentry-input {
+  display: inline-block;
+  outline: none;
+  position: relative;
+  border: 0 !important;
+  padding: 0 !important;
+  margin: .5em;
+  color: #222222;
+  text-align: left;
+  font-size: 1em;
+  background-color: #DDDDDD;
+}
+.ui-multibuttonentry div, .ui-multibuttonentry a {
+  display: inline-block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  margin: .3em;
+  padding: .2em .5em;
+  font-size: 1em;
+  text-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.3);
+  -webkit-border-radius: .5em;
+  -moz-border-radius: .5em;
+  border-radius: .5em;
+  -webkit-box-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.2);
+  box-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.2);
+  color: #fef4e9;
+}
+a.ui-multibuttonentry-link {
+  float: right;
+  color: #ffffff !important;
+  font-size: 1em;
+  font-weight: bold;
+  text-decoration: none;
+  border: solid 1px #696969;
+  background: #a9a9a9;
+  background: -webkit-gradient(linear, left top, left bottom, from(#a9a9a9), to(#696969));
+  background: -moz-linear-gradient(top, #a9a9a9, #696969);
+}
+div.ui-multibuttonentry-block {
+  border: solid 1px #da7c0c;
+  background: #f78d1d;
+  background: -webkit-gradient(linear, left top, left bottom, from(#faa51a), to(#f47a20));
+  background: -moz-linear-gradient(top, #faa51a, #f47a20);
+}
+div.ui-multibuttonentry-sblock {
+  border: solid 1px #0033FF;
+  background: #0099FF;
+  background: -webkit-gradient(linear, left top, left bottom, from(#00ffff), to(#0099ff));
+  background: -moz-linear-gradient(top, #00ffff, #0099ff);
+}
+.ui-multibuttonentry .ui-multibuttonentry-desclabel {
+  display: inline-block;
+  outline: none;
+  position: relative;
+  border: 0;
+  color: #222222;
+  text-align: left;
+  font-size: 1em;
+  background-color: #DDDDDD;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-handler {
+  position: absolute;
+  overflow: hidden;
+}
+.ui-handler-y {
+  top: 0.2777777777777778rem;
+  right: 0.2777777777777778rem;
+  bottom: 0.2777777777777778rem;
+  width: 1.3333333333333333rem;
+}
+.ui-handler-x {
+  right: 0.2777777777777778rem;
+  bottom: 0.2777777777777778rem;
+  left: 0.2777777777777778rem;
+  height: 1.3333333333333333rem;
+}
+.ui-handler-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-handler-thumb {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background-color: rgba(255, 255, 255, 0.5);
+  background-position: center;
+  background-repeat: no-repeat;
+  -moz-border-radius: 0.1388888888888889rem;
+  -webkit-border-radius: 0.1388888888888889rem;
+  border-radius: 0.1388888888888889rem;
+}
+.ui-handler-y .ui-handler-thumb {
+  width: 1.3333333333333333rem;
+  height: 5.944444444444444rem;
+  background-image: url("images/00_scroll_bar_handler.png");
+  background-size: 1.3333333333333333rem 1.1111111111111112rem;
+}
+.ui-handler-x .ui-handler-thumb {
+  width: 5.944444444444444rem;
+  height: 1.3333333333333333rem;
+  background-image: url("images/00_scroll_bar_handler_hor.png");
+  background-size: 1.1111111111111112rem 1.3333333333333333rem;
+}
+/*
+ * jQuery Mobile Framework
+ * Copyright (c) jQuery Project
+ * Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt)
+ * licenses.
+ */
+/*** less definitions ***/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-virtualgrid {
+  overflow: hidden;
+  position: absolute;
+}
+.ui-virtualgrid-wrapblock {
+  position: absolute;
+  left: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-multimediaview {
+  background-color: #000000;
+  overflow: hidden;
+}
+.ui-multimediaview-wrap {
+  width: 100%;
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+.ui-multimediaview-fullscreen {
+  position: absolute !important;
+  z-index: 1100 !important;
+}
+.ui-multimediaview-audio {
+  background-color: #000000 !important;
+}
+.ui-multimediaview-control span {
+  display: inline-block;
+}
+.ui-multimediaview-control span.ui-play-icon {
+  background-image: url("./images/controlbar/01_controlbar_icon_Play.png");
+}
+.ui-multimediaview-control span.ui-pause-icon {
+  background-image: url("./images/controlbar/01_controlbar_icon_pause.png");
+}
+.ui-multimediaview-control span.ui-stop-icon {
+  background-image: url(./images/stop.png);
+}
+.ui-multimediaview-control span.ui-ff-icon {
+  background: url(./images/controlbar/01_controlbar_icon_FF.png);
+}
+.ui-multimediaview-control span.ui-rew-icon {
+  background-image: url(./images/controlbar/01_controlbar_icon_REW.png);
+}
+.ui-multimediaview-control span.ui-volume-icon {
+  background-image: url(./images/Volume/00_volume_icon.png);
+}
+.ui-multimediaview-control span.ui-mute-icon {
+  background-image: url(./images/Volume/00_volume_icon_Mute.png);
+}
+.ui-multimediaview-control span.ui-fullscreen-on {
+  background-image: url(./images/00_button_fullscreen_on.png);
+}
+.ui-multimediaview-control span.ui-fullscreen-off {
+  background-image: url(./images/00_button_fullscreen_off.png);
+}
+.ui-multimediaview-control {
+  position: absolute;
+  display: block;
+  z-index: 1101 !important;
+  padding: 0;
+  margin: 0;
+  outline: 0;
+  border: 0;
+  background-color: rgba(0, 0, 0, 0.5);
+  height: 2.333333333333333rem;
+}
+.ui-multimediaview-control span.ui-button {
+  background-position: center center;
+  background-size: 80%;
+  background-repeat: no-repeat;
+  width: 2.0555555555555554rem;
+  height: 2.0555555555555554rem;
+  -webkit-border-radius: 0.16666666666666666rem;
+  -moz-border-radius: 0.16666666666666666rem;
+  border-radius: 0.16666666666666666rem;
+  background-color: #555555;
+  margin: 0.1111111111111111rem;
+}
+.ui-multimediaview-control .ui-playpausebutton {
+  background-color: transparent !important;
+  float: left;
+}
+.ui-multimediaview-control .ui-timestamplabel {
+  text-align: center;
+  color: #2a6d8c;
+  float: left;
+}
+.ui-multimediaview-control .ui-timestamplabel p {
+  margin: 0;
+  text-align: center;
+  font-size: 0.611111111111111rem;
+  line-height: 0.7777777777777777rem;
+  text-align: left;
+}
+.ui-multimediaview-control .ui-durationlabel {
+  text-align: center;
+  color: #ffffff;
+  float: right;
+}
+.ui-multimediaview-control .ui-durationlabel p {
+  margin: 0rem;
+  text-align: center;
+  font-size: 0.611111111111111rem;
+  line-height: 0.7777777777777777rem;
+  text-align: right;
+}
+.ui-multimediaview-control .ui-seekbar {
+  margin-top: 0.5555555555555556rem;
+  padding-left: 0.1111111111111111rem;
+  padding-right: 0.1111111111111111rem;
+  height: 0.4444444444444444rem;
+  float: left;
+}
+.ui-multimediaview-control .ui-seekbar .ui-duration {
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  height: 0.4444444444444444rem;
+  background-color: #373737;
+  -webkit-border-radius: 0.08333333333333333rem;
+  -moz-border-radius: 0.08333333333333333rem;
+  border-radius: 0.08333333333333333rem;
+}
+.ui-multimediaview-control .ui-seekbar .ui-currenttime {
+  margin: 0;
+  padding: 0;
+  height: 0.4444444444444444rem;
+  position: absolute;
+  background-color: #2a6d8c;
+  -webkit-border-radius: 0.08333333333333333rem;
+  -moz-border-radius: 0.08333333333333333rem;
+  border-radius: 0.08333333333333333rem;
+}
+.ui-multimediaview-control .ui-volumecontrol {
+  width: 6.111111111111111rem;
+  height: 100%;
+  float: left;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar {
+  height: 100%;
+  padding-top: 0.9166666666666666rem;
+  padding-left: 1.1111111111111112rem;
+  display: block;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-guide {
+  width: 4.444444444444445rem;
+  height: 0.4444444444444444rem;
+  position: absolute;
+  background-color: white;
+  -webkit-border-radius: 0.08333333333333333rem;
+  -moz-border-radius: 0.08333333333333333rem;
+  border-radius: 0.08333333333333333rem;
+  background-color: #373737;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-value {
+  margin: 0;
+  padding: 0;
+  height: 0.4444444444444444rem;
+  position: absolute;
+  -webkit-border-radius: 0.08333333333333333rem;
+  -moz-border-radius: 0.08333333333333333rem;
+  border-radius: 0.08333333333333333rem;
+  background-color: #2a6d8c;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-handler {
+  margin: 0;
+  padding: 0;
+  width: 0.8333333333333333rem;
+  height: 0.8333333333333333rem;
+  position: absolute;
+  -webkit-border-radius: 0.1388888888888889rem;
+  -moz-border-radius: 0.1388888888888889rem;
+  border-radius: 0.1388888888888889rem;
+  background-color: #f9f9f9;
+}
diff --git a/samples/hello-cordova/.project b/samples/hello-cordova/.project
new file mode 100644
index 0000000..f25c1de
--- /dev/null
+++ b/samples/hello-cordova/.project
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>hello-cordova</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.wst.common.project.facet.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>json.validation.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.jslint.nature.JSLintBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.wst.validation.validationbuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.project.builder.WACBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.tizen.web.css.nature.CSSBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+		<nature>json.validation.nature</nature>
+		<nature>org.tizen.web.jslint.nature.JSLintNature</nature>
+		<nature>org.tizen.web.WACnature</nature>
+		<nature>org.tizen.web.css.nature.CSSNature</nature>
+		<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+		<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+	</natures>
+</projectDescription>
diff --git a/samples/hello-cordova/config.xml b/samples/hello-cordova/config.xml
new file mode 100644
index 0000000..380df82
--- /dev/null
+++ b/samples/hello-cordova/config.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" version="2.0 Beta" viewmodes="fullscreen" id="http://io.cordova.hello-cordova">  
+	<icon src="icon.png"/>  
+	<description>A sample Apache Cordova application that responds to the deviceready event.</description>  
+	<author href="http://cordova.io" email="callback-dev@incubator.apache.org">Apache Cordova Team</author>  
+	<content src="index.html"/>  
+	<feature name="http://tizen.org/api/application" required="true"/>  
+	<feature name="http://tizen.org/api/application.kill" required="true"/>  
+	<feature name="http://tizen.org/api/application.launch" required="true"/>  
+	<feature name="http://tizen.org/api/application.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact" required="true"/>  
+	<feature name="http://tizen.org/api/contact.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact.write" required="true"/>  
+	<feature name="http://tizen.org/api/systeminfo" required="true"/>  
+	<feature name="http://tizen.org/api/time" required="true"/>  
+	<feature name="http://tizen.org/api/time.read" required="true"/>  
+	<feature name="http://tizen.org/api/time.write" required="true"/>  
+	<feature name="http://tizen.org/api/tizen" required="true"/>  
+	<name>Hello Cordova</name> 
+</widget>
diff --git a/samples/hello-cordova/cordova-2.0.0.js b/samples/hello-cordova/cordova-2.0.0.js
new file mode 100644
index 0000000..ee17d0d
--- /dev/null
+++ b/samples/hello-cordova/cordova-2.0.0.js
@@ -0,0 +1,6957 @@
+// commit 870218e03979cb7fb6fcae8cd8532008d163d6cc
+
+// File generated at :: Thu Aug 02 2012 17:18:02 GMT+0200 (CEST)
+
+/*
+ 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.
+*/
+
+;(function() {
+
+// file: lib/scripts/require.js
+var require,
+    define;
+
+(function () {
+    var modules = {};
+
+    function build(module) {
+        var factory = module.factory;
+        module.exports = {};
+        delete module.factory;
+        factory(require, module.exports, module);
+        return module.exports;
+    }
+
+    require = function (id) {
+        if (!modules[id]) {
+            throw "module " + id + " not found";
+        }
+        return modules[id].factory ? build(modules[id]) : modules[id].exports;
+    };
+
+    define = function (id, factory) {
+        if (modules[id]) {
+            throw "module " + id + " already defined";
+        }
+
+        modules[id] = {
+            id: id,
+            factory: factory
+        };
+    };
+
+    define.remove = function (id) {
+        delete modules[id];
+    };
+
+})();
+
+//Export for use in node
+if (typeof module === "object" && typeof require === "function") {
+    module.exports.require = require;
+    module.exports.define = define;
+}
+// file: lib/cordova.js
+define("cordova", function(require, exports, module) {
+var channel = require('cordova/channel');
+
+/**
+ * Listen for DOMContentLoaded and notify our channel subscribers.
+ */
+document.addEventListener('DOMContentLoaded', function() {
+    channel.onDOMContentLoaded.fire();
+}, false);
+if (document.readyState == 'complete' || document.readyState == 'interactive') {
+    channel.onDOMContentLoaded.fire();
+}
+
+/**
+ * Intercept calls to addEventListener + removeEventListener and handle deviceready,
+ * resume, and pause events.
+ */
+var m_document_addEventListener = document.addEventListener;
+var m_document_removeEventListener = document.removeEventListener;
+var m_window_addEventListener = window.addEventListener;
+var m_window_removeEventListener = window.removeEventListener;
+
+/**
+ * Houses custom event handlers to intercept on document + window event listeners.
+ */
+var documentEventHandlers = {},
+    windowEventHandlers = {};
+
+document.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof documentEventHandlers[e] != 'undefined') {
+        if (evt === 'deviceready') {
+            documentEventHandlers[e].subscribeOnce(handler);
+        } else {
+            documentEventHandlers[e].subscribe(handler);
+        }
+    } else {
+        m_document_addEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof windowEventHandlers[e] != 'undefined') {
+        windowEventHandlers[e].subscribe(handler);
+    } else {
+        m_window_addEventListener.call(window, evt, handler, capture);
+    }
+};
+
+document.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof documentEventHandlers[e] != "undefined") {
+        documentEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_document_removeEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof windowEventHandlers[e] != "undefined") {
+        windowEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_window_removeEventListener.call(window, evt, handler, capture);
+    }
+};
+
+function createEvent(type, data) {
+    var event = document.createEvent('Events');
+    event.initEvent(type, false, false);
+    if (data) {
+        for (var i in data) {
+            if (data.hasOwnProperty(i)) {
+                event[i] = data[i];
+            }
+        }
+    }
+    return event;
+}
+
+if(typeof window.console === "undefined") {
+    window.console = {
+        log:function(){}
+    };
+}
+
+var cordova = {
+    define:define,
+    require:require,
+    /**
+     * Methods to add/remove your own addEventListener hijacking on document + window.
+     */
+    addWindowEventHandler:function(event, opts) {
+        return (windowEventHandlers[event] = channel.create(event, opts));
+    },
+    addDocumentEventHandler:function(event, opts) {
+        return (documentEventHandlers[event] = channel.create(event, opts));
+    },
+    removeWindowEventHandler:function(event) {
+        delete windowEventHandlers[event];
+    },
+    removeDocumentEventHandler:function(event) {
+        delete documentEventHandlers[event];
+    },
+    /**
+     * Retreive original event handlers that were replaced by Cordova
+     *
+     * @return object
+     */
+    getOriginalHandlers: function() {
+        return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
+        'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
+    },
+    /**
+     * Method to fire event from native code
+     */
+    fireDocumentEvent: function(type, data) {
+        var evt = createEvent(type, data);
+        if (typeof documentEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                documentEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            document.dispatchEvent(evt);
+        }
+    },
+    fireWindowEvent: function(type, data) {
+        var evt = createEvent(type,data);
+        if (typeof windowEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                windowEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            window.dispatchEvent(evt);
+        }
+    },
+    // TODO: this is Android only; think about how to do this better
+    shuttingDown:false,
+    UsePolling:false,
+    // END TODO
+
+    // TODO: iOS only
+    // This queue holds the currently executing command and all pending
+    // commands executed with cordova.exec().
+    commandQueue:[],
+    // Indicates if we're currently in the middle of flushing the command
+    // queue on the native side.
+    commandQueueFlushing:false,
+    // END TODO
+    /**
+     * Plugin callback mechanism.
+     */
+    callbackId: 0,
+    callbacks:  {},
+    callbackStatus: {
+        NO_RESULT: 0,
+        OK: 1,
+        CLASS_NOT_FOUND_EXCEPTION: 2,
+        ILLEGAL_ACCESS_EXCEPTION: 3,
+        INSTANTIATION_EXCEPTION: 4,
+        MALFORMED_URL_EXCEPTION: 5,
+        IO_EXCEPTION: 6,
+        INVALID_ACTION: 7,
+        JSON_EXCEPTION: 8,
+        ERROR: 9
+    },
+
+    /**
+     * Called by native code when returning successful result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackSuccess: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+
+            // If result is to be sent to callback
+            if (args.status == cordova.callbackStatus.OK) {
+                try {
+                    if (cordova.callbacks[callbackId].success) {
+                        cordova.callbacks[callbackId].success(args.message);
+                    }
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+callbackId+" = "+e);
+                }
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+
+    /**
+     * Called by native code when returning error result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackError: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+            try {
+                if (cordova.callbacks[callbackId].fail) {
+                    cordova.callbacks[callbackId].fail(args.message);
+                }
+            }
+            catch (e) {
+                console.log("Error in error callback: "+callbackId+" = "+e);
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+    addConstructor: function(func) {
+        channel.onCordovaReady.subscribeOnce(function() {
+            try {
+                func();
+            } catch(e) {
+                console.log("Failed to run constructor: " + e);
+            }
+        });
+    }
+};
+
+// Register pause, resume and deviceready channels as events on document.
+channel.onPause = cordova.addDocumentEventHandler('pause');
+channel.onResume = cordova.addDocumentEventHandler('resume');
+channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
+
+module.exports = cordova;
+
+});
+
+// file: lib/common/builder.js
+define("cordova/builder", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+function each(objects, func, context) {
+    for (var prop in objects) {
+        if (objects.hasOwnProperty(prop)) {
+            func.apply(context, [objects[prop], prop]);
+        }
+    }
+}
+
+function include(parent, objects, clobber, merge) {
+    each(objects, function (obj, key) {
+        try {
+          var result = obj.path ? require(obj.path) : {};
+
+          if (clobber) {
+              // Clobber if it doesn't exist.
+              if (typeof parent[key] === 'undefined') {
+                  parent[key] = result;
+              } else if (typeof obj.path !== 'undefined') {
+                  // If merging, merge properties onto parent, otherwise, clobber.
+                  if (merge) {
+                      recursiveMerge(parent[key], result);
+                  } else {
+                      parent[key] = result;
+                  }
+              }
+              result = parent[key];
+          } else {
+            // Overwrite if not currently defined.
+            if (typeof parent[key] == 'undefined') {
+              parent[key] = result;
+            } else if (merge && typeof obj.path !== 'undefined') {
+              // If merging, merge parent onto result
+              recursiveMerge(result, parent[key]);
+              parent[key] = result;
+            } 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);
+          }
+        } catch(e) {
+          utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');
+        }
+    });
+}
+
+/**
+ * Merge properties from one object onto another recursively.  Properties from
+ * the src object will overwrite existing target property.
+ *
+ * @param target Object to merge properties into.
+ * @param src Object to merge properties from.
+ */
+function recursiveMerge(target, src) {
+    for (var prop in src) {
+        if (src.hasOwnProperty(prop)) {
+            if (typeof target.prototype !== 'undefined' && target.prototype.constructor === target) {
+                // If the target object is a constructor override off prototype.
+                target.prototype[prop] = src[prop];
+            } else {
+                target[prop] = typeof src[prop] === 'object' ? recursiveMerge(
+                        target[prop], src[prop]) : src[prop];
+            }
+        }
+    }
+    return target;
+}
+
+module.exports = {
+    build: function (objects) {
+        return {
+            intoButDontClobber: function (target) {
+                include(target, objects, false, false);
+            },
+            intoAndClobber: function(target) {
+                include(target, objects, true, false);
+            },
+            intoAndMerge: function(target) {
+                include(target, objects, true, true);
+            }
+        };
+    }
+};
+
+});
+
+// file: lib/common/channel.js
+define("cordova/channel", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+/**
+ * Custom pub-sub "channel" that can have functions subscribed to it
+ * This object is used to define and control firing of events for
+ * cordova initialization.
+ *
+ * The order of events during page load and Cordova startup is as follows:
+ *
+ * onDOMContentLoaded         Internal event that is received when the web page is loaded and parsed.
+ * onNativeReady              Internal event that indicates the Cordova native side is ready.
+ * onCordovaReady             Internal event fired when all Cordova JavaScript objects have been created.
+ * onCordovaInfoReady         Internal event fired when device properties are available.
+ * onCordovaConnectionReady   Internal event fired when the connection property has been set.
+ * onDeviceReady              User event fired to indicate that Cordova is ready
+ * onResume                   User event fired to indicate a start/resume lifecycle event
+ * onPause                    User event fired to indicate a pause lifecycle event
+ * onDestroy                  Internal event fired when app is being destroyed (User should use window.onunload event, not this one).
+ *
+ * The only Cordova events that user code should register for are:
+ *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
+ *      pause                 App has moved to background
+ *      resume                App has returned to foreground
+ *
+ * Listeners can be registered as:
+ *      document.addEventListener("deviceready", myDeviceReadyListener, false);
+ *      document.addEventListener("resume", myResumeListener, false);
+ *      document.addEventListener("pause", myPauseListener, false);
+ *
+ * The DOM lifecycle events should be used for saving and restoring state
+ *      window.onload
+ *      window.onunload
+ *
+ */
+
+/**
+ * Channel
+ * @constructor
+ * @param type  String the channel name
+ * @param opts  Object options to pass into the channel, currently
+ *                     supports:
+ *                     onSubscribe: callback that fires when
+ *                       something subscribes to the Channel. Sets
+ *                       context to the Channel.
+ *                     onUnsubscribe: callback that fires when
+ *                       something unsubscribes to the Channel. Sets
+ *                       context to the Channel.
+ */
+var Channel = function(type, opts) {
+    this.type = type;
+    this.handlers = {};
+    this.numHandlers = 0;
+    this.guid = 1;
+    this.fired = false;
+    this.enabled = true;
+    this.events = {
+        onSubscribe:null,
+        onUnsubscribe:null
+    };
+    if (opts) {
+        if (opts.onSubscribe) this.events.onSubscribe = opts.onSubscribe;
+        if (opts.onUnsubscribe) this.events.onUnsubscribe = opts.onUnsubscribe;
+    }
+},
+    channel = {
+        /**
+         * Calls the provided function only after all of the channels specified
+         * have been fired.
+         */
+        join: function (h, c) {
+            var i = c.length;
+            var len = i;
+            var f = function() {
+                if (!(--i)) h();
+            };
+            for (var j=0; j<len; j++) {
+                !c[j].fired?c[j].subscribeOnce(f):i--;
+            }
+            if (!i) h();
+        },
+        create: function (type, opts) {
+            channel[type] = new Channel(type, opts);
+            return channel[type];
+        },
+
+        /**
+         * cordova Channels that must fire before "deviceready" is fired.
+         */
+        deviceReadyChannelsArray: [],
+        deviceReadyChannelsMap: {},
+
+        /**
+         * Indicate that a feature needs to be initialized before it is ready to be used.
+         * This holds up Cordova's "deviceready" event until the feature has been initialized
+         * and Cordova.initComplete(feature) is called.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        waitForInitialization: function(feature) {
+            if (feature) {
+                var c = null;
+                if (this[feature]) {
+                    c = this[feature];
+                }
+                else {
+                    c = this.create(feature);
+                }
+                this.deviceReadyChannelsMap[feature] = c;
+                this.deviceReadyChannelsArray.push(c);
+            }
+        },
+
+        /**
+         * Indicate that initialization code has completed and the feature is ready to be used.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        initializationComplete: function(feature) {
+            var c = this.deviceReadyChannelsMap[feature];
+            if (c) {
+                c.fire();
+            }
+        }
+    };
+
+function forceFunction(f) {
+    if (f === null || f === undefined || typeof f != 'function') throw "Function required as first argument!";
+}
+
+/**
+ * Subscribes the given function to the channel. Any time that
+ * Channel.fire is called so too will the function.
+ * Optionally specify an execution context for the function
+ * and a guid that can be used to stop subscribing to the channel.
+ * Returns the guid.
+ */
+Channel.prototype.subscribe = function(f, c, g) {
+    // need a function to call
+    forceFunction(f);
+
+    var func = f;
+    if (typeof c == "object") { func = utils.close(c, f); }
+
+    g = g || func.observer_guid || f.observer_guid;
+    if (!g) {
+        // first time we've seen this subscriber
+        g = this.guid++;
+    }
+    else {
+        // subscriber already handled; dont set it twice
+        return g;
+    }
+    func.observer_guid = g;
+    f.observer_guid = g;
+    this.handlers[g] = func;
+    this.numHandlers++;
+    if (this.events.onSubscribe) this.events.onSubscribe.call(this);
+    if (this.fired) func.call(this);
+    return g;
+};
+
+/**
+ * Like subscribe but the function is only called once and then it
+ * auto-unsubscribes itself.
+ */
+Channel.prototype.subscribeOnce = function(f, c) {
+    // need a function to call
+    forceFunction(f);
+
+    var g = null;
+    var _this = this;
+    var m = function() {
+        f.apply(c || null, arguments);
+        _this.unsubscribe(g);
+    };
+    if (this.fired) {
+        if (typeof c == "object") { f = utils.close(c, f); }
+        f.apply(this, this.fireArgs);
+    } else {
+        g = this.subscribe(m);
+    }
+    return g;
+};
+
+/**
+ * Unsubscribes the function with the given guid from the channel.
+ */
+Channel.prototype.unsubscribe = function(g) {
+    // need a function to unsubscribe
+    if (g === null || g === undefined) { throw "You must pass _something_ into Channel.unsubscribe"; }
+
+    if (typeof g == 'function') { g = g.observer_guid; }
+    var handler = this.handlers[g];
+    if (handler) {
+        if (handler.observer_guid) handler.observer_guid=null;
+        this.handlers[g] = null;
+        delete this.handlers[g];
+        this.numHandlers--;
+        if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
+    }
+};
+
+/**
+ * Calls all functions subscribed to this channel.
+ */
+Channel.prototype.fire = function(e) {
+    if (this.enabled) {
+        var fail = false;
+        this.fired = true;
+        for (var item in this.handlers) {
+            var handler = this.handlers[item];
+            if (typeof handler == 'function') {
+                var rv = (handler.apply(this, arguments)===false);
+                fail = fail || rv;
+            }
+        }
+        this.fireArgs = arguments;
+        return !fail;
+    }
+    return true;
+};
+
+// defining them here so they are ready super fast!
+// DOM event that is received when the web page is loaded and parsed.
+channel.create('onDOMContentLoaded');
+
+// Event to indicate the Cordova native side is ready.
+channel.create('onNativeReady');
+
+// Event to indicate that all Cordova JavaScript objects have been created
+// and it's time to run plugin constructors.
+channel.create('onCordovaReady');
+
+// Event to indicate that device properties are available
+channel.create('onCordovaInfoReady');
+
+// Event to indicate that the connection property has been set.
+channel.create('onCordovaConnectionReady');
+
+// Event to indicate that Cordova is ready
+channel.create('onDeviceReady');
+
+// Event to indicate a resume lifecycle event
+channel.create('onResume');
+
+// Event to indicate a pause lifecycle event
+channel.create('onPause');
+
+// Event to indicate a destroy lifecycle event
+channel.create('onDestroy');
+
+// Channels that must fire before "deviceready" is fired.
+channel.waitForInitialization('onCordovaReady');
+channel.waitForInitialization('onCordovaConnectionReady');
+
+module.exports = channel;
+
+});
+
+// file: lib/common/common.js
+define("cordova/common", function(require, exports, module) {
+module.exports = {
+    objects: {
+        cordova: {
+            path: 'cordova',
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                },
+                logger: {
+                    path: 'cordova/plugin/logger'
+                }
+            }
+        },
+        Cordova: {
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        PhoneGap:{
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        navigator: {
+            children: {
+                notification: {
+                    path: 'cordova/plugin/notification'
+                },
+                accelerometer: {
+                    path: 'cordova/plugin/accelerometer'
+                },
+                battery: {
+                    path: 'cordova/plugin/battery'
+                },
+                camera:{
+                    path: 'cordova/plugin/Camera'
+                },
+                compass:{
+                    path: 'cordova/plugin/compass'
+                },
+                contacts: {
+                    path: 'cordova/plugin/contacts'
+                },
+                device:{
+                    children:{
+                        capture: {
+                            path: 'cordova/plugin/capture'
+                        }
+                    }
+                },
+                geolocation: {
+                    path: 'cordova/plugin/geolocation'
+                },
+                network: {
+                    children: {
+                        connection: {
+                            path: 'cordova/plugin/network'
+                        }
+                    }
+                },
+                splashscreen: {
+                    path: 'cordova/plugin/splashscreen'
+                }
+            }
+        },
+        Acceleration: {
+            path: 'cordova/plugin/Acceleration'
+        },
+        Camera:{
+            path: 'cordova/plugin/CameraConstants'
+        },
+        CameraPopoverOptions: {
+            path: 'cordova/plugin/CameraPopoverOptions'
+        },
+        CaptureError: {
+            path: 'cordova/plugin/CaptureError'
+        },
+        CaptureAudioOptions:{
+            path: 'cordova/plugin/CaptureAudioOptions'
+        },
+        CaptureImageOptions: {
+            path: 'cordova/plugin/CaptureImageOptions'
+        },
+        CaptureVideoOptions: {
+            path: 'cordova/plugin/CaptureVideoOptions'
+        },
+        CompassHeading:{
+            path: 'cordova/plugin/CompassHeading'
+        },
+        CompassError:{
+            path: 'cordova/plugin/CompassError'
+        },
+        ConfigurationData: {
+            path: 'cordova/plugin/ConfigurationData'
+        },
+        Connection: {
+            path: 'cordova/plugin/Connection'
+        },
+        Contact: {
+            path: 'cordova/plugin/Contact'
+        },
+        ContactAddress: {
+            path: 'cordova/plugin/ContactAddress'
+        },
+        ContactError: {
+            path: 'cordova/plugin/ContactError'
+        },
+        ContactField: {
+            path: 'cordova/plugin/ContactField'
+        },
+        ContactFindOptions: {
+            path: 'cordova/plugin/ContactFindOptions'
+        },
+        ContactName: {
+            path: 'cordova/plugin/ContactName'
+        },
+        ContactOrganization: {
+            path: 'cordova/plugin/ContactOrganization'
+        },
+        Coordinates: {
+            path: 'cordova/plugin/Coordinates'
+        },
+        device: {
+            path: 'cordova/plugin/device'
+        },
+        DirectoryEntry: {
+            path: 'cordova/plugin/DirectoryEntry'
+        },
+        DirectoryReader: {
+            path: 'cordova/plugin/DirectoryReader'
+        },
+        Entry: {
+            path: 'cordova/plugin/Entry'
+        },
+        File: {
+            path: 'cordova/plugin/File'
+        },
+        FileEntry: {
+            path: 'cordova/plugin/FileEntry'
+        },
+        FileError: {
+            path: 'cordova/plugin/FileError'
+        },
+        FileReader: {
+            path: 'cordova/plugin/FileReader'
+        },
+        FileSystem: {
+            path: 'cordova/plugin/FileSystem'
+        },
+        FileTransfer: {
+            path: 'cordova/plugin/FileTransfer'
+        },
+        FileTransferError: {
+            path: 'cordova/plugin/FileTransferError'
+        },
+        FileUploadOptions: {
+            path: 'cordova/plugin/FileUploadOptions'
+        },
+        FileUploadResult: {
+            path: 'cordova/plugin/FileUploadResult'
+        },
+        FileWriter: {
+            path: 'cordova/plugin/FileWriter'
+        },
+        Flags: {
+            path: 'cordova/plugin/Flags'
+        },
+        LocalFileSystem: {
+            path: 'cordova/plugin/LocalFileSystem'
+        },
+        Media: {
+            path: 'cordova/plugin/Media'
+        },
+        MediaError: {
+            path: 'cordova/plugin/MediaError'
+        },
+        MediaFile: {
+            path: 'cordova/plugin/MediaFile'
+        },
+        MediaFileData:{
+            path: 'cordova/plugin/MediaFileData'
+        },
+        Metadata:{
+            path: 'cordova/plugin/Metadata'
+        },
+        Position: {
+            path: 'cordova/plugin/Position'
+        },
+        PositionError: {
+            path: 'cordova/plugin/PositionError'
+        },
+        ProgressEvent: {
+            path: 'cordova/plugin/ProgressEvent'
+        },
+        requestFileSystem:{
+            path: 'cordova/plugin/requestFileSystem'
+        },
+        resolveLocalFileSystemURI:{
+            path: 'cordova/plugin/resolveLocalFileSystemURI'
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/exec.js
+define("cordova/exec", function(require, exports, module) {
+/**
+ * Execute a cordova command.  It is up to the native side whether this action
+ * is synchronous or asynchronous.  The native side can return:
+ *      Synchronous: PluginResult object as a JSON string
+ *      Asynchrounous: Empty string ""
+ * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
+ * depending upon the result of the action.
+ *
+ * @param {Function} successCB  The success callback
+ * @param {Function} failCB     The fail callback
+ * @param {String} service      The name of the service to use
+ * @param {String} action       Action to be run in cordova
+ * @param {String[]} [args]     Zero or more arguments to pass to the method
+ */
+
+var tizen = require('cordova/plugin/tizen/manager'),
+    cordova = require('cordova'),
+    utils = require('cordova/utils');
+
+module.exports = function(successCB, failCB, service, action, args) {
+
+    try {
+        var v = tizen.exec(successCB, failCB, service, action, args);
+
+        // If status is OK, then return value back to caller
+        if (v.status == cordova.callbackStatus.OK) {
+
+            // If there is a success callback, then call it now with returned value
+            if (successCB) {
+                try {
+                    successCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+ service + "." + action + " = " + e);
+                }
+
+            }
+            return v.message;
+        } else if (v.status == cordova.callbackStatus.NO_RESULT) {
+            // Nothing to do here
+        } else {
+            // If error, then display error
+            console.log("Error: " + service + "." + action + " Status=" + v.status + " Message=" + v.message);
+
+            // If there is a fail callback, then call it now with returned value
+            if (failCB) {
+                try {
+                    failCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in error callback: " + service + "." + action + " = "+e);
+                }
+            }
+            return null;
+        }
+    } catch (e) {
+        utils.alert("Error: " + e);
+    }
+};
+
+});
+
+// file: lib/tizen/platform.js
+define("cordova/platform", function(require, exports, module) {
+module.exports = {
+    id: "tizen",
+    initialize: function() {},
+    objects: {
+        device: {
+            path: "cordova/plugin/tizen/Device"
+        },
+        File: { // exists natively, override
+            path: "cordova/plugin/File"
+        },
+        FileReader: { // exists natively, override
+            path: "cordova/plugin/FileReader"
+        },
+        FileError: { //exists natively, override
+            path: "cordova/plugin/FileError"
+        }
+    },
+    merges: {
+        MediaError: { // exists natively
+            path: "cordova/plugin/tizen/MediaError"
+        },
+        navigator: {
+            children: {
+                device: {
+                    path: "cordova/plugin/tizen/Device"
+                },
+                contacts: {
+                    path: "cordova/plugin/tizen/contacts"
+                },
+               notification: {
+                   path: "cordova/plugin/tizen/Notification"
+               }
+            }
+        },
+        Contact: {
+            path: "cordova/plugin/tizen/Contact"
+        }
+    }
+};
+
+});
+
+// file: lib/common/plugin/Acceleration.js
+define("cordova/plugin/Acceleration", function(require, exports, module) {
+var Acceleration = function(x, y, z, timestamp) {
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.timestamp = timestamp || (new Date()).getTime();
+};
+
+module.exports = Acceleration;
+
+});
+
+// file: lib/common/plugin/Camera.js
+define("cordova/plugin/Camera", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    Camera = require('cordova/plugin/CameraConstants');
+
+var cameraExport = {};
+
+// Tack on the Camera Constants to the base camera plugin.
+for (var key in Camera) {
+    cameraExport[key] = Camera[key];
+}
+
+/**
+ * Gets a picture from source defined by "options.sourceType", and returns the
+ * image as defined by the "options.destinationType" option.
+
+ * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
+ *
+ * @param {Function} successCallback
+ * @param {Function} errorCallback
+ * @param {Object} options
+ */
+cameraExport.getPicture = function(successCallback, errorCallback, options) {
+    // successCallback required
+    if (typeof successCallback != "function") {
+        console.log("Camera Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback != "function")) {
+        console.log("Camera Error: errorCallback is not a function");
+        return;
+    }
+
+    var quality = 50;
+    if (options && typeof options.quality == "number") {
+        quality = options.quality;
+    } else if (options && typeof options.quality == "string") {
+        var qlity = parseInt(options.quality, 10);
+        if (isNaN(qlity) === false) {
+            quality = qlity.valueOf();
+        }
+    }
+
+    var destinationType = Camera.DestinationType.FILE_URI;
+    if (typeof options.destinationType == "number") {
+        destinationType = options.destinationType;
+    }
+
+    var sourceType = Camera.PictureSourceType.CAMERA;
+    if (typeof options.sourceType == "number") {
+        sourceType = options.sourceType;
+    }
+
+    var targetWidth = -1;
+    if (typeof options.targetWidth == "number") {
+        targetWidth = options.targetWidth;
+    } else if (typeof options.targetWidth == "string") {
+        var width = parseInt(options.targetWidth, 10);
+        if (isNaN(width) === false) {
+            targetWidth = width.valueOf();
+        }
+    }
+
+    var targetHeight = -1;
+    if (typeof options.targetHeight == "number") {
+        targetHeight = options.targetHeight;
+    } else if (typeof options.targetHeight == "string") {
+        var height = parseInt(options.targetHeight, 10);
+        if (isNaN(height) === false) {
+            targetHeight = height.valueOf();
+        }
+    }
+
+    var encodingType = Camera.EncodingType.JPEG;
+    if (typeof options.encodingType == "number") {
+        encodingType = options.encodingType;
+    }
+
+    var mediaType = Camera.MediaType.PICTURE;
+    if (typeof options.mediaType == "number") {
+        mediaType = options.mediaType;
+    }
+    var allowEdit = false;
+    if (typeof options.allowEdit == "boolean") {
+        allowEdit = options.allowEdit;
+    } else if (typeof options.allowEdit == "number") {
+        allowEdit = options.allowEdit <= 0 ? false : true;
+    }
+    var correctOrientation = false;
+    if (typeof options.correctOrientation == "boolean") {
+        correctOrientation = options.correctOrientation;
+    } else if (typeof options.correctOrientation == "number") {
+        correctOrientation = options.correctOrientation <=0 ? false : true;
+    }
+    var saveToPhotoAlbum = false;
+    if (typeof options.saveToPhotoAlbum == "boolean") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum;
+    } else if (typeof options.saveToPhotoAlbum == "number") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum <=0 ? false : true;
+    }
+    var popoverOptions = null;
+    if (typeof options.popoverOptions == "object") {
+        popoverOptions = options.popoverOptions;
+    }
+
+    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
+
+    exec(successCallback, errorCallback, "Camera", "takePicture", args);
+};
+
+cameraExport.cleanup = function(successCallback, errorCallback) {
+    exec(successCallback, errorCallback, "Camera", "cleanup", []);
+};
+
+module.exports = cameraExport;
+});
+
+// file: lib/common/plugin/CameraConstants.js
+define("cordova/plugin/CameraConstants", function(require, exports, module) {
+module.exports = {
+  DestinationType:{
+    DATA_URL: 0,         // Return base64 encoded string
+    FILE_URI: 1          // Return file uri (content://media/external/images/media/2 for Android)
+  },
+  EncodingType:{
+    JPEG: 0,             // Return JPEG encoded image
+    PNG: 1               // Return PNG encoded image
+  },
+  MediaType:{
+    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
+    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
+    ALLMEDIA : 2         // allow selection from all media types
+  },
+  PictureSourceType:{
+    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
+    CAMERA : 1,          // Take picture from camera
+    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
+  },
+  PopoverArrowDirection:{
+      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
+      ARROW_DOWN : 2,
+      ARROW_LEFT : 4,
+      ARROW_RIGHT : 8,
+      ARROW_ANY : 15
+  }
+};
+});
+
+// file: lib/common/plugin/CameraPopoverOptions.js
+define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
+var Camera = require('cordova/plugin/CameraConstants');
+
+/**
+ * Encapsulates options for iOS Popover image picker
+ */
+var CameraPopoverOptions = function(x,y,width,height,arrowDir){
+    // information of rectangle that popover should be anchored to
+    this.x = x || 0;
+    this.y = y || 32;
+    this.width = width || 320;
+    this.height = height || 480;
+    // The direction of the popover arrow
+    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
+};
+
+module.exports = CameraPopoverOptions;
+});
+
+// file: lib/common/plugin/CaptureAudioOptions.js
+define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
+/**
+ * Encapsulates all audio capture operation configuration options.
+ */
+var CaptureAudioOptions = function(){
+    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single sound clip in seconds.
+    this.duration = 0;
+    // The selected audio mode. Must match with one of the elements in supportedAudioModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureAudioOptions;
+});
+
+// file: lib/common/plugin/CaptureError.js
+define("cordova/plugin/CaptureError", function(require, exports, module) {
+/**
+ * The CaptureError interface encapsulates all errors in the Capture API.
+ */
+var CaptureError = function(c) {
+   this.code = c || null;
+};
+
+// Camera or microphone failed to capture image or sound.
+CaptureError.CAPTURE_INTERNAL_ERR = 0;
+// Camera application or audio capture application is currently serving other capture request.
+CaptureError.CAPTURE_APPLICATION_BUSY = 1;
+// Invalid use of the API (e.g. limit parameter has value less than one).
+CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
+// User exited camera application or audio capture application before capturing anything.
+CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
+// The requested capture operation is not supported.
+CaptureError.CAPTURE_NOT_SUPPORTED = 20;
+
+module.exports = CaptureError;
+});
+
+// file: lib/common/plugin/CaptureImageOptions.js
+define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
+/**
+ * Encapsulates all image capture operation configuration options.
+ */
+var CaptureImageOptions = function(){
+    // Upper limit of images user can take. Value must be equal or greater than 1.
+    this.limit = 1;
+    // The selected image mode. Must match with one of the elements in supportedImageModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureImageOptions;
+});
+
+// file: lib/common/plugin/CaptureVideoOptions.js
+define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
+/**
+ * Encapsulates all video capture operation configuration options.
+ */
+var CaptureVideoOptions = function(){
+    // Upper limit of videos user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single video clip in seconds.
+    this.duration = 0;
+    // The selected video mode. Must match with one of the elements in supportedVideoModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureVideoOptions;
+});
+
+// file: lib/common/plugin/CompassError.js
+define("cordova/plugin/CompassError", function(require, exports, module) {
+/**
+ *  CompassError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var CompassError = function(err) {
+    this.code = (err !== undefined ? err : null);
+};
+
+CompassError.COMPASS_INTERNAL_ERR = 0;
+CompassError.COMPASS_NOT_SUPPORTED = 20;
+
+module.exports = CompassError;
+});
+
+// file: lib/common/plugin/CompassHeading.js
+define("cordova/plugin/CompassHeading", function(require, exports, module) {
+var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
+  this.magneticHeading = (magneticHeading !== undefined ? magneticHeading : null);
+  this.trueHeading = (trueHeading !== undefined ? trueHeading : null);
+  this.headingAccuracy = (headingAccuracy !== undefined ? headingAccuracy : null);
+  this.timestamp = (timestamp !== undefined ? timestamp : new Date().getTime());
+};
+
+module.exports = CompassHeading;
+});
+
+// file: lib/common/plugin/ConfigurationData.js
+define("cordova/plugin/ConfigurationData", function(require, exports, module) {
+/**
+ * Encapsulates a set of parameters that the capture device supports.
+ */
+function ConfigurationData() {
+    // The ASCII-encoded string in lower case representing the media type.
+    this.type = null;
+    // The height attribute represents height of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0.
+    this.height = 0;
+    // The width attribute represents width of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0
+    this.width = 0;
+}
+
+module.exports = ConfigurationData;
+});
+
+// file: lib/common/plugin/Connection.js
+define("cordova/plugin/Connection", function(require, exports, module) {
+/**
+ * Network status
+ */
+module.exports = {
+        UNKNOWN: "unknown",
+        ETHERNET: "ethernet",
+        WIFI: "wifi",
+        CELL_2G: "2g",
+        CELL_3G: "3g",
+        CELL_4G: "4g",
+        NONE: "none"
+};
+});
+
+// file: lib/common/plugin/Contact.js
+define("cordova/plugin/Contact", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils');
+
+/**
+* Converts primitives into Complex Object
+* Currently only used for Date fields
+*/
+function convertIn(contact) {
+    var value = contact.birthday;
+    try {
+      contact.birthday = new Date(parseFloat(value));
+    } catch (exception){
+      console.log("Cordova Contact convertIn error: exception creating date.");
+    }
+    return contact;
+}
+
+/**
+* Converts Complex objects into primitives
+* Only conversion at present is for Dates.
+**/
+
+function convertOut(contact) {
+    var value = contact.birthday;
+    if (value !== null) {
+        // try to make it a Date object if it is not already
+        if (!utils.isDate(value)){
+            try {
+                value = new Date(value);
+            } catch(exception){
+                value = null;
+            }
+        }
+        if (utils.isDate(value)){
+            value = value.valueOf(); // convert to milliseconds
+        }
+        contact.birthday = value;
+    }
+    return contact;
+}
+
+/**
+* Contains information about a single contact.
+* @constructor
+* @param {DOMString} id unique identifier
+* @param {DOMString} displayName
+* @param {ContactName} name
+* @param {DOMString} nickname
+* @param {Array.<ContactField>} phoneNumbers array of phone numbers
+* @param {Array.<ContactField>} emails array of email addresses
+* @param {Array.<ContactAddress>} addresses array of addresses
+* @param {Array.<ContactField>} ims instant messaging user ids
+* @param {Array.<ContactOrganization>} organizations
+* @param {DOMString} birthday contact's birthday
+* @param {DOMString} note user notes about contact
+* @param {Array.<ContactField>} photos
+* @param {Array.<ContactField>} categories
+* @param {Array.<ContactField>} urls contact's web sites
+*/
+var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
+    ims, organizations, birthday, note, photos, categories, urls) {
+    this.id = id || null;
+    this.rawId = null;
+    this.displayName = displayName || null;
+    this.name = name || null; // ContactName
+    this.nickname = nickname || null;
+    this.phoneNumbers = phoneNumbers || null; // ContactField[]
+    this.emails = emails || null; // ContactField[]
+    this.addresses = addresses || null; // ContactAddress[]
+    this.ims = ims || null; // ContactField[]
+    this.organizations = organizations || null; // ContactOrganization[]
+    this.birthday = birthday || null;
+    this.note = note || null;
+    this.photos = photos || null; // ContactField[]
+    this.categories = categories || null; // ContactField[]
+    this.urls = urls || null; // ContactField[]
+};
+
+/**
+* Removes contact from device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.remove = function(successCB, errorCB) {
+    var fail = function(code) {
+        errorCB(new ContactError(code));
+    };
+    if (this.id === null) {
+        fail(ContactError.UNKNOWN_ERROR);
+    }
+    else {
+        exec(successCB, fail, "Contacts", "remove", [this.id]);
+    }
+};
+
+/**
+* Creates a deep copy of this Contact.
+* With the contact ID set to null.
+* @return copy of this Contact
+*/
+Contact.prototype.clone = function() {
+    var clonedContact = utils.clone(this);
+    var i;
+    clonedContact.id = null;
+    clonedContact.rawId = null;
+    // Loop through and clear out any id's in phones, emails, etc.
+    if (clonedContact.phoneNumbers) {
+        for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
+            clonedContact.phoneNumbers[i].id = null;
+        }
+    }
+    if (clonedContact.emails) {
+        for (i = 0; i < clonedContact.emails.length; i++) {
+            clonedContact.emails[i].id = null;
+        }
+    }
+    if (clonedContact.addresses) {
+        for (i = 0; i < clonedContact.addresses.length; i++) {
+            clonedContact.addresses[i].id = null;
+        }
+    }
+    if (clonedContact.ims) {
+        for (i = 0; i < clonedContact.ims.length; i++) {
+            clonedContact.ims[i].id = null;
+        }
+    }
+    if (clonedContact.organizations) {
+        for (i = 0; i < clonedContact.organizations.length; i++) {
+            clonedContact.organizations[i].id = null;
+        }
+    }
+    if (clonedContact.categories) {
+        for (i = 0; i < clonedContact.categories.length; i++) {
+            clonedContact.categories[i].id = null;
+        }
+    }
+    if (clonedContact.photos) {
+        for (i = 0; i < clonedContact.photos.length; i++) {
+            clonedContact.photos[i].id = null;
+        }
+    }
+    if (clonedContact.urls) {
+        for (i = 0; i < clonedContact.urls.length; i++) {
+            clonedContact.urls[i].id = null;
+        }
+    }
+    return clonedContact;
+};
+
+/**
+* Persists contact to device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.save = function(successCB, errorCB) {
+  var fail = function(code) {
+      errorCB(new ContactError(code));
+  };
+    var success = function(result) {
+      if (result) {
+          if (typeof successCB === 'function') {
+              var fullContact = require('cordova/plugin/contacts').create(result);
+              successCB(convertIn(fullContact));
+          }
+      }
+      else {
+          // no Entry object returned
+          fail(ContactError.UNKNOWN_ERROR);
+      }
+  };
+    var dupContact = convertOut(utils.clone(this));
+    exec(success, fail, "Contacts", "save", [dupContact]);
+};
+
+
+module.exports = Contact;
+
+});
+
+// file: lib/common/plugin/ContactAddress.js
+define("cordova/plugin/ContactAddress", function(require, exports, module) {
+/**
+* Contact address.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code
+* @param formatted // NOTE: not a W3C standard
+* @param streetAddress
+* @param locality
+* @param region
+* @param postalCode
+* @param country
+*/
+
+var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.formatted = formatted || null;
+    this.streetAddress = streetAddress || null;
+    this.locality = locality || null;
+    this.region = region || null;
+    this.postalCode = postalCode || null;
+    this.country = country || null;
+};
+
+module.exports = ContactAddress;
+});
+
+// file: lib/common/plugin/ContactError.js
+define("cordova/plugin/ContactError", function(require, exports, module) {
+/**
+ *  ContactError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var ContactError = function(err) {
+    this.code = (typeof err != 'undefined' ? err : null);
+};
+
+/**
+ * Error codes
+ */
+ContactError.UNKNOWN_ERROR = 0;
+ContactError.INVALID_ARGUMENT_ERROR = 1;
+ContactError.TIMEOUT_ERROR = 2;
+ContactError.PENDING_OPERATION_ERROR = 3;
+ContactError.IO_ERROR = 4;
+ContactError.NOT_SUPPORTED_ERROR = 5;
+ContactError.PERMISSION_DENIED_ERROR = 20;
+
+module.exports = ContactError;
+});
+
+// file: lib/common/plugin/ContactField.js
+define("cordova/plugin/ContactField", function(require, exports, module) {
+/**
+* Generic contact field.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param type
+* @param value
+* @param pref
+*/
+var ContactField = function(type, value, pref) {
+    this.id = null;
+    this.type = (type && type.toString()) || null;
+    this.value = (value && value.toString()) || null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+};
+
+module.exports = ContactField;
+});
+
+// file: lib/common/plugin/ContactFindOptions.js
+define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
+/**
+ * ContactFindOptions.
+ * @constructor
+ * @param filter used to match contacts against
+ * @param multiple boolean used to determine if more than one contact should be returned
+ */
+
+var ContactFindOptions = function(filter, multiple) {
+    this.filter = filter || '';
+    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
+};
+
+module.exports = ContactFindOptions;
+});
+
+// file: lib/common/plugin/ContactName.js
+define("cordova/plugin/ContactName", function(require, exports, module) {
+/**
+* Contact name.
+* @constructor
+* @param formatted // NOTE: not part of W3C standard
+* @param familyName
+* @param givenName
+* @param middle
+* @param prefix
+* @param suffix
+*/
+var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
+    this.formatted = formatted || null;
+    this.familyName = familyName || null;
+    this.givenName = givenName || null;
+    this.middleName = middle || null;
+    this.honorificPrefix = prefix || null;
+    this.honorificSuffix = suffix || null;
+};
+
+module.exports = ContactName;
+});
+
+// file: lib/common/plugin/ContactOrganization.js
+define("cordova/plugin/ContactOrganization", function(require, exports, module) {
+/**
+* Contact organization.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param name
+* @param dept
+* @param title
+* @param startDate
+* @param endDate
+* @param location
+* @param desc
+*/
+
+var ContactOrganization = function(pref, type, name, dept, title) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.name = name || null;
+    this.department = dept || null;
+    this.title = title || null;
+};
+
+module.exports = ContactOrganization;
+});
+
+// file: lib/common/plugin/Coordinates.js
+define("cordova/plugin/Coordinates", function(require, exports, module) {
+/**
+ * This class contains position information.
+ * @param {Object} lat
+ * @param {Object} lng
+ * @param {Object} alt
+ * @param {Object} acc
+ * @param {Object} head
+ * @param {Object} vel
+ * @param {Object} altacc
+ * @constructor
+ */
+var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
+    /**
+     * The latitude of the position.
+     */
+    this.latitude = lat;
+    /**
+     * The longitude of the position,
+     */
+    this.longitude = lng;
+    /**
+     * The accuracy of the position.
+     */
+    this.accuracy = acc;
+    /**
+     * The altitude of the position.
+     */
+    this.altitude = (alt !== undefined ? alt : null);
+    /**
+     * The direction the device is moving at the position.
+     */
+    this.heading = (head !== undefined ? head : null);
+    /**
+     * The velocity with which the device is moving at the position.
+     */
+    this.speed = (vel !== undefined ? vel : null);
+
+    if (this.speed === 0 || this.speed === null) {
+        this.heading = NaN;
+    }
+
+    /**
+     * The altitude accuracy of the position.
+     */
+    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
+};
+
+module.exports = Coordinates;
+
+});
+
+// file: lib/common/plugin/DirectoryEntry.js
+define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileError = require('cordova/plugin/FileError'),
+    DirectoryReader = require('cordova/plugin/DirectoryReader');
+
+/**
+ * An interface representing a directory on the file system.
+ *
+ * {boolean} isFile always false (readonly)
+ * {boolean} isDirectory always true (readonly)
+ * {DOMString} name of the directory, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the directory (readonly)
+ * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
+ */
+var DirectoryEntry = function(name, fullPath) {
+     DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
+};
+
+utils.extend(DirectoryEntry, Entry);
+
+/**
+ * Creates a new DirectoryReader to read entries from this directory
+ */
+DirectoryEntry.prototype.createReader = function() {
+    return new DirectoryReader(this.fullPath);
+};
+
+/**
+ * Creates or looks up a directory
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
+ * @param {Flags} options to create or excluively create the directory
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
+};
+
+/**
+ * Deletes a directory and all of it's contents
+ *
+ * @param {Function} successCallback is called with no parameters
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
+};
+
+/**
+ * Creates or looks up a file
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
+ * @param {Flags} options to create or excluively create the file
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var FileEntry = require('cordova/plugin/FileEntry');
+        var entry = new FileEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
+};
+
+module.exports = DirectoryEntry;
+
+});
+
+// file: lib/common/plugin/DirectoryReader.js
+define("cordova/plugin/DirectoryReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError') ;
+
+/**
+ * An interface that lists the files and directories in a directory.
+ */
+function DirectoryReader(path) {
+    this.path = path || null;
+}
+
+/**
+ * Returns a list of entries from a directory.
+ *
+ * @param {Function} successCallback is called with a list of entries
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var retVal = [];
+        for (var i=0; i<result.length; i++) {
+            var entry = null;
+            if (result[i].isDirectory) {
+                entry = new (require('cordova/plugin/DirectoryEntry'))();
+            }
+            else if (result[i].isFile) {
+                entry = new (require('cordova/plugin/FileEntry'))();
+            }
+            entry.isDirectory = result[i].isDirectory;
+            entry.isFile = result[i].isFile;
+            entry.name = result[i].name;
+            entry.fullPath = result[i].fullPath;
+            retVal.push(entry);
+        }
+        successCallback(retVal);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "readEntries", [this.path]);
+};
+
+module.exports = DirectoryReader;
+
+});
+
+// file: lib/common/plugin/Entry.js
+define("cordova/plugin/Entry", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    Metadata = require('cordova/plugin/Metadata');
+
+/**
+ * Represents a file or directory on the local file system.
+ *
+ * @param isFile
+ *            {boolean} true if Entry is a file (readonly)
+ * @param isDirectory
+ *            {boolean} true if Entry is a directory (readonly)
+ * @param name
+ *            {DOMString} name of the file or directory, excluding the path
+ *            leading to it (readonly)
+ * @param fullPath
+ *            {DOMString} the absolute full path to the file or directory
+ *            (readonly)
+ */
+function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
+    this.isFile = (typeof isFile != 'undefined'?isFile:false);
+    this.isDirectory = (typeof isDirectory != 'undefined'?isDirectory:false);
+    this.name = name || '';
+    this.fullPath = fullPath || '';
+    this.filesystem = fileSystem || null;
+}
+
+/**
+ * Look up the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ */
+Entry.prototype.getMetadata = function(successCallback, errorCallback) {
+  var success = typeof successCallback !== 'function' ? null : function(lastModified) {
+      var metadata = new Metadata(lastModified);
+      successCallback(metadata);
+  };
+  var fail = typeof errorCallback !== 'function' ? null : function(code) {
+      errorCallback(new FileError(code));
+  };
+
+  exec(success, fail, "File", "getMetadata", [this.fullPath]);
+};
+
+/**
+ * Set the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ * @param metadataObject
+ *            {Object} keys and values to set
+ */
+Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
+
+  exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
+};
+
+/**
+ * Move a file or directory to a new location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to move this entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new DirectoryEntry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+    // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Copy a directory to a different location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to copy the entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new Entry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+
+        // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        // success callback
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Return a URL that can be used to identify this entry.
+ */
+Entry.prototype.toURL = function() {
+    // fullPath attribute contains the full URL
+    return this.fullPath;
+};
+
+/**
+ * Returns a URI that can be used to identify this entry.
+ *
+ * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
+ * @return uri
+ */
+Entry.prototype.toURI = function(mimeType) {
+    console.log("DEPRECATED: Update your code to use 'toURL'");
+    // fullPath attribute contains the full URI
+    return this.toURL();
+};
+
+/**
+ * Remove a file or directory. It is an error to attempt to delete a
+ * directory that is not empty. It is an error to attempt to delete a
+ * root directory of a file system.
+ *
+ * @param successCallback {Function} called with no parameters
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.remove = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "remove", [this.fullPath]);
+};
+
+/**
+ * Look up the parent DirectoryEntry of this entry.
+ *
+ * @param successCallback {Function} called with the parent DirectoryEntry object
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.getParent = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getParent", [this.fullPath]);
+};
+
+module.exports = Entry;
+});
+
+// file: lib/common/plugin/File.js
+define("cordova/plugin/File", function(require, exports, module) {
+/**
+ * Constructor.
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+
+var File = function(name, fullPath, type, lastModifiedDate, size){
+    this.name = name || '';
+    this.fullPath = fullPath || null;
+    this.type = type || null;
+    this.lastModifiedDate = lastModifiedDate || null;
+    this.size = size || 0;
+};
+
+module.exports = File;
+});
+
+// file: lib/common/plugin/FileEntry.js
+define("cordova/plugin/FileEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileWriter = require('cordova/plugin/FileWriter'),
+    File = require('cordova/plugin/File'),
+    FileError = require('cordova/plugin/FileError');
+
+/**
+ * An interface representing a file on the file system.
+ *
+ * {boolean} isFile always true (readonly)
+ * {boolean} isDirectory always false (readonly)
+ * {DOMString} name of the file, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the file (readonly)
+ * {FileSystem} filesystem on which the file resides (readonly)
+ */
+var FileEntry = function(name, fullPath) {
+     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
+};
+
+utils.extend(FileEntry, Entry);
+
+/**
+ * Creates a new FileWriter associated with the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new FileWriter
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
+    this.file(function(filePointer) {
+        var writer = new FileWriter(filePointer);
+
+        if (writer.fileName === null || writer.fileName === "") {
+            if (typeof errorCallback === "function") {
+                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
+            }
+        } else {
+            if (typeof successCallback === "function") {
+                successCallback(writer);
+            }
+        }
+    }, errorCallback);
+};
+
+/**
+ * Returns a File that represents the current state of the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new File object
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.file = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(f) {
+        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
+        successCallback(file);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
+};
+
+
+module.exports = FileEntry;
+});
+
+// file: lib/common/plugin/FileError.js
+define("cordova/plugin/FileError", function(require, exports, module) {
+/**
+ * FileError
+ */
+function FileError(error) {
+  this.code = error || null;
+}
+
+// File error codes
+// Found in DOMException
+FileError.NOT_FOUND_ERR = 1;
+FileError.SECURITY_ERR = 2;
+FileError.ABORT_ERR = 3;
+
+// Added by File API specification
+FileError.NOT_READABLE_ERR = 4;
+FileError.ENCODING_ERR = 5;
+FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
+FileError.INVALID_STATE_ERR = 7;
+FileError.SYNTAX_ERR = 8;
+FileError.INVALID_MODIFICATION_ERR = 9;
+FileError.QUOTA_EXCEEDED_ERR = 10;
+FileError.TYPE_MISMATCH_ERR = 11;
+FileError.PATH_EXISTS_ERR = 12;
+
+module.exports = FileError;
+});
+
+// file: lib/common/plugin/FileReader.js
+define("cordova/plugin/FileReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class reads the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To read from the SD card, the file name is "sdcard/my_file.txt"
+ * @constructor
+ */
+var FileReader = function() {
+    this.fileName = "";
+
+    this.readyState = 0; // FileReader.EMPTY
+
+    // File data
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onloadstart = null;    // When the read starts.
+    this.onprogress = null;     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)
+    this.onload = null;         // When the read has successfully completed.
+    this.onerror = null;        // When the read has failed (see errors).
+    this.onloadend = null;      // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the read has been aborted. For instance, by invoking the abort() method.
+};
+
+// States
+FileReader.EMPTY = 0;
+FileReader.LOADING = 1;
+FileReader.DONE = 2;
+
+/**
+ * Abort reading file.
+ */
+FileReader.prototype.abort = function() {
+    this.result = null;
+
+    if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
+      return;
+    }
+
+    this.readyState = FileReader.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === 'function') {
+        this.onabort(new ProgressEvent('abort', {target:this}));
+    }
+    // If load end callback
+    if (typeof this.onloadend === 'function') {
+        this.onloadend(new ProgressEvent('loadend', {target:this}));
+    }
+};
+
+/**
+ * Read text file.
+ *
+ * @param file          {File} File object containing file properties
+ * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
+ */
+FileReader.prototype.readAsText = function(file, encoding) {
+    // Figure out pathing
+    this.fileName = '';
+    if (typeof file.fullPath === 'undefined') {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    // Default encoding is UTF-8
+    var enc = encoding ? encoding : "UTF-8";
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // null result
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsText", [this.fileName, enc]);
+};
+
+
+/**
+ * Read file and return data as a base64 encoded data url.
+ * A data url is of the form:
+ *      data:[<mediatype>][;base64],<data>
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsDataURL = function(file) {
+    this.fileName = "";
+    if (typeof file.fullPath === "undefined") {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsDataURL", [this.fileName]);
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsBinaryString = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('method "readAsBinaryString" is not supported at this time.');
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsArrayBuffer = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('This method is not supported at this time.');
+};
+
+module.exports = FileReader;
+});
+
+// file: lib/common/plugin/FileSystem.js
+define("cordova/plugin/FileSystem", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+
+/**
+ * An interface representing a file system
+ *
+ * @constructor
+ * {DOMString} name the unique name of the file system (readonly)
+ * {DirectoryEntry} root directory of the file system (readonly)
+ */
+var FileSystem = function(name, root) {
+    this.name = name || null;
+    if (root) {
+        this.root = new DirectoryEntry(root.name, root.fullPath);
+    }
+};
+
+module.exports = FileSystem;
+
+});
+
+// file: lib/common/plugin/FileTransfer.js
+define("cordova/plugin/FileTransfer", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileTransferError = require('cordova/plugin/FileTransferError');
+
+/**
+ * FileTransfer uploads a file to a remote server.
+ * @constructor
+ */
+var FileTransfer = function() {};
+
+/**
+* Given an absolute file path, uploads a file on the device to a remote server
+* using a multipart HTTP request.
+* @param filePath {String}           Full path of the file on the device
+* @param server {String}             URL of the server to receive the file
+* @param successCallback (Function}  Callback to be invoked when upload has completed
+* @param errorCallback {Function}    Callback to be invoked upon error
+* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
+* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
+*/
+FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
+    // sanity parameter checking
+    if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
+    // check for options
+    var fileKey = null;
+    var fileName = null;
+    var mimeType = null;
+    var params = null;
+    var chunkedMode = true;
+    var headers = null;
+    if (options) {
+        fileKey = options.fileKey;
+        fileName = options.fileName;
+        mimeType = options.mimeType;
+        headers = options.headers;
+        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
+            chunkedMode = options.chunkedMode;
+        }
+        if (options.params) {
+            params = options.params;
+        }
+        else {
+            params = {};
+        }
+    }
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers]);
+};
+
+/**
+ * Downloads a file form a given URL and saves it to the specified directory.
+ * @param source {String}          URL of the server to receive the file
+ * @param target {String}         Full path of the file on the device
+ * @param successCallback (Function}  Callback to be invoked when upload has completed
+ * @param errorCallback {Function}    Callback to be invoked upon error
+ */
+FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
+    // sanity parameter checking
+    if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
+    var win = function(result) {
+        var entry = null;
+        if (result.isDirectory) {
+            entry = new (require('cordova/plugin/DirectoryEntry'))();
+        }
+        else if (result.isFile) {
+            entry = new (require('cordova/plugin/FileEntry'))();
+        }
+        entry.isDirectory = result.isDirectory;
+        entry.isFile = result.isFile;
+        entry.name = result.name;
+        entry.fullPath = result.fullPath;
+        successCallback(entry);
+    };
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
+};
+
+module.exports = FileTransfer;
+
+});
+
+// file: lib/common/plugin/FileTransferError.js
+define("cordova/plugin/FileTransferError", function(require, exports, module) {
+/**
+ * FileTransferError
+ * @constructor
+ */
+var FileTransferError = function(code, source, target, status) {
+    this.code = code || null;
+    this.source = source || null;
+    this.target = target || null;
+    this.http_status = status || null;
+};
+
+FileTransferError.FILE_NOT_FOUND_ERR = 1;
+FileTransferError.INVALID_URL_ERR = 2;
+FileTransferError.CONNECTION_ERR = 3;
+
+module.exports = FileTransferError;
+
+});
+
+// file: lib/common/plugin/FileUploadOptions.js
+define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
+/**
+ * Options to customize the HTTP request used to upload files.
+ * @constructor
+ * @param fileKey {String}   Name of file request parameter.
+ * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
+ * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
+ * @param params {Object}    Object with key: value params to send to the server.
+ * @param headers {Object}   Keys are header names, values are header values. Multiple
+ *                           headers of the same name are not supported.
+ */
+var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {
+    this.fileKey = fileKey || null;
+    this.fileName = fileName || null;
+    this.mimeType = mimeType || null;
+    this.params = params || null;
+    this.headers = headers || null;
+};
+
+module.exports = FileUploadOptions;
+
+});
+
+// file: lib/common/plugin/FileUploadResult.js
+define("cordova/plugin/FileUploadResult", function(require, exports, module) {
+/**
+ * FileUploadResult
+ * @constructor
+ */
+var FileUploadResult = function() {
+    this.bytesSent = 0;
+    this.responseCode = null;
+    this.response = null;
+};
+
+module.exports = FileUploadResult;
+});
+
+// file: lib/common/plugin/FileWriter.js
+define("cordova/plugin/FileWriter", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class writes to the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To write to the SD card, the file name is "sdcard/my_file.txt"
+ *
+ * @constructor
+ * @param file {File} File object containing file properties
+ * @param append if true write to the end of the file, otherwise overwrite the file
+ */
+var FileWriter = function(file) {
+    this.fileName = "";
+    this.length = 0;
+    if (file) {
+        this.fileName = file.fullPath || file;
+        this.length = file.size || 0;
+    }
+    // default is to write at the beginning of the file
+    this.position = 0;
+
+    this.readyState = 0; // EMPTY
+
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onwritestart = null;   // When writing starts
+    this.onprogress = null;     // While writing the file, and reporting partial file data
+    this.onwrite = null;        // When the write has successfully completed.
+    this.onwriteend = null;     // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
+    this.onerror = null;        // When the write has failed (see errors).
+};
+
+// States
+FileWriter.INIT = 0;
+FileWriter.WRITING = 1;
+FileWriter.DONE = 2;
+
+/**
+ * Abort writing file.
+ */
+FileWriter.prototype.abort = function() {
+    // check for invalid state
+    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // set error
+    this.error = new FileError(FileError.ABORT_ERR);
+
+    this.readyState = FileWriter.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === "function") {
+        this.onabort(new ProgressEvent("abort", {"target":this}));
+    }
+
+    // If write end callback
+    if (typeof this.onwriteend === "function") {
+        this.onwriteend(new ProgressEvent("writeend", {"target":this}));
+    }
+};
+
+/**
+ * Writes data to the file
+ *
+ * @param text to be written
+ */
+FileWriter.prototype.write = function(text) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":me}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // position always increases by bytes written because file would be extended
+            me.position += r;
+            // The length of the file is now where we are done writing.
+
+            me.length = me.position;
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "write", [this.fileName, text, this.position]);
+};
+
+/**
+ * Moves the file pointer to the location specified.
+ *
+ * If the offset is a negative number the position of the file
+ * pointer is rewound.  If the offset is greater than the file
+ * size the position is set to the end of the file.
+ *
+ * @param offset is the location to move the file pointer to.
+ */
+FileWriter.prototype.seek = function(offset) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    if (!offset && offset !== 0) {
+        return;
+    }
+
+    // See back from end of file.
+    if (offset < 0) {
+        this.position = Math.max(offset + this.length, 0);
+    }
+    // Offset is bigger then file size so set position
+    // to the end of the file.
+    else if (offset > this.length) {
+        this.position = this.length;
+    }
+    // Offset is between 0 and file size so set the position
+    // to start writing.
+    else {
+        this.position = offset;
+    }
+};
+
+/**
+ * Truncates the file to the size specified.
+ *
+ * @param size to chop the file at.
+ */
+FileWriter.prototype.truncate = function(size) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":this}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Update the length of the file
+            me.length = r;
+            me.position = Math.min(me.position, r);
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "truncate", [this.fileName, size]);
+};
+
+module.exports = FileWriter;
+
+});
+
+// file: lib/common/plugin/Flags.js
+define("cordova/plugin/Flags", function(require, exports, module) {
+/**
+ * Supplies arguments to methods that lookup or create files and directories.
+ *
+ * @param create
+ *            {boolean} file or directory if it doesn't exist
+ * @param exclusive
+ *            {boolean} used with create; if true the command will fail if
+ *            target path exists
+ */
+function Flags(create, exclusive) {
+    this.create = create || false;
+    this.exclusive = exclusive || false;
+}
+
+module.exports = Flags;
+});
+
+// file: lib/common/plugin/LocalFileSystem.js
+define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Represents a local file system.
+ */
+var LocalFileSystem = function() {
+
+};
+
+LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
+LocalFileSystem.PERSISTENT = 1; //persistent
+
+module.exports = LocalFileSystem;
+});
+
+// file: lib/common/plugin/Media.js
+define("cordova/plugin/Media", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+var mediaObjects = {};
+
+/**
+ * This class provides access to the device media, interfaces to both sound and video
+ *
+ * @constructor
+ * @param src                   The file name or url to play
+ * @param successCallback       The callback to be called when the file is done playing or recording.
+ *                                  successCallback()
+ * @param errorCallback         The callback to be called if there is an error.
+ *                                  errorCallback(int errorCode) - OPTIONAL
+ * @param statusCallback        The callback to be called when media status has changed.
+ *                                  statusCallback(int statusCode) - OPTIONAL
+ */
+var Media = function(src, successCallback, errorCallback, statusCallback) {
+
+    // successCallback optional
+    if (successCallback && (typeof successCallback !== "function")) {
+        console.log("Media Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Media Error: errorCallback is not a function");
+        return;
+    }
+
+    // statusCallback optional
+    if (statusCallback && (typeof statusCallback !== "function")) {
+        console.log("Media Error: statusCallback is not a function");
+        return;
+    }
+
+    this.id = utils.createUUID();
+    mediaObjects[this.id] = this;
+    this.src = src;
+    this.successCallback = successCallback;
+    this.errorCallback = errorCallback;
+    this.statusCallback = statusCallback;
+    this._duration = -1;
+    this._position = -1;
+    exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
+};
+
+// Media messages
+Media.MEDIA_STATE = 1;
+Media.MEDIA_DURATION = 2;
+Media.MEDIA_POSITION = 3;
+Media.MEDIA_ERROR = 9;
+
+// Media states
+Media.MEDIA_NONE = 0;
+Media.MEDIA_STARTING = 1;
+Media.MEDIA_RUNNING = 2;
+Media.MEDIA_PAUSED = 3;
+Media.MEDIA_STOPPED = 4;
+Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"];
+
+// "static" function to return existing objs.
+Media.get = function(id) {
+    return mediaObjects[id];
+};
+
+/**
+ * Start or resume playing audio file.
+ */
+Media.prototype.play = function(options) {
+    exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]);
+};
+
+/**
+ * Stop playing audio file.
+ */
+Media.prototype.stop = function() {
+    var me = this;
+    exec(function() {
+        me._position = 0;
+        me.successCallback();
+    }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
+};
+
+/**
+ * Seek or jump to a new time in the track..
+ */
+Media.prototype.seekTo = function(milliseconds) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+    }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]);
+};
+
+/**
+ * Pause playing audio file.
+ */
+Media.prototype.pause = function() {
+    exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]);
+};
+
+/**
+ * Get duration of an audio file.
+ * The duration is only set for audio that is playing, paused or stopped.
+ *
+ * @return      duration or -1 if not known.
+ */
+Media.prototype.getDuration = function() {
+    return this._duration;
+};
+
+/**
+ * Get position of audio.
+ */
+Media.prototype.getCurrentPosition = function(success, fail) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+        success(p);
+    }, fail, "Media", "getCurrentPositionAudio", [this.id]);
+};
+
+/**
+ * Start recording audio file.
+ */
+Media.prototype.startRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+};
+
+/**
+ * Stop recording audio file.
+ */
+Media.prototype.stopRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
+};
+
+/**
+ * Release the resources.
+ */
+Media.prototype.release = function() {
+    exec(null, this.errorCallback, "Media", "release", [this.id]);
+};
+
+/**
+ * Adjust the volume.
+ */
+Media.prototype.setVolume = function(volume) {
+    exec(null, null, "Media", "setVolume", [this.id, volume]);
+};
+
+/**
+ * Audio has status update.
+ * PRIVATE
+ *
+ * @param id            The media object id (string)
+ * @param status        The status code (int)
+ * @param msg           The status message (string)
+ */
+Media.onStatus = function(id, msg, value) {
+    var media = mediaObjects[id];
+    // If state update
+    if (msg === Media.MEDIA_STATE) {
+        if (value === Media.MEDIA_STOPPED) {
+            if (media.successCallback) {
+                media.successCallback();
+            }
+        }
+        if (media.statusCallback) {
+            media.statusCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_DURATION) {
+        media._duration = value;
+    }
+    else if (msg === Media.MEDIA_ERROR) {
+        if (media.errorCallback) {
+            // value should be a MediaError object when msg == MEDIA_ERROR
+            media.errorCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_POSITION) {
+        media._position = value;
+    }
+};
+
+module.exports = Media;
+});
+
+// file: lib/common/plugin/MediaError.js
+define("cordova/plugin/MediaError", function(require, exports, module) {
+/**
+ * This class contains information about any Media errors.
+ * @constructor
+ */
+var MediaError = function(code, msg) {
+    this.code = (code !== undefined ? code : null);
+    this.message = msg || "";
+};
+
+MediaError.MEDIA_ERR_NONE_ACTIVE    = 0;
+MediaError.MEDIA_ERR_ABORTED        = 1;
+MediaError.MEDIA_ERR_NETWORK        = 2;
+MediaError.MEDIA_ERR_DECODE         = 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+
+module.exports = MediaError;
+});
+
+// file: lib/common/plugin/MediaFile.js
+define("cordova/plugin/MediaFile", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    File = require('cordova/plugin/File'),
+    CaptureError = require('cordova/plugin/CaptureError');
+/**
+ * Represents a single file.
+ *
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+var MediaFile = function(name, fullPath, type, lastModifiedDate, size){
+    MediaFile.__super__.constructor.apply(this, arguments);
+};
+
+utils.extend(MediaFile, File);
+
+/**
+ * Request capture format data for a specific file and type
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ */
+MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
+    if (typeof this.fullPath === "undefined" || this.fullPath === null) {
+        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
+    } else {
+        exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]);
+    }
+};
+
+// TODO: can we axe this?
+/**
+ * Casts a PluginResult message property  (array of objects) to an array of MediaFile objects
+ * (used in Objective-C and Android)
+ *
+ * @param {PluginResult} pluginResult
+ */
+MediaFile.cast = function(pluginResult) {
+    var mediaFiles = [];
+    for (var i=0; i<pluginResult.message.length; i++) {
+        var mediaFile = new MediaFile();
+        mediaFile.name = pluginResult.message[i].name;
+        mediaFile.fullPath = pluginResult.message[i].fullPath;
+        mediaFile.type = pluginResult.message[i].type;
+        mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
+        mediaFile.size = pluginResult.message[i].size;
+        mediaFiles.push(mediaFile);
+    }
+    pluginResult.message = mediaFiles;
+    return pluginResult;
+};
+
+module.exports = MediaFile;
+
+});
+
+// file: lib/common/plugin/MediaFileData.js
+define("cordova/plugin/MediaFileData", function(require, exports, module) {
+/**
+ * MediaFileData encapsulates format information of a media file.
+ *
+ * @param {DOMString} codecs
+ * @param {long} bitrate
+ * @param {long} height
+ * @param {long} width
+ * @param {float} duration
+ */
+var MediaFileData = function(codecs, bitrate, height, width, duration){
+    this.codecs = codecs || null;
+    this.bitrate = bitrate || 0;
+    this.height = height || 0;
+    this.width = width || 0;
+    this.duration = duration || 0;
+};
+
+module.exports = MediaFileData;
+});
+
+// file: lib/common/plugin/Metadata.js
+define("cordova/plugin/Metadata", function(require, exports, module) {
+/**
+ * Information about the state of the file or directory
+ *
+ * {Date} modificationTime (readonly)
+ */
+var Metadata = function(time) {
+    this.modificationTime = (typeof time != 'undefined'?new Date(time):null);
+};
+
+module.exports = Metadata;
+});
+
+// file: lib/common/plugin/Position.js
+define("cordova/plugin/Position", function(require, exports, module) {
+var Coordinates = require('cordova/plugin/Coordinates');
+
+var Position = function(coords, timestamp) {
+    if (coords) {
+        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
+    } else {
+        this.coords = new Coordinates();
+    }
+    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
+};
+
+module.exports = Position;
+
+});
+
+// file: lib/common/plugin/PositionError.js
+define("cordova/plugin/PositionError", function(require, exports, module) {
+/**
+ * Position error object
+ *
+ * @constructor
+ * @param code
+ * @param message
+ */
+var PositionError = function(code, message) {
+    this.code = code || null;
+    this.message = message || '';
+};
+
+PositionError.PERMISSION_DENIED = 1;
+PositionError.POSITION_UNAVAILABLE = 2;
+PositionError.TIMEOUT = 3;
+
+module.exports = PositionError;
+});
+
+// file: lib/common/plugin/ProgressEvent.js
+define("cordova/plugin/ProgressEvent", function(require, exports, module) {
+// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
+// Feature test: See if we can instantiate a native ProgressEvent;
+// if so, use that approach,
+// otherwise fill-in with our own implementation.
+//
+// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
+var ProgressEvent = (function() {
+    /*
+    var createEvent = function(data) {
+        var event = document.createEvent('Events');
+        event.initEvent('ProgressEvent', false, false);
+        if (data) {
+            for (var i in data) {
+                if (data.hasOwnProperty(i)) {
+                    event[i] = data[i];
+                }
+            }
+            if (data.target) {
+                // TODO: cannot call <some_custom_object>.dispatchEvent
+                // need to first figure out how to implement EventTarget
+            }
+        }
+        return event;
+    };
+    try {
+        var ev = createEvent({type:"abort",target:document});
+        return function ProgressEvent(type, data) {
+            data.type = type;
+            return createEvent(data);
+        };
+    } catch(e){
+    */
+        return function ProgressEvent(type, dict) {
+            this.type = type;
+            this.bubbles = false;
+            this.cancelBubble = false;
+            this.cancelable = false;
+            this.lengthComputable = false;
+            this.loaded = dict && dict.loaded ? dict.loaded : 0;
+            this.total = dict && dict.total ? dict.total : 0;
+            this.target = dict && dict.target ? dict.target : null;
+        };
+    //}
+})();
+
+module.exports = ProgressEvent;
+});
+
+// file: lib/common/plugin/accelerometer.js
+define("cordova/plugin/accelerometer", function(require, exports, module) {
+/**
+ * This class provides access to device accelerometer data.
+ * @constructor
+ */
+var utils = require("cordova/utils"),
+    exec = require("cordova/exec"),
+    Acceleration = require('cordova/plugin/Acceleration');
+
+// Is the accel sensor running?
+var running = false;
+
+// Keeps reference to watchAcceleration calls.
+var timers = {};
+
+// Array of listeners; used to keep track of when we should call start and stop.
+var listeners = [];
+
+// Last returned acceleration object from native
+var accel = null;
+
+// Tells native to start.
+function start() {
+    exec(function(a) {
+        var tempListeners = listeners.slice(0);
+        accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].win(accel);
+        }
+    }, function(e) {
+        var tempListeners = listeners.slice(0);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].fail(e);
+        }
+    }, "Accelerometer", "start", []);
+    running = true;
+}
+
+// Tells native to stop.
+function stop() {
+    exec(null, null, "Accelerometer", "stop", []);
+    running = false;
+}
+
+// Adds a callback pair to the listeners array
+function createCallbackPair(win, fail) {
+    return {win:win, fail:fail};
+}
+
+// Removes a win/fail listener pair from the listeners array
+function removeListeners(l) {
+    var idx = listeners.indexOf(l);
+    if (idx > -1) {
+        listeners.splice(idx, 1);
+        if (listeners.length === 0) {
+            stop();
+        }
+    }
+}
+
+var accelerometer = {
+    /**
+     * Asynchronously aquires the current acceleration.
+     *
+     * @param {Function} successCallback    The function to call when the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     */
+    getCurrentAcceleration: function(successCallback, errorCallback, options) {
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "getCurrentAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        var p;
+        var win = function(a) {
+            removeListeners(p);
+            successCallback(a);
+        };
+        var fail = function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        };
+
+        p = createCallbackPair(win, fail);
+        listeners.push(p);
+
+        if (!running) {
+            start();
+        }
+    },
+
+    /**
+     * Asynchronously aquires the acceleration repeatedly at a given interval.
+     *
+     * @param {Function} successCallback    The function to call each time the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchAcceleration: function(successCallback, errorCallback, options) {
+        // Default interval (10 sec)
+        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
+
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "watchAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        // Keep reference to watch id, and report accel readings as often as defined in frequency
+        var id = utils.createUUID();
+
+        var p = createCallbackPair(function(){}, function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        });
+        listeners.push(p);
+
+        timers[id] = {
+            timer:window.setInterval(function() {
+                if (accel) {
+                    successCallback(accel);
+                }
+            }, frequency),
+            listeners:p
+        };
+
+        if (running) {
+            // If we're already running then immediately invoke the success callback
+            // but only if we have retreived a value, sample code does not check for null ...
+            if(accel) {
+                successCallback(accel);
+            }
+        } else {
+            start();
+        }
+
+        return id;
+    },
+
+    /**
+     * Clears the specified accelerometer watch.
+     *
+     * @param {String} id       The id of the watch returned from #watchAcceleration.
+     */
+    clearWatch: function(id) {
+        // Stop javascript timer & remove from timer list
+        if (id && timers[id]) {
+            window.clearInterval(timers[id].timer);
+            removeListeners(timers[id].listeners);
+            delete timers[id];
+        }
+    }
+};
+
+module.exports = accelerometer;
+
+});
+
+// file: lib/common/plugin/battery.js
+define("cordova/plugin/battery", function(require, exports, module) {
+/**
+ * This class contains information about the current battery status.
+ * @constructor
+ */
+var cordova = require('cordova'),
+    exec = require('cordova/exec');
+
+function handlers() {
+  return battery.channels.batterystatus.numHandlers +
+         battery.channels.batterylow.numHandlers +
+         battery.channels.batterycritical.numHandlers;
+}
+
+var Battery = function() {
+    this._level = null;
+    this._isPlugged = null;
+    // Create new event handlers on the window (returns a channel instance)
+    var subscriptionEvents = {
+      onSubscribe:this.onSubscribe,
+      onUnsubscribe:this.onUnsubscribe
+    };
+    this.channels = {
+      batterystatus:cordova.addWindowEventHandler("batterystatus", subscriptionEvents),
+      batterylow:cordova.addWindowEventHandler("batterylow", subscriptionEvents),
+      batterycritical:cordova.addWindowEventHandler("batterycritical", subscriptionEvents)
+    };
+};
+/**
+ * Event handlers for when callbacks get registered for the battery.
+ * Keep track of how many handlers we have so we can start and stop the native battery listener
+ * appropriately (and hopefully save on battery life!).
+ */
+Battery.prototype.onSubscribe = function() {
+  var me = battery;
+  // If we just registered the first handler, make sure native listener is started.
+  if (handlers() === 1) {
+    exec(me._status, me._error, "Battery", "start", []);
+  }
+};
+
+Battery.prototype.onUnsubscribe = function() {
+  var me = battery;
+
+  // If we just unregistered the last handler, make sure native listener is stopped.
+  if (handlers() === 0) {
+      exec(null, null, "Battery", "stop", []);
+  }
+};
+
+/**
+ * Callback for battery status
+ *
+ * @param {Object} info            keys: level, isPlugged
+ */
+Battery.prototype._status = function(info) {
+    if (info) {
+        var me = battery;
+    var level = info.level;
+        if (me._level !== level || me._isPlugged !== info.isPlugged) {
+            // Fire batterystatus event
+            cordova.fireWindowEvent("batterystatus", info);
+
+            // Fire low battery event
+            if (level === 20 || level === 5) {
+                if (level === 20) {
+                    cordova.fireWindowEvent("batterylow", info);
+                }
+                else {
+                    cordova.fireWindowEvent("batterycritical", info);
+                }
+            }
+        }
+        me._level = level;
+        me._isPlugged = info.isPlugged;
+    }
+};
+
+/**
+ * Error callback for battery start
+ */
+Battery.prototype._error = function(e) {
+    console.log("Error initializing Battery: " + e);
+};
+
+var battery = new Battery();
+
+module.exports = battery;
+});
+
+// file: lib/common/plugin/capture.js
+define("cordova/plugin/capture", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    MediaFile = require('cordova/plugin/MediaFile');
+
+/**
+ * Launches a capture of different types.
+ *
+ * @param (DOMString} type
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+function _capture(type, successCallback, errorCallback, options) {
+    var win = function(pluginResult) {
+        var mediaFiles = [];
+        var i;
+        for (i = 0; i < pluginResult.length; i++) {
+            var mediaFile = new MediaFile();
+            mediaFile.name = pluginResult[i].name;
+            mediaFile.fullPath = pluginResult[i].fullPath;
+            mediaFile.type = pluginResult[i].type;
+            mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
+            mediaFile.size = pluginResult[i].size;
+            mediaFiles.push(mediaFile);
+        }
+        successCallback(mediaFiles);
+    };
+    exec(win, errorCallback, "Capture", type, [options]);
+}
+/**
+ * The Capture interface exposes an interface to the camera and microphone of the hosting device.
+ */
+function Capture() {
+    this.supportedAudioModes = [];
+    this.supportedImageModes = [];
+    this.supportedVideoModes = [];
+}
+
+/**
+ * Launch audio recorder application for recording audio clip(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureAudioOptions} options
+ */
+Capture.prototype.captureAudio = function(successCallback, errorCallback, options){
+    _capture("captureAudio", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch camera application for taking image(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureImageOptions} options
+ */
+Capture.prototype.captureImage = function(successCallback, errorCallback, options){
+    _capture("captureImage", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch device camera application for recording video(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+Capture.prototype.captureVideo = function(successCallback, errorCallback, options){
+    _capture("captureVideo", successCallback, errorCallback, options);
+};
+
+
+module.exports = new Capture();
+
+});
+
+// file: lib/common/plugin/compass.js
+define("cordova/plugin/compass", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    utils = require('cordova/utils'),
+    CompassHeading = require('cordova/plugin/CompassHeading'),
+    CompassError = require('cordova/plugin/CompassError'),
+    timers = {},
+    compass = {
+        /**
+         * Asynchronously acquires the current heading.
+         * @param {Function} successCallback The function to call when the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {CompassOptions} options The options for getting the heading data (not used).
+         */
+        getCurrentHeading:function(successCallback, errorCallback, options) {
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var win = function(result) {
+                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
+                successCallback(ch);
+            };
+            var fail = function(code) {
+                var ce = new CompassError(code);
+                errorCallback(ce);
+            };
+
+            // Get heading
+            exec(win, fail, "Compass", "getHeading", [options]);
+        },
+
+        /**
+         * Asynchronously acquires the heading repeatedly at a given interval.
+         * @param {Function} successCallback The function to call each time the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {HeadingOptions} options The options for getting the heading data
+         * such as timeout and the frequency of the watch. For iOS, filter parameter
+         * specifies to watch via a distance filter rather than time.
+         */
+        watchHeading:function(successCallback, errorCallback, options) {
+            // Default interval (100 msec)
+            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
+            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
+
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var id = utils.createUUID();
+            if (filter > 0) {
+                // is an iOS request for watch by filter, no timer needed
+                timers[id] = "iOS";
+                compass.getCurrentHeading(successCallback, errorCallback, options);
+            } else {
+                // Start watch timer to get headings
+                timers[id] = window.setInterval(function() {
+                    compass.getCurrentHeading(successCallback, errorCallback);
+                }, frequency);
+            }
+
+            return id;
+        },
+
+        /**
+         * Clears the specified heading watch.
+         * @param {String} watchId The ID of the watch returned from #watchHeading.
+         */
+        clearWatch:function(id) {
+            // Stop javascript timer & remove from timer list
+            if (id && timers[id]) {
+                if (timers[id] != "iOS") {
+                      clearInterval(timers[id]);
+                  } else {
+                    // is iOS watch by filter so call into device to stop
+                    exec(null, null, "Compass", "stopHeading", []);
+                }
+                delete timers[id];
+            }
+        }
+    };
+
+module.exports = compass;
+});
+
+// file: lib/common/plugin/console-via-logger.js
+define("cordova/plugin/console-via-logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+
+var logger = require("cordova/plugin/logger");
+var utils  = require("cordova/utils");
+
+//------------------------------------------------------------------------------
+// object that we're exporting
+//------------------------------------------------------------------------------
+var console = module.exports;
+
+//------------------------------------------------------------------------------
+// copy of the original console object
+//------------------------------------------------------------------------------
+var WinConsole = window.console;
+
+//------------------------------------------------------------------------------
+// whether to use the logger
+//------------------------------------------------------------------------------
+var UseLogger = false;
+
+//------------------------------------------------------------------------------
+// Timers
+//------------------------------------------------------------------------------
+var Timers = {};
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+function noop() {}
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+console.useLogger = function (value) {
+    if (arguments.length) UseLogger = !!value;
+
+    if (UseLogger) {
+        if (logger.useConsole()) {
+            throw new Error("console and logger are too intertwingly");
+        }
+    }
+
+    return UseLogger;
+};
+
+//------------------------------------------------------------------------------
+console.log = function() {
+    if (logger.useConsole()) return;
+    logger.log.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.error = function() {
+    if (logger.useConsole()) return;
+    logger.error.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.warn = function() {
+    if (logger.useConsole()) return;
+    logger.warn.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.info = function() {
+    if (logger.useConsole()) return;
+    logger.info.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.debug = function() {
+    if (logger.useConsole()) return;
+    logger.debug.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.assert = function(expression) {
+    if (expression) return;
+
+    var message = utils.vformat(arguments[1], [].slice.call(arguments, 2));
+    console.log("ASSERT: " + message);
+};
+
+//------------------------------------------------------------------------------
+console.clear = function() {};
+
+//------------------------------------------------------------------------------
+console.dir = function(object) {
+    console.log("%o", object);
+};
+
+//------------------------------------------------------------------------------
+console.dirxml = function(node) {
+    console.log(node.innerHTML);
+};
+
+//------------------------------------------------------------------------------
+console.trace = noop;
+
+//------------------------------------------------------------------------------
+console.group = console.log;
+
+//------------------------------------------------------------------------------
+console.groupCollapsed = console.log;
+
+//------------------------------------------------------------------------------
+console.groupEnd = noop;
+
+//------------------------------------------------------------------------------
+console.time = function(name) {
+    Timers[name] = new Date().valueOf();
+};
+
+//------------------------------------------------------------------------------
+console.timeEnd = function(name) {
+    var timeStart = Timers[name];
+    if (!timeStart) {
+        console.warn("unknown timer: " + name);
+        return;
+    }
+
+    var timeElapsed = new Date().valueOf() - timeStart;
+    console.log(name + ": " + timeElapsed + "ms");
+};
+
+//------------------------------------------------------------------------------
+console.timeStamp = noop;
+
+//------------------------------------------------------------------------------
+console.profile = noop;
+
+//------------------------------------------------------------------------------
+console.profileEnd = noop;
+
+//------------------------------------------------------------------------------
+console.count = noop;
+
+//------------------------------------------------------------------------------
+console.exception = console.log;
+
+//------------------------------------------------------------------------------
+console.table = function(data, columns) {
+    console.log("%o", data);
+};
+
+//------------------------------------------------------------------------------
+// return a new function that calls both functions passed as args
+//------------------------------------------------------------------------------
+function wrapperedOrigCall(orgFunc, newFunc) {
+    return function() {
+        var args = [].slice.call(arguments);
+        try { orgFunc.apply(WinConsole, args); } catch (e) {}
+        try { newFunc.apply(console,    args); } catch (e) {}
+    };
+}
+
+//------------------------------------------------------------------------------
+// For every function that exists in the original console object, that
+// also exists in the new console object, wrap the new console method
+// with one that calls both
+//------------------------------------------------------------------------------
+for (var key in console) {
+    if (typeof WinConsole[key] == "function") {
+        console[key] = wrapperedOrigCall(WinConsole[key], console[key]);
+    }
+}
+
+});
+
+// file: lib/common/plugin/contacts.js
+define("cordova/plugin/contacts", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+* Represents a group of Contacts.
+* @constructor
+*/
+var contacts = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     * @param fields that should be searched
+     * @param successCB success callback
+     * @param errorCB error callback
+     * @param {ContactFindOptions} options that can be applied to contact searching
+     * @return array of Contacts matching search criteria
+     */
+    find:function(fields, successCB, errorCB, options) {
+        if (!successCB) {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+        if (!fields || (utils.isArray(fields) && fields.length === 0)) {
+            if (typeof errorCB === "function") {
+                errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+        } else {
+            var win = function(result) {
+                var cs = [];
+                for (var i = 0, l = result.length; i < l; i++) {
+                    cs.push(contacts.create(result[i]));
+                }
+                successCB(cs);
+            };
+            exec(win, errorCB, "Contacts", "search", [fields, options]);
+        }
+    },
+
+    /**
+     * This function creates a new contact, but it does not persist the contact
+     * to device storage. To persist the contact to device storage, invoke
+     * contact.save().
+     * @param properties an object who's properties will be examined to create a new Contact
+     * @returns new Contact object
+     */
+    create:function(properties) {
+        var i;
+        var contact = new Contact();
+        for (i in properties) {
+            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
+                contact[i] = properties[i];
+            }
+        }
+        return contact;
+    }
+};
+
+module.exports = contacts;
+
+});
+
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+var channel = require('cordova/channel'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+/**
+ * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+    this.available = false;
+    this.platform = null;
+    this.version = null;
+    this.name = null;
+    this.uuid = null;
+    this.cordova = null;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function(info) {
+            me.available = true;
+            me.platform = info.platform;
+            me.version = info.version;
+            me.name = info.name;
+            me.uuid = info.uuid;
+            me.cordova = info.cordova;
+            channel.onCordovaInfoReady.fire();
+        },function(e) {
+            me.available = false;
+            utils.alert("[ERROR] Error initializing Cordova: " + e);
+        });
+    });
+}
+
+/**
+ * Get device info
+ *
+ * @param {Function} successCallback The function to call when the heading data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
+ */
+Device.prototype.getInfo = function(successCallback, errorCallback) {
+
+    // successCallback required
+    if (typeof successCallback !== "function") {
+        console.log("Device Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Device Error: errorCallback is not a function");
+        return;
+    }
+
+    // Get info
+    exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/common/plugin/geolocation.js
+define("cordova/plugin/geolocation", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    PositionError = require('cordova/plugin/PositionError'),
+    Position = require('cordova/plugin/Position');
+
+var timers = {};   // list of timers in use
+
+// Returns default params, overrides if provided with values
+function parseParameters(options) {
+    var opt = {
+        maximumAge: 0,
+        enableHighAccuracy: false,
+        timeout: Infinity
+    };
+
+    if (options) {
+        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
+            opt.maximumAge = options.maximumAge;
+        }
+        if (options.enableHighAccuracy !== undefined) {
+            opt.enableHighAccuracy = options.enableHighAccuracy;
+        }
+        if (options.timeout !== undefined && !isNaN(options.timeout)) {
+            if (options.timeout < 0) {
+                opt.timeout = 0;
+            } else {
+                opt.timeout = options.timeout;
+            }
+        }
+    }
+
+    return opt;
+}
+
+// Returns a timeout failure, closed over a specified timeout value and error callback.
+function createTimeout(errorCallback, timeout) {
+    var t = setTimeout(function() {
+        clearTimeout(t);
+        t = null;
+        errorCallback({
+            code:PositionError.TIMEOUT,
+            message:"Position retrieval timed out."
+        });
+    }, timeout);
+    return t;
+}
+
+var geolocation = {
+    lastPosition:null, // reference to last known (cached) position returned
+    /**
+   * Asynchronously aquires the current position.
+   *
+   * @param {Function} successCallback    The function to call when the position data is available
+   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)
+   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)
+   */
+    getCurrentPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("getCurrentPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        // Timer var that will fire an error callback if no position is retrieved from native
+        // before the "timeout" param provided expires
+        var timeoutTimer = null;
+
+        var win = function(p) {
+            clearTimeout(timeoutTimer);
+            if (!timeoutTimer) {
+                // Timeout already happened, or native fired error callback for
+                // this geo request.
+                // Don't continue with success callback.
+                return;
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+        var fail = function(e) {
+            clearTimeout(timeoutTimer);
+            timeoutTimer = null;
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
+        // fire the success callback with the cached position.
+        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
+            successCallback(geolocation.lastPosition);
+        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
+        } else if (options.timeout === 0) {
+            fail({
+                code:PositionError.TIMEOUT,
+                message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
+            });
+        // Otherwise we have to call into native to retrieve a position.
+        } else {
+            if (options.timeout !== Infinity) {
+                // If the timeout value was not set to Infinity (default), then
+                // set up a timeout function that will fire the error callback
+                // if no successful position was retrieved before timeout expired.
+                timeoutTimer = createTimeout(fail, options.timeout);
+            } else {
+                // This is here so the check in the win function doesn't mess stuff up
+                // may seem weird but this guarantees timeoutTimer is
+                // always truthy before we call into native
+                timeoutTimer = true;
+            }
+            exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
+        }
+        return timeoutTimer;
+    },
+    /**
+     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,
+     * the successCallback is called with the new location.
+     *
+     * @param {Function} successCallback    The function to call each time the location data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)
+     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("watchPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        var id = utils.createUUID();
+
+        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
+        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
+
+        var fail = function(e) {
+            clearTimeout(timers[id]);
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        var win = function(p) {
+            clearTimeout(timers[id]);
+            if (options.timeout !== Infinity) {
+                timers[id] = createTimeout(fail, options.timeout);
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+
+        exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
+
+        return id;
+    },
+    /**
+     * Clears the specified heading watch.
+     *
+     * @param {String} id       The ID of the watch returned from #watchPosition
+     */
+    clearWatch:function(id) {
+        if (id && timers[id] !== undefined) {
+            clearTimeout(timers[id]);
+            delete timers[id];
+            exec(null, null, "Geolocation", "clearWatch", [id]);
+        }
+    }
+};
+
+module.exports = geolocation;
+
+});
+
+// file: lib/common/plugin/logger.js
+define("cordova/plugin/logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+// The logger module exports the following properties/functions:
+//
+// LOG                          - constant for the level LOG
+// ERROR                        - constant for the level ERROR
+// WARN                         - constant for the level WARN
+// INFO                         - constant for the level INFO
+// DEBUG                        - constant for the level DEBUG
+// logLevel()                   - returns current log level
+// logLevel(value)              - sets and returns a new log level
+// useConsole()                 - returns whether logger is using console
+// useConsole(value)            - sets and returns whether logger is using console
+// log(message,...)             - logs a message at level LOG
+// error(message,...)           - logs a message at level ERROR
+// warn(message,...)            - logs a message at level WARN
+// info(message,...)            - logs a message at level INFO
+// debug(message,...)           - logs a message at level DEBUG
+// logLevel(level,message,...)  - logs a message specified level
+//
+//------------------------------------------------------------------------------
+
+var logger = exports;
+
+var exec    = require('cordova/exec');
+var utils   = require('cordova/utils');
+
+var UseConsole   = true;
+var Queued       = [];
+var DeviceReady  = false;
+var CurrentLevel;
+
+/**
+ * Logging levels
+ */
+
+var Levels = [
+    "LOG",
+    "ERROR",
+    "WARN",
+    "INFO",
+    "DEBUG"
+];
+
+/*
+ * add the logging levels to the logger object and
+ * to a separate levelsMap object for testing
+ */
+
+var LevelsMap = {};
+for (var i=0; i<Levels.length; i++) {
+    var level = Levels[i];
+    LevelsMap[level] = i;
+    logger[level]    = level;
+}
+
+CurrentLevel = LevelsMap.WARN;
+
+/**
+ * Getter/Setter for the logging level
+ *
+ * Returns the current logging level.
+ *
+ * When a value is passed, sets the logging level to that value.
+ * The values should be one of the following constants:
+ *    logger.LOG
+ *    logger.ERROR
+ *    logger.WARN
+ *    logger.INFO
+ *    logger.DEBUG
+ *
+ * The value used determines which messages get printed.  The logging
+ * values above are in order, and only messages logged at the logging
+ * level or above will actually be displayed to the user.  Eg, the
+ * default level is WARN, so only messages logged with LOG, ERROR, or
+ * WARN will be displayed; INFO and DEBUG messages will be ignored.
+ */
+logger.level = function (value) {
+    if (arguments.length) {
+        if (LevelsMap[value] === null) {
+            throw new Error("invalid logging level: " + value);
+        }
+        CurrentLevel = LevelsMap[value];
+    }
+
+    return Levels[CurrentLevel];
+};
+
+/**
+ * Getter/Setter for the useConsole functionality
+ *
+ * When useConsole is true, the logger will log via the
+ * browser 'console' object.  Otherwise, it will use the
+ * native Logger plugin.
+ */
+logger.useConsole = function (value) {
+    if (arguments.length) UseConsole = !!value;
+
+    if (UseConsole) {
+        if (typeof console == "undefined") {
+            throw new Error("global console object is not defined");
+        }
+
+        if (typeof console.log != "function") {
+            throw new Error("global console object does not have a log function");
+        }
+
+        if (typeof console.useLogger == "function") {
+            if (console.useLogger()) {
+                throw new Error("console and logger are too intertwingly");
+            }
+        }
+    }
+
+    return UseConsole;
+};
+
+/**
+ * Logs a message at the LOG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.log   = function(message) { logWithArgs("LOG",   arguments); };
+
+/**
+ * Logs a message at the ERROR level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.error = function(message) { logWithArgs("ERROR", arguments); };
+
+/**
+ * Logs a message at the WARN level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.warn  = function(message) { logWithArgs("WARN",  arguments); };
+
+/**
+ * Logs a message at the INFO level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.info  = function(message) { logWithArgs("INFO",  arguments); };
+
+/**
+ * Logs a message at the DEBUG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.debug = function(message) { logWithArgs("DEBUG", arguments); };
+
+// log at the specified level with args
+function logWithArgs(level, args) {
+    args = [level].concat([].slice.call(args));
+    logger.logLevel.apply(logger, args);
+}
+
+/**
+ * Logs a message at the specified level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.logLevel = function(level, message /* , ... */) {
+    // format the message with the parameters
+    var formatArgs = [].slice.call(arguments, 2);
+    message    = utils.vformat(message, formatArgs);
+
+    if (LevelsMap[level] === null) {
+        throw new Error("invalid logging level: " + level);
+    }
+
+    if (LevelsMap[level] > CurrentLevel) return;
+
+    // queue the message if not yet at deviceready
+    if (!DeviceReady && !UseConsole) {
+        Queued.push([level, message]);
+        return;
+    }
+
+    // if not using the console, use the native logger
+    if (!UseConsole) {
+        exec(null, null, "Logger", "logLevel", [level, message]);
+        return;
+    }
+
+    // make sure console is not using logger
+    if (console.__usingCordovaLogger) {
+        throw new Error("console and logger are too intertwingly");
+    }
+
+    // log to the console
+    switch (level) {
+        case logger.LOG:   console.log(message); break;
+        case logger.ERROR: console.log("ERROR: " + message); break;
+        case logger.WARN:  console.log("WARN: "  + message); break;
+        case logger.INFO:  console.log("INFO: "  + message); break;
+        case logger.DEBUG: console.log("DEBUG: " + message); break;
+    }
+};
+
+// when deviceready fires, log queued messages
+logger.__onDeviceReady = function() {
+    if (DeviceReady) return;
+
+    DeviceReady = true;
+
+    for (var i=0; i<Queued.length; i++) {
+        var messageArgs = Queued[i];
+        logger.logLevel(messageArgs[0], messageArgs[1]);
+    }
+
+    Queued = null;
+};
+
+// add a deviceready event to log queued messages
+document.addEventListener("deviceready", logger.__onDeviceReady, false);
+
+});
+
+// file: lib/common/plugin/network.js
+define("cordova/plugin/network", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    cordova = require('cordova'),
+    channel = require('cordova/channel');
+
+var NetworkConnection = function () {
+    this.type = null;
+    this._firstRun = true;
+    this._timer = null;
+    this.timeout = 500;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function (info) {
+            me.type = info;
+            if (info === "none") {
+                // set a timer if still offline at the end of timer send the offline event
+                me._timer = setTimeout(function(){
+                    cordova.fireDocumentEvent("offline");
+                    me._timer = null;
+                    }, me.timeout);
+            } else {
+                // If there is a current offline event pending clear it
+                if (me._timer !== null) {
+                    clearTimeout(me._timer);
+                    me._timer = null;
+                }
+                cordova.fireDocumentEvent("online");
+            }
+
+            // should only fire this once
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+        },
+        function (e) {
+            // If we can't get the network info we should still tell Cordova
+            // to fire the deviceready event.
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+            console.log("Error initializing Network Connection: " + e);
+        });
+    });
+};
+
+/**
+ * Get connection info
+ *
+ * @param {Function} successCallback The function to call when the Connection data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)
+ */
+NetworkConnection.prototype.getInfo = function (successCallback, errorCallback) {
+    // Get info
+    exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
+};
+
+module.exports = new NetworkConnection();
+});
+
+// file: lib/common/plugin/notification.js
+define("cordova/plugin/notification", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Provides access to notifications on the device.
+ */
+
+module.exports = {
+
+    /**
+     * Open a native alert dialog, with a customizable title and button text.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} completeCallback   The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Alert)
+     * @param {String} buttonLabel          Label of the close button (default: OK)
+     */
+    alert: function(message, completeCallback, title, buttonLabel) {
+        var _title = (title || "Alert");
+        var _buttonLabel = (buttonLabel || "OK");
+        exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]);
+    },
+
+    /**
+     * Open a native confirm dialog, with a customizable title and button text.
+     * The result that the user selects is returned to the result callback.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Confirm)
+     * @param {String} buttonLabels         Comma separated list of the labels of the buttons (default: 'OK,Cancel')
+     */
+    confirm: function(message, resultCallback, title, buttonLabels) {
+        var _title = (title || "Confirm");
+        var _buttonLabels = (buttonLabels || "OK,Cancel");
+        exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
+    },
+
+    /**
+     * Causes the device to vibrate.
+     *
+     * @param {Integer} mills       The number of milliseconds to vibrate for.
+     */
+    vibrate: function(mills) {
+        exec(null, null, "Notification", "vibrate", [mills]);
+    },
+
+    /**
+     * Causes the device to beep.
+     * On Android, the default notification ringtone is played "count" times.
+     *
+     * @param {Integer} count       The number of beeps.
+     */
+    beep: function(count) {
+        exec(null, null, "Notification", "beep", [count]);
+    }
+};
+});
+
+// file: lib/common/plugin/requestFileSystem.js
+define("cordova/plugin/requestFileSystem", function(require, exports, module) {
+var FileError = require('cordova/plugin/FileError'),
+    FileSystem = require('cordova/plugin/FileSystem'),
+    exec = require('cordova/exec');
+
+/**
+ * Request a file system in which to store application data.
+ * @param type  local file system type
+ * @param size  indicates how much storage space, in bytes, the application expects to need
+ * @param successCallback  invoked with a FileSystem object
+ * @param errorCallback  invoked if error occurs retrieving file system
+ */
+var requestFileSystem = function(type, size, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    if (type < 0 || type > 3) {
+        fail(FileError.SYNTAX_ERR);
+    } else {
+        // if successful, return a FileSystem object
+        var success = function(file_system) {
+            if (file_system) {
+                if (typeof successCallback === 'function') {
+                    // grab the name and root from the file system object
+                    var result = new FileSystem(file_system.name, file_system.root);
+                    successCallback(result);
+                }
+            }
+            else {
+                // no FileSystem object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+        exec(success, fail, "File", "requestFileSystem", [type, size]);
+    }
+};
+
+module.exports = requestFileSystem;
+});
+
+// file: lib/common/plugin/resolveLocalFileSystemURI.js
+define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    FileError = require('cordova/plugin/FileError'),
+    exec = require('cordova/exec');
+
+/**
+ * Look up file system Entry referred to by local URI.
+ * @param {DOMString} uri  URI referring to a local file or directory
+ * @param successCallback  invoked with Entry object corresponding to URI
+ * @param errorCallback    invoked if error occurs retrieving file system entry
+ */
+module.exports = function(uri, successCallback, errorCallback) {
+    // error callback
+    var fail = function(error) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(error));
+        }
+    };
+    // sanity check for 'not:valid:filename'
+    if(!uri || uri.split(":").length > 2) {
+        setTimeout( function() {
+            fail(FileError.ENCODING_ERR);
+        },0);
+        return;
+    }
+    // if successful, return either a file or directory entry
+    var success = function(entry) {
+        var result;
+        if (entry) {
+            if (typeof successCallback === 'function') {
+                // create appropriate Entry object
+                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
+                try {
+                    successCallback(result);
+                }
+                catch (e) {
+                    console.log('Error invoking callback: ' + e);
+                }
+            }
+        }
+        else {
+            // no Entry object returned
+            fail(FileError.NOT_FOUND_ERR);
+        }
+    };
+
+    exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
+};
+
+});
+
+// file: lib/common/plugin/splashscreen.js
+define("cordova/plugin/splashscreen", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+var splashscreen = {
+    show:function() {
+        exec(null, null, "SplashScreen", "show", []);
+    },
+    hide:function() {
+        exec(null, null, "SplashScreen", "hide", []);
+    }
+};
+
+module.exports = splashscreen;
+});
+
+// file: lib/tizen/plugin/tizen/Accelerometer.js
+define("cordova/plugin/tizen/Accelerometer", function(require, exports, module) {
+var callback = null;
+
+module.exports = {
+    start: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+        callback = function (motion) {
+            successCallback({
+                x: motion.accelerationIncludingGravity.x,
+                y: motion.accelerationIncludingGravity.y,
+                z: motion.accelerationIncludingGravity.z,
+                timestamp: motion.timeStamp
+            });
+        };
+        window.addEventListener("devicemotion", callback);
+    },
+    stop: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+    }
+};
+});
+
+// file: lib/tizen/plugin/tizen/Battery.js
+define("cordova/plugin/tizen/Battery", function(require, exports, module) {
+/*global tizen:false */
+var id = null;
+
+module.exports = {
+    start: function(successCallback, errorCallback) {
+        var tizenSuccessCallback = function(power) {
+            if (successCallback) {
+                successCallback({level: Math.round(power.level * 100), isPlugged: power.isCharging});
+            }
+        };
+
+        if (id === null) {
+            id = tizen.systeminfo.addPropertyValueChangeListener("Power", tizenSuccessCallback);
+        }
+        tizen.systeminfo.getPropertyValue("Power", tizenSuccessCallback, errorCallback);
+    },
+
+    stop: function(successCallback, errorCallback) {
+        tizen.systeminfo.removePropertyValueChangeListener(id);
+        id = null;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Camera.js
+define("cordova/plugin/tizen/Camera", function(require, exports, module) {
+/*global tizen:false */
+var Camera = require('cordova/plugin/CameraConstants');
+
+function makeReplyCallback(successCallback, errorCallback) {
+    return {
+        onsuccess: function(reply) {
+            if (reply.length > 0) {
+                successCallback(reply[0].value);
+            } else {
+                errorCallback('Picture selection aborted');
+            }
+        },
+        onfail: function() {
+           console.log('The service launch failed');
+        }
+    };
+}
+
+module.exports = {
+    takePicture: function(successCallback, errorCallback, args) {
+        var destinationType = args[1],
+            sourceType = args[2],
+            encodingType = args[5],
+            mediaType = args[6];
+            // Not supported
+            /*
+            quality = args[0]
+            targetWidth = args[3]
+            targetHeight = args[4]
+            allowEdit = args[7]
+            correctOrientation = args[8]
+            saveToPhotoAlbum = args[9]
+            */
+
+        if (destinationType !== Camera.DestinationType.FILE_URI) {
+            errorCallback('DestinationType not supported');
+            return;
+        }
+        if (mediaType !== Camera.MediaType.PICTURE) {
+            errorCallback('MediaType not supported');
+            return;
+        }
+
+        var mimeType;
+        if (encodingType === Camera.EncodingType.JPEG) {
+            mimeType = 'image/jpeg';
+        } else if (encodingType === Camera.EncodingType.PNG) {
+            mimeType = 'image/png';
+        } else {
+            mimeType = 'image/*';
+        }
+
+        var serviceId;
+        if (sourceType === Camera.PictureSourceType.CAMERA) {
+            serviceId = 'http://tizen.org/appsvc/operation/create_content';
+        } else {
+            serviceId = 'http://tizen.org/appsvc/operation/pick';
+        }
+
+        var service = new tizen.ApplicationService(serviceId, null, mimeType, null);
+        tizen.application.launchService(service, null, null,
+                function(error) { errorCallback(error.message); },
+                makeReplyCallback(successCallback, errorCallback));
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Compass.js
+define("cordova/plugin/tizen/Compass", function(require, exports, module) {
+var CompassError = require('cordova/plugin/CompassError'),
+    callback = null, ready = false;
+
+module.exports = {
+    getHeading: function(successCallback, errorCallback) {
+        if (window.DeviceOrientationEvent !== undefined) {
+            callback = function (orientation) {
+                var heading = 360 - orientation.alpha;
+                if (ready) {
+                    successCallback({
+                        magneticHeading: heading,
+                        trueHeading: heading,
+                        headingAccuracy: 0,
+                        timestamp: orientation.timeStamp
+                    });
+                    window.removeEventListener("deviceorientation", callback);
+                }
+                ready = true;
+            };
+            ready = false; // workaround invalid first event value returned by WRT
+            window.addEventListener("deviceorientation", callback);
+        }
+        else {
+            errorCallback(CompassError.COMPASS_NOT_SUPPORTED);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Contact.js
+define("cordova/plugin/tizen/Contact", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// ------------------
+// Utility functions
+// ------------------
+
+
+/**
+ * Retrieves a Tizen Contact object from the device by its unique id.
+ *
+ * @param uid
+ *            Unique id of the contact on the device
+ * @return {tizen.Contact} Tizen Contact object or null if contact with
+ *         specified id is not found
+ */
+var findByUniqueId = function(id) {
+
+    if (!id) {
+        return null;
+    }
+
+    var tizenContact = null;
+
+    tizen.contact.getDefaultAddressBook().find(
+        function _successCallback(contacts){
+            tizenContact = contacts[0];
+        },
+        function _errorCallback(error){
+            console.log("tizen find error " + error);
+        },
+        new tizen.AttributeFilter('id', 'CONTAINS', id),
+        new tizen.SortMode('id', 'ASC'));
+
+    return tizenContact || null;
+};
+
+
+var traceTizenContact = function (tizenContact) {
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.id " + tizenContact.id);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.lastUpdated " + tizenContact.lastUpdated);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.name " + tizenContact.name);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.account " + tizenContact.account);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.addresses " + tizenContact.addresses);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.photoURI " + tizenContact.photoURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.phoneNumbers " + tizenContact.phoneNumbers);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.emails " + tizenContact.emails);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.birthday " + tizenContact.birthday);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.organization " + tizenContact.organization);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.notes " + tizenContact.notes);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.urls " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.isFavorite " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.ringtonesURI " + tizenContact.ringtonesURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.categories " + tizenContact.categories);
+};
+
+
+/**
+ * Creates a Tizen contact object from the W3C Contact object and persists
+ * it to device storage.
+ *
+ * @param {Contact}
+ *            contact The contact to save
+ * @return a new contact object with all properties set
+ */
+var saveToDevice = function(contact) {
+
+    if (!contact) {
+        return;
+    }
+
+    var tizenContact = null;
+    var update = false;
+    var i = 0;
+
+    // if the underlying Tizen Contact object already exists, retrieve it for
+    // update
+    if (contact.id) {
+        // we must attempt to retrieve the BlackBerry contact from the device
+        // because this may be an update operation
+        tizenContact = findByUniqueId(contact.id);
+    }
+
+    // contact not found on device, create a new one
+    if (!tizenContact) {
+        tizenContact = new tizen.Contact();
+    }
+    // update the existing contact
+    else {
+        update = true;
+    }
+
+    // NOTE: The user may be working with a partial Contact object, because only
+    // user-specified Contact fields are returned from a find operation (blame
+    // the W3C spec). If this is an update to an existing Contact, we don't
+    // want to clear an attribute from the contact database simply because the
+    // Contact object that the user passed in contains a null value for that
+    // attribute. So we only copy the non-null Contact attributes to the
+    // Tizen Contact object before saving.
+    //
+    // This means that a user must explicitly set a Contact attribute to a
+    // non-null value in order to update it in the contact database.
+    //
+    traceTizenContact (tizenContact);
+
+    // display name
+    if (contact.displayName !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            tizenContact.name.displayName = contact.displayName;
+        }
+    }
+
+    // name
+    if (contact.name !== null) {
+        if (contact.name.givenName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.firstName = contact.name.givenName;
+            }
+        }
+
+        if  (contact.name.middleName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.middleName = contact.name.middleName;
+            }
+        }
+
+        if (contact.name.familyName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.lastName = contact.name.familyName;
+            }
+        }
+
+        if (contact.name.honorificPrefix) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.prefix = contact.name.honorificPrefix;
+            }
+        }
+    }
+
+    // nickname
+    if (contact.nickname !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            if (!utils.isArray(tizenContact.name.nicknames))
+            {
+                tizenContact.name.nicknames = [];
+            }
+            tizenContact.name.nicknames[0] = contact.nickname;
+        }
+    }
+    else {
+        tizenContact.name.nicknames = [];
+    }
+
+    // note
+    if (contact.note !== null) {
+        if (tizenContact.note === null) {
+            tizenContact.note = [];
+        }
+        if (tizenContact.note !== null) {
+            tizenContact.note[0] = contact.note;
+        }
+    }
+
+    // photos
+    if (contact.photos && utils.isArray(contact.emails) && contact.emails.length > 0) {
+        tizenContact.photoURI = contact.photos[0];
+    }
+
+    if (utils.isDate(contact.birthday)) {
+        if (!utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday = new Date();
+        }
+        if (utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday.setDate(contact.birthday.getDate());
+        }
+    }
+
+    // Tizen supports many addresses
+    if (utils.isArray(contact.emails)) {
+
+        // if this is an update, re initialize email addresses
+        if (update) {
+            // doit on effacer sur un update??????
+        }
+
+        // copy the first three email addresses found
+        var emails = [];
+        for (i = 0; i < contact.emails.length; i += 1) {
+            var emailTypes = [];
+
+            emailTypes.push (contact.emails[i].type);
+
+            if (contact.emails[i].pref) {
+                emailTypes.push ("PREF");
+            }
+
+            emails.push(
+                new tizen.ContactEmailAddress(
+                    contact.emails[i].value,
+                    emailTypes)
+            );
+        }
+        tizenContact.emails = emails.length > 0 ? emails : [];
+    }
+    else {
+        tizenContact.emails = [];
+    }
+
+    // Tizen supports many phone numbers
+    // copy into appropriate fields based on type
+    if (utils.isArray(contact.phoneNumbers)) {
+        // if this is an update, re-initialize phone numbers
+        if (update) {
+        }
+
+        var phoneNumbers = [];
+
+        for (i = 0; i < contact.phoneNumbers.length; i += 1) {
+
+            if (!contact.phoneNumbers[i] || !contact.phoneNumbers[i].value) {
+                continue;
+            }
+
+             var phoneTypes = [];
+             phoneTypes.push (contact.phoneNumbers[i].type);
+
+             if (contact.phoneNumbers[i].pref) {
+                 phoneTypes.push ("PREF");
+             }
+
+            phoneNumbers.push(
+                new tizen.ContactPhoneNumber(
+                    contact.phoneNumbers[i].value,
+                    phoneTypes)
+            );
+        }
+
+        tizenContact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : [];
+    } else {
+        tizenContact.phoneNumbers = [];
+    }
+
+    if (utils.isArray(contact.addresses)) {
+        // if this is an update, re-initialize addresses
+        if (update) {
+        }
+
+        var addresses = [],
+            address = null;
+
+        for ( i = 0; i < contact.addresses.length; i += 1) {
+            address = contact.addresses[i];
+
+            if (!address || address.id === undefined || address.pref === undefined || address.type === undefined || address.formatted === undefined) {
+                continue;
+            }
+
+            var addressTypes = [];
+            addressTypes.push (address.type);
+
+            if (address.pref) {
+                addressTypes.push ("PREF");
+            }
+
+            addresses.push(
+                new tizen.ContactAddress({
+                         country:                   address.country,
+                         region :                   address.region,
+                         city:                      address.locality,
+                         streetAddress:             address.streetAddress,
+                         additionalInformation:     "",
+                         postalCode:                address.postalCode,
+                         types :                    addressTypes
+                }));
+
+        }
+        tizenContact.addresses = addresses.length > 0 ? addresses : [];
+
+    } else{
+        tizenContact.addresses = [];
+    }
+
+    // copy first url found to BlackBerry 'webpage' field
+    if (utils.isArray(contact.urls)) {
+        // if this is an update, re-initialize web page
+        if (update) {
+        }
+
+        var url = null,
+            urls = [];
+
+        for ( i = 0; i< contact.urls.length; i+= 1) {
+            url = contact.urls[i];
+
+            if (!url || !url.value) {
+                continue;
+            }
+
+            urls.push( new tizen.ContactWebSite(url.value, url.type));
+        }
+        tizenContact.urls = urls.length > 0 ? urls : [];
+    } else{
+        tizenContact.urls = [];
+    }
+
+    if (utils.isArray(contact.organizations && contact.organizations.length > 0) ) {
+        // if this is an update, re-initialize org attributes
+        var organization = contact.organizations[0];
+
+         tizenContact.organization = new tizen.ContacOrganization({
+             name:          organization.name,
+             department:    organization.department,
+             office:        "",
+             title:         organization.title,
+             role:          "",
+             logoURI:       ""
+         });
+    }
+
+    // categories
+    if (utils.isArray(contact.categories)) {
+        tizenContact.categories = [];
+
+        var category = null;
+
+        for (i = 0; i < contact.categories.length; i += 1) {
+            category = contact.categories[i];
+
+            if (typeof category === "string") {
+                tizenContact.categories.push(category);
+            }
+        }
+    }
+    else {
+        tizenContact.categories = [];
+    }
+
+    // save to device
+    // in tizen contact mean update or add
+    // later we might use addBatch and updateBatch
+    if (update){
+        tizen.contact.getDefaultAddressBook().update(tizenContact);
+    }
+    else {
+        tizen.contact.getDefaultAddressBook().add(tizenContact);
+    }
+
+    // Use the fully populated Tizen contact object to create a
+    // corresponding W3C contact object.
+    return ContactUtils.createContact(tizenContact, [ "*" ]);
+};
+
+
+/**
+ * Creates a Tizen ContactAddress object from a W3C ContactAddress.
+ *
+ * @return {tizen.ContactAddress} a Tizen ContactAddress object
+ */
+var createTizenAddress = function(address) {
+
+    var type = null,
+        pref = null,
+        typesAr = [];
+
+    if (address === null) {
+        return null;
+    }
+
+
+    var tizenAddress = new tizen.ContactAddress();
+
+    if (tizenAddress === null) {
+        return null;
+    }
+
+    typesAr.push(address.type);
+
+    if (address.pref) {
+        typesAr.push("PREF");
+    }
+
+    tizenAddress.country = address.country || "";
+    tizenAddress.region = address.region || "";
+    tizenAddress.city = address.locality || "";
+    tizenAddress.streetAddress = address.streetAddress || "";
+    tizenAddress.postalCode = address.postalCode || "";
+    tizenAddress.types = typesAr || "";
+
+    return tizenAddress;
+};
+
+module.exports = {
+    /**
+     * Persists contact to device storage.
+     */
+
+    save : function(successCB, failCB) {
+
+        try {
+            // save the contact and store it's unique id
+            var fullContact = saveToDevice(this);
+
+            this.id = fullContact.id;
+
+            // This contact object may only have a subset of properties
+            // if the save was an update of an existing contact. This is
+            // because the existing contact was likely retrieved using a
+            // subset of properties, so only those properties were set in the
+            // object. For this reason, invoke success with the contact object
+            // returned by saveToDevice since it is fully populated.
+
+            if (typeof successCB === 'function') {
+                successCB(fullContact);
+            }
+        }
+        catch (error) {
+            console.log('Error saving contact: ' +  error);
+
+            if (typeof failCB === 'function') {
+                failCB (new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    },
+
+    /**
+     * Removes contact from device storage.
+     *
+     * @param successCB
+     *            successCB callback
+     * @param failCB
+     *            error callback
+     */
+    remove : function (successCB, failCB) {
+
+        try {
+            // retrieve contact from device by id
+            var tizenContact = null;
+
+            if (this.id) {
+                tizenContact = findByUniqueId(this.id);
+            }
+
+
+            // if contact was found, remove it
+            if (tizenContact) {
+
+                tizen.contact.getDefaultAddressBook().remove(tizenContact.id);
+
+                if (typeof success === 'function') {
+                    successCB(this);
+                }
+            }
+            // attempting to remove a contact that hasn't been saved
+            else if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+        catch (error) {
+            console.log('Error removing contact ' + this.id + ": " + error);
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/ContactUtils.js
+define("cordova/plugin/tizen/ContactUtils", function(require, exports, module) {
+/*global tizen:false */
+var ContactAddress = require('cordova/plugin/ContactAddress'),
+    ContactName = require('cordova/plugin/ContactName'),
+    ContactField = require('cordova/plugin/ContactField'),
+    ContactOrganization = require('cordova/plugin/ContactOrganization'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+ * Mappings for each Contact field that may be used in a find operation. Maps
+ * W3C Contact fields to one or more fields in a Tizen contact object.
+ *
+ * Example: user searches with a filter on the Contact 'name' field:
+ *
+ * <code>Contacts.find(['name'], onSuccess, onFail, {filter:'Bob'});</code>
+ *
+ * The 'name' field does not exist in a Tizen contact. Instead, a filter
+ * expression will be built to search the Tizen contacts using the
+ * Tizen 'title', 'firstName' and 'lastName' fields.
+ */
+var fieldMappings = {
+    "id" : ["id"],
+    "displayName" : ["name.displayName"],
+    "nickname": ["name.nicknames"],
+    "name" : [ "name.prefix", "name.firstName", "name.lastName" ],
+    "phoneNumbers" : ["phoneNumbers.number","phoneNumbers.types"],
+    "emails" : ["emails.types", "emails.email"],
+    "addresses" : ["addresses.country","addresses.region","addresses.city","addresses.streetAddress","addresses.postalCode","addresses.country","addresses.types"],
+    "organizations" : ["organization.name","organization.department","organization.office", "organization.title"],
+    "birthday" : ["birthday"],
+    "note" : ["notes"],
+    "photos" : ["photoURI"],
+    "categories" : ["categories"],
+    "urls" : ["urls.url", "urls.type"]
+};
+
+/*
+ * Build an array of all of the valid W3C Contact fields. This is used to
+ * substitute all the fields when ["*"] is specified.
+ */
+var allFields = [];
+
+(function initializeAllFieldsMapping() {
+
+    for ( var key in fieldMappings) {
+        allFields.push(key);
+    }
+    // as we want it to be executed once
+    function initializeAllFieldsMapping() {
+    }
+
+})();
+
+/**
+ * Create a W3C ContactAddress object from a Tizen Address object
+ *
+ * @param {String}
+ *            type the type of address (e.g. work, home)
+ * @param {tizen.ContactAddress}
+ *            tizenAddress a Tizen Address object
+ * @return {ContactAddress} a contact address object or null if the specified
+ *         address is null
+ */
+var createContactAddress = function(type, tizenAddress) {
+    if (!tizenAddress) {
+        return null;
+    }
+
+    var streetAddress = tizenAddress.streetAddress;
+    var locality = tizenAddress.city || "";
+    var region = tizenAddress.region || "";
+    var postalCode = tizenAddress.postalCode || "";
+    var country = tizenAddress.country || "";
+    var formatted = streetAddress + ", " + locality + ", " + region + ", " + postalCode + ", " + country;
+
+    var contact = new ContactAddress(null, type, formatted, streetAddress, locality, region, postalCode, country);
+
+    return contact;
+};
+
+module.exports = {
+    /**
+     * Builds Tizen filter expressions for contact search using the
+     * contact fields and search filter provided.
+     *
+     * @param {String[]}
+     *            fields Array of Contact fields to search
+     * @param {String}
+     *            filter Filter, or search string
+     * @param {Boolean}
+     *                 multiple, one contacts or more wanted as result
+     * @return filter expression or null if fields is empty or filter is null or
+     *         empty
+     */
+
+    buildFilterExpression: function(fields, filter) {
+        // ensure filter exists
+        if (!filter || filter === "") {
+            return null;
+        }
+
+        if ((fields.length === 1) && (fields[0] === "*")) {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // build a filter expression using all Contact fields provided
+        var compositeFilter = null,
+            attributeFilter = null,
+            filterExpression = null,
+            matchFlag = "CONTAINS",
+            matchValue = filter,
+            attributesArray = [];
+
+        if (fields && utils.isArray(fields)) {
+
+            for ( var field in fields) {
+
+                if (!fields[field]) {
+                    continue;
+                }
+
+                // retrieve Tizen contact fields that map Cordova fields specified
+                // (tizenFields is a string or an array of strings)
+                var tizenFields = fieldMappings[fields[field]];
+
+                if (!tizenFields) {
+                    // does something maps
+                    continue;
+                }
+
+                // construct the filter expression using the Tizen fields
+                for ( var index in tizenFields) {
+                    attributeFilter = new tizen.AttributeFilter(tizenFields[index], matchFlag, matchValue);
+                    if (attributeFilter !== null) {
+                        attributesArray.push(attributeFilter);
+                    }
+                }
+            }
+        }
+
+        // fullfil tizen find attribute as a single or a composite attribute
+        if (attributesArray.length == 1 ) {
+            filterExpression = attributeFilter[0];
+        } else if (attributesArray.length > 1) {
+            // combine the filters as a Union
+            filterExpression = new tizen.CompositeFilter("UNION", attributesArray);
+        } else {
+            filterExpression = null;
+        }
+
+        return filterExpression;
+    },
+
+
+
+    /**
+     * Creates a Contact object from a Tizen Contact object, copying only
+     * the fields specified.
+     *
+     * This is intended as a privately used function but it is made globally
+     * available so that a Contact.save can convert a BlackBerry contact object
+     * into its W3C equivalent.
+     *
+     * @param {tizen.Contact}
+     *            tizenContact Tizen Contact object
+     * @param {String[]}
+     *            fields array of contact fields that should be copied
+     * @return {Contact} a contact object containing the specified fields or
+     *         null if the specified contact is null
+     */
+    createContact: function(tizenContact, fields) {
+
+        if (!tizenContact) {
+            return null;
+        }
+
+        // construct a new contact object
+        // always copy the contact id and displayName fields
+        var contact = new Contact(tizenContact.id, tizenContact.name.displayName);
+
+
+        // nothing to do
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            return contact;
+        } else if (fields.length === 1 && fields[0] === "*") {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // add the fields specified
+        for ( var key in fields) {
+
+            var field = fields[key],
+                index = 0;
+
+            if (!field) {
+                continue;
+            }
+
+            // name
+            if (field.indexOf('name') === 0) {
+
+                var formattedName = (tizenContact.name.prefix || "");
+
+                if (tizenContact.name.firstName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.firstName || "");
+                }
+
+                if (tizenContact.name.middleName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.middleName || "");
+                }
+
+                if (tizenContact.name.lastName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.lastName || "");
+                }
+
+                contact.name = new ContactName(
+                        formattedName,
+                        tizenContact.name.lastName,
+                        tizenContact.name.firstName,
+                        tizenContact.name.middleName,
+                        tizenContact.name.prefix,
+                        null);
+            }
+
+            // phoneNumbers
+            else if (field.indexOf('phoneNumbers') === 0) {
+
+                var phoneNumbers = [];
+
+                for (index = 0 ; index < tizenContact.phoneNumbers.length ; ++index) {
+
+                    phoneNumbers.push(
+                            new ContactField(
+                                    'PHONE',
+                                    tizenContact.phoneNumbers[index].number,
+                                    ((tizenContact.phoneNumbers[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+
+
+                contact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : null;
+            }
+
+            // emails
+            else if (field.indexOf('emails') === 0) {
+
+                var emails = [];
+
+                for (index = 0 ; index < tizenContact.emails.length ; ++index) {
+
+                    emails.push(
+                        new ContactField(
+                            'EMAILS',
+                            tizenContact.emails[index].email,
+                            ((tizenContact.emails[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+                contact.emails = emails.length > 0 ? emails : null;
+            }
+
+            // addresses
+            else if (field.indexOf('addresses') === 0) {
+
+                var addresses = [];
+                for (index = 0 ; index < tizenContact.addresses.length ; ++index) {
+
+                    addresses.push(
+                            new ContactAddress(
+                                    ((tizenContact.addresses[index].types[1] &&  tizenContact.addresses[index].types[1] === "PREF") ? true : false),
+                                    tizenContact.addresses[index].types[0] ? tizenContact.addresses[index].types[0] : "HOME",
+                                    null,
+                                    tizenContact.addresses[index].streetAddress,
+                                    tizenContact.addresses[index].city,
+                                    tizenContact.addresses[index].region,
+                                    tizenContact.addresses[index].postalCode,
+                                    tizenContact.addresses[index].country ));
+                }
+
+                contact.addresses = addresses.length > 0 ? addresses : null;
+            }
+
+            // birthday
+            else if (field.indexOf('birthday') === 0) {
+                if (utils.isDate(tizenContact.birthday)) {
+                    contact.birthday = tizenContact.birthday;
+                }
+            }
+
+            // note only one in Tizen Contact
+            else if (field.indexOf('note') === 0) {
+                if (tizenContact.note) {
+                    contact.note = tizenContact.note[0];
+                }
+            }
+
+            // organizations
+            else if (field.indexOf('organizations') === 0) {
+
+                var organizations = [];
+
+                // there's only one organization in a Tizen Address
+
+                if (tizenContact.organization) {
+                    organizations.push(
+                            new ContactOrganization(
+                                    true,
+                                    'WORK',
+                                    tizenContact.organization.name,
+                                    tizenContact.organization.department,
+                                    tizenContact.organization.jobTitle));
+                }
+
+                contact.organizations = organizations.length > 0 ? organizations : null;
+            }
+
+            // categories
+            else if (field.indexOf('categories') === 0) {
+
+                var categories = [];
+
+                if (tizenContact.categories) {
+
+                    for (index = 0 ; index < tizenContact.categories.length ; ++index) {
+                        categories.push(
+                                new ContactField(
+                                        'MAIN',
+                                        tizenContact.categories,
+                                        (index === 0) ));
+                    }
+
+                    contact.categories = categories.length > 0 ? categories : null;
+                }
+            }
+
+            // urls
+            else if (field.indexOf('urls') === 0) {
+                var urls = [];
+
+                if (tizenContact.urls) {
+                    for (index = 0 ; index <tizenContact.urls.length ; ++index) {
+                        urls.push(
+                                new ContactField(
+                                        tizenContact.urls[index].type,
+                                        tizenContact.urls[index].url,
+                                        (index === 0)));
+                    }
+                }
+
+                contact.urls = urls.length > 0 ? urls : null;
+            }
+
+            // photos
+            else if (field.indexOf('photos') === 0) {
+                var photos = [];
+
+                if (tizenContact.photoURI) {
+                    photos.push(new ContactField('URI', tizenContact.photoURI, true));
+                }
+
+                contact.photos = photos.length > 0 ? photos : null;
+            }
+        }
+
+        return contact;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Device.js
+define("cordova/plugin/tizen/Device", function(require, exports, module) {
+/*global tizen:false */
+var channel = require('cordova/channel');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+function Device() {
+    this.version = null;
+    this.uuid = null;
+    this.name = null;
+    this.cordova =  "2.0.0";
+    this.platform = "Tizen";
+
+    var me = this;
+
+    function onSuccessCallback(sysInfoProp) {
+        me.name = sysInfoProp.model;
+        me.uuid = sysInfoProp.imei;
+        me.version = sysInfoProp.version;
+        channel.onCordovaInfoReady.fire();
+    }
+
+    function onErrorCallback(error) {
+        console.log("error initializing cordova: " + error);
+    }
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getDeviceInfo(onSuccessCallback, onErrorCallback);
+    });
+}
+
+Device.prototype.getDeviceInfo = function(success, fail, args) {
+    tizen.systeminfo.getPropertyValue("Device", success, fail);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/tizen/plugin/tizen/File.js
+define("cordova/plugin/tizen/File", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileError = require('cordova/plugin/FileError'),
+    DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    File = require('cordova/plugin/File'),
+    FileSystem = require('cordova/plugin/FileSystem');
+
+var nativeRequestFileSystem = window.webkitRequestFileSystem,
+    nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL,
+    NativeFileReader = window.FileReader;
+
+function getFileSystemName(nativeFs) {
+    return (nativeFs.name.indexOf("Persistent") != -1) ? "persistent" : "temporary";
+}
+
+function makeEntry(entry) {
+    if (entry.isDirectory) {
+        return new DirectoryEntry(entry.name, decodeURI(entry.toURL()));
+    }
+    else {
+        return new FileEntry(entry.name, decodeURI(entry.toURL()));
+    }
+}
+
+module.exports = {
+    /* requestFileSystem */
+    requestFileSystem: function(successCallback, errorCallback, args) {
+        var type = args[0],
+            size = args[1];
+
+        nativeRequestFileSystem(type, size, function(nativeFs) {
+            successCallback(new FileSystem(getFileSystemName(nativeFs), makeEntry(nativeFs.root)));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* resolveLocalFileSystemURI */
+    resolveLocalFileSystemURI: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            successCallback(makeEntry(entry));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryReader */
+    readEntries: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(dirEntry) {
+            var reader = dirEntry.createReader();
+            reader.readEntries(function(entries) {
+                var retVal = [];
+                for (var i = 0; i < entries.length; i++) {
+                    retVal.push(makeEntry(entries[i]));
+                }
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* Entry */
+    getMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getMetadata(function(metaData) {
+                successCallback(metaData.modificationTime);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    moveTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.moveTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    copyTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.copyTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    remove: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.remove(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getParent: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getParent(function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileEntry */
+    getFileMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.file(function(file) {
+                var retVal = new File(file.name, decodeURI(entry.toURL()), file.type, file.lastModifiedDate, file.size);
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryEntry */
+    getDirectory: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getDirectory(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    removeRecursively: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.removeRecursively(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getFile: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getFile(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileReader */
+    readAsText: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            encoding = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsText(file, encoding);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    readAsDataURL: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsDataURL(file);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileWriter */
+    write: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            text = args[1],
+            position = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.position - position);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                var blob = new WebKitBlobBuilder();
+                blob.append(text);
+
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.seek(position);
+                writer.write(blob.getBlob('text/plain'));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    truncate: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            size = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.length);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.truncate(size);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/FileTransfer.js
+define("cordova/plugin/tizen/FileTransfer", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileEntry = require('cordova/plugin/FileEntry'),
+    FileTransferError = require('cordova/plugin/FileTransferError'),
+    FileUploadResult = require('cordova/plugin/FileUploadResult');
+
+var nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL;
+
+function getParentPath(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(0, pos + 1);
+}
+
+function getFileName(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(pos + 1);
+}
+
+module.exports = {
+    upload: function(successCallback, errorCallback, args) {
+        var filePath = args[0],
+            server = args[1],
+            fileKey = args[2],
+            fileName = args[3],
+            mimeType = args[4],
+            params = args[5],
+            /*trustAllHosts = args[6],*/
+            chunkedMode = args[7];
+
+        nativeResolveLocalFileSystemURI(filePath, function(entry) {
+            entry.file(function(file) {
+                function uploadFile(blobFile) {
+                    var fd = new FormData();
+
+                    fd.append(fileKey, blobFile, fileName);
+                    for (var prop in params) {
+                        if(params.hasOwnProperty(prop)) {
+                            fd.append(prop, params[prop]);
+                        }
+                    }
+
+                    var xhr = new XMLHttpRequest();
+                    xhr.open("POST", server);
+                    xhr.onload = function(evt) {
+                        if (xhr.status == 200) {
+                            var result = new FileUploadResult();
+                            result.bytesSent = file.size;
+                            result.responseCode = xhr.status;
+                            result.response = xhr.response;
+                            successCallback(result);
+                        } else if (xhr.status == 404) {
+                            errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                        } else {
+                            errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                        }
+                    };
+                    xhr.ontimeout = function(evt) {
+                        errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                    };
+
+                    xhr.send(fd);
+                }
+
+                var bytesPerChunk;
+                if (chunkedMode === true) {
+                    bytesPerChunk = 1024 * 1024; // 1MB chunk sizes.
+                } else {
+                    bytesPerChunk = file.size;
+                }
+                var start = 0;
+                var end = bytesPerChunk;
+                while (start < file.size) {
+                    var chunk = file.webkitSlice(start, end, mimeType);
+                    uploadFile(chunk);
+                    start = end;
+                    end = start + bytesPerChunk;
+                }
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            }
+            );
+        },
+        function(error) {
+            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+        }
+        );
+    },
+
+    download: function(successCallback, errorCallback, args) {
+        var url = args[0],
+            filePath = args[1];
+
+        var xhr = new XMLHttpRequest();
+
+        function writeFile(fileEntry) {
+            fileEntry.createWriter(function(writer) {
+                writer.onwriteend = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(new FileEntry(fileEntry.name, fileEntry.toURL()));
+                    } else {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    }
+                };
+
+                writer.onerror = function(evt) {
+                    errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                };
+
+                var builder = new WebKitBlobBuilder();
+                builder.append(xhr.response);
+                var blob = builder.getBlob();
+                writer.write(blob);
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            });
+        }
+
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState == xhr.DONE) {
+                if (xhr.status == 200 && xhr.response) {
+                    nativeResolveLocalFileSystemURI(getParentPath(filePath), function(dir) {
+                        dir.getFile(getFileName(filePath), {create: true}, writeFile, function(error) {
+                            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                        });
+                    }, function(error) {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    });
+                } else if (xhr.status == 404) {
+                    errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                } else {
+                    errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                }
+            }
+        };
+
+        xhr.open("GET", url, true);
+        xhr.responseType = "arraybuffer";
+        xhr.send();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Media.js
+define("cordova/plugin/tizen/Media", function(require, exports, module) {
+/*global Media:false, webkitURL:false */
+var MediaError = require('cordova/plugin/MediaError'),
+    audioObjects = {};
+
+module.exports = {
+    create: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::create() - id =" + id + ", src =" + src);
+        audioObjects[id] = new Audio(src);
+        audioObjects[id].onStalledCB = function () {
+            console.log("media::onStalled()");
+             audioObjects[id].timer = window.setTimeout(function () {
+                    audioObjects[id].pause();
+                    if (audioObjects[id].currentTime !== 0)
+                        audioObjects[id].currentTime = 0;
+                    console.log("media::onStalled() - MEDIA_ERROR -> " + MediaError.MEDIA_ERR_ABORTED);
+                    var err = new MediaError(MediaError.MEDIA_ERR_ABORTED, "Stalled");
+                    Media.onStatus(id, Media.MEDIA_ERROR, err);
+                }, 2000);
+        };
+        audioObjects[id].onEndedCB = function () {
+            console.log("media::onEndedCB() - MEDIA_STATE -> MEDIA_STOPPED");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        };
+        audioObjects[id].onErrorCB = function () {
+            console.log("media::onErrorCB() - MEDIA_ERROR -> " + event.srcElement.error);
+            Media.onStatus(id, Media.MEDIA_ERROR, event.srcElement.error);
+        };
+        audioObjects[id].onPlayCB = function () {
+            console.log("media::onPlayCB() - MEDIA_STATE -> MEDIA_STARTING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING);
+        };
+        audioObjects[id].onPlayingCB = function () {
+            console.log("media::onPlayingCB() - MEDIA_STATE -> MEDIA_RUNNING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING);
+        };
+        audioObjects[id].onDurationChangeCB = function () {
+            console.log("media::onDurationChangeCB() - MEDIA_DURATION -> " +  audioObjects[id].duration);
+            Media.onStatus(id, Media.MEDIA_DURATION, audioObjects[id].duration);
+        };
+        audioObjects[id].onTimeUpdateCB = function () {
+            console.log("media::onTimeUpdateCB() - MEDIA_POSITION -> " +  audioObjects[id].currentTime);
+            Media.onStatus(id, Media.MEDIA_POSITION, audioObjects[id].currentTime);
+        };
+        audioObjects[id].onCanPlayCB = function () {
+            console.log("media::onCanPlayCB()");
+            window.clearTimeout(audioObjects[id].timer);
+            audioObjects[id].play();
+        };
+      },
+    startPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1], options = args[2];
+        console.log("media::startPlayingAudio() - id =" + id + ", src =" + src + ", options =" + options);
+        audioObjects[id].addEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].addEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].addEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].addEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].addEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].addEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].addEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].addEventListener('stalled', audioObjects[id].onStalledCB);
+        audioObjects[id].play();
+    },
+    stopPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        audioObjects[id].pause();
+        if (audioObjects[id].currentTime !== 0)
+            audioObjects[id].currentTime = 0;
+        console.log("media::stopPlayingAudio() - MEDIA_STATE -> MEDIA_STOPPED");
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        audioObjects[id].removeEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].removeEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].removeEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].removeEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].removeEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].removeEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onStalledCB);
+    },
+    seekToAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], milliseconds = args[1];
+        console.log("media::seekToAudio()");
+         audioObjects[id].currentTime = milliseconds;
+        successCallback( audioObjects[id].currentTime);
+    },
+    pausePlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::pausePlayingAudio() - MEDIA_STATE -> MEDIA_PAUSED");
+        audioObjects[id].pause();
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED);
+    },
+    getCurrentPositionAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::getCurrentPositionAudio()");
+        successCallback(audioObjects[id].currentTime);
+    },
+    release: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        console.log("media::release()");
+    },
+    setVolume: function (successCallback, errorCallback, args) {
+        var id = args[0], volume = args[1];
+        console.log("media::setVolume()");
+        audioObjects[id].volume = volume;
+    },
+    startRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::startRecordingAudio() - id =" + id + ", src =" + src);
+
+        function gotStreamCB(stream) {
+            audioObjects[id].src = webkitURL.createObjectURL(stream);
+            console.log("media::startRecordingAudio() - stream CB");
+        }
+
+        function gotStreamFailedCB(error) {
+            console.log("media::startRecordingAudio() - error CB:" + error.toString());
+        }
+
+        if (navigator.webkitGetUserMedia) {
+            audioObjects[id] = new Audio();
+            navigator.webkitGetUserMedia('audio', gotStreamCB, gotStreamFailedCB);
+        } else {
+            console.log("webkitGetUserMedia not supported");
+        }
+        successCallback();
+    },
+    stopRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::stopRecordingAudio() - id =" + id);
+        audioObjects[id].pause();
+        successCallback();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/MediaError.js
+define("cordova/plugin/tizen/MediaError", function(require, exports, module) {
+
+// The MediaError object already exists on Tizen. This prevents the Cordova
+// version from being defined. This object is used to merge in differences
+// between Tizen and Cordova MediaError objects.
+module.exports = {
+        MEDIA_ERR_NONE_ACTIVE : 0,
+        MEDIA_ERR_NONE_SUPPORTED : 4
+};
+});
+
+// file: lib/tizen/plugin/tizen/NetworkStatus.js
+define("cordova/plugin/tizen/NetworkStatus", function(require, exports, module) {
+/*global tizen:false */
+var Connection = require('cordova/plugin/Connection');
+
+module.exports = {
+    getConnectionInfo: function (successCallback, errorCallback) {
+        var cncType = Connection.NONE;
+        var infoCount = 0;
+
+        function infoCB() {
+            infoCount++;
+            if (infoCount > 1)
+               successCallback(cncType);
+        }
+
+        function errorCB(error) {
+           console.log("Error: " + error.code + "," + error.name + "," + error.message);
+           infoCB();
+        }
+
+        function wifiSuccessCB(wifi) {
+            if ((wifi.status === "ON")  && (wifi.ipAddress.length !== 0))
+                cncType = Connection.WIFI;
+            infoCB();
+        }
+
+        function cellularSuccessCB(cell) {
+            if ((cncType === Connection.NONE) && (cell.status === "ON") && (cell.ipAddress.length !== 0))
+                cncType = Connection.CELL_2G;
+            infoCB();
+        }
+
+        if (tizen.systeminfo.isSupported('WifiNetwork')) {
+            tizen.systeminfo.getPropertyValue('WifiNetwork', wifiSuccessCB, errorCB);
+        }
+
+        if (tizen.systeminfo.isSupported('CellularNetwork')) {
+            tizen.systeminfo.getPropertyValue('CellularNetwork', cellularSuccessCB, errorCB);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Notification.js
+define("cordova/plugin/tizen/Notification", function(require, exports, module) {
+module.exports = {
+
+    alert: function(message, alertCallback, title, buttonName) {
+        return this.confirm(message, alertCallback, title, buttonName);
+    },
+
+    confirm: function(message, confirmCallback, title, buttonLabels) {
+        var index = null,
+            overlayElement = null,
+            popup = null,
+            element = null,
+            titleString = null,
+            messageString = null,
+            buttonString = null,
+            buttonsArray = null;
+
+        function initCss() {
+            var id = 'tizen-cordova-css';
+            if (document.getElementById(id))
+                return;
+
+            var rules = {
+                '.ui-popupwindow-screen' :  'background: #000000; opacity: 0.4;',
+                '.ui-popupwindow' : 'background: #828282; padding: 1px 1px; color: white; width: 80%; margin-left: 10%;',
+                '.popup-title' : 'background: #018ccc; padding: 5px 5px;',
+                '.popup-title p' : 'padding: 0px; margin: 0px; text-align: center;',
+                '.popup-text' : 'background: #2d2d2d; padding: 5px 5px;',
+                '.popup-text p' : 'padding: 0px; margin: 0px; text-align: center; vertical-align: middle; line-height:100px;',
+                '.popup-button-bg' : 'background: #424242; padding: 5px 5px;',
+                '.popup-button-bg ul' : 'list-style-type: none; width: 80%; margin-left: 10%; text-align: center; padding: 0px;',
+                '.popup-button-bg li' : 'display: inline;',
+                '.popup-button-bg li input' : 'border-radius: 4px 4px 4px 4px; border: 0px; background: #545454; padding: 5px 15px; color: white; min-width: 80px; margin: 0px 5px;'
+            };
+
+            var css = document.createElement('style');
+            css.type = 'text/css';
+            css.id = id;
+
+            var selector = null;
+            for (selector in rules) {
+                css.appendChild(document.createTextNode(selector + "{ " + rules[selector] + " }"));
+            }
+
+            document.getElementsByTagName("head")[0].appendChild(css);
+        }
+
+        initCss();
+
+        console.log ("message" , message);
+        console.log ("confirmCallback" , confirmCallback);
+        console.log ("title" , title);
+        console.log ("buttonLabels" , buttonLabels);
+
+        titleString = '<div class="popup-title"><p>' + title + '</p></div>';
+        messageString = '<div class="popup-text"><p>' + message + '</p></div>';
+        buttonString = '<div class="popup-button-bg"><ul>';
+
+        switch(typeof(buttonLabels))
+        {
+        case "string":
+            buttonsArray = buttonLabels.split(",");
+
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+
+        case "array":
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+        default:
+            console.log ("cordova/plugin/tizen/Notification, default, buttonLabels: ", buttonLabels);
+            break;
+        }
+
+        buttonString += '</ul></div>';
+
+        overlayElement = document.createElement("div");
+        overlayElement.className = 'ui-popupwindow-screen';
+
+        overlayElement.style.zIndex = 1001;
+        overlayElement.style.width = "100%";
+        overlayElement.style.height = "100%";
+        overlayElement.style.top = 0;
+        overlayElement.style.left = 0;
+        overlayElement.style.margin = 0;
+        overlayElement.style.padding = 0;
+        overlayElement.style.position = "absolute";
+
+        popup = document.createElement("div");
+        popup.className = "ui-popupwindow";
+        popup.style.position = "fixed";
+        popup.style.zIndex = 1002;
+        popup.innerHTML = titleString + messageString + buttonString;
+
+        document.body.appendChild(overlayElement);
+        document.body.appendChild(popup);
+
+        function createListener(button) {
+            return function() {
+                document.body.removeChild(overlayElement);
+                document.body.removeChild(popup);
+                confirmCallback(button.value);
+            };
+        }
+
+       for (index in buttonsArray) {
+           console.log ("index: ", index);
+
+           element = document.getElementById("popup-button-" + buttonsArray[index]);
+           element.addEventListener("click", createListener(element), false);
+       }
+    },
+
+    vibrate: function(milliseconds) {
+        console.log ("milliseconds" , milliseconds);
+
+        if (navigator.vibrate) {
+            navigator.vibrate(milliseconds);
+        }
+        else {
+            console.log ("cordova/plugin/tizen/Notification, vibrate API does not exists");
+        }
+    },
+
+    beep: function(count) {
+            console.log("notification:beep() - count = " + count);
+
+            var beepSound = new Audio("/sounds/beep.wav");
+            beepSound.cpt = 0;
+
+            beepSound.addEventListener('canplay', function () {
+                console.log("notification:beepSound() - canpay CB");
+                this.play();
+            });
+
+            beepSound.addEventListener('ended', function () {
+                console.log("notification:beepSound() - ended CB: cpt = " + this.cpt);
+                if (this.cpt !== 0) {
+                    if (this.currentTime !== 0)
+                        this.currentTime = 0;
+                    this.play();
+                    this.cpt--;
+                }
+            });
+
+            beepSound.addEventListener('error',  function () {
+                    console.log("notification:beepSound() - error CB");
+            });
+
+            beepSound.load();
+            beepSound.pause();
+            if (beepSound.currentTime !== 0)
+                beepSound.currentTime = 0;
+            beepSound.cpt = count - 1;
+            beepSound.play();
+    }
+};
+
+
+
+});
+
+// file: lib/tizen/plugin/tizen/contacts.js
+define("cordova/plugin/tizen/contacts", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils');
+
+module.exports = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     *
+     * @return array of Contacts matching search criteria
+     */
+    find : function(fields, successCB, failCB, options) {
+
+        // Success callback is required. Throw exception if not specified.
+        if (typeof successCB !== 'function') {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+
+        // Search qualifier is required and cannot be empty.
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+            return;
+        }
+
+        // options are optional
+        var filter ="",
+            multiple = false,
+            contacts = [],
+            tizenFilter = null;
+
+        if (options) {
+            filter = options.filter || "";
+            multiple =  options.multiple || false;
+        }
+
+        if (filter){
+            tizenFilter = ContactUtils.buildFilterExpression(fields, filter);
+        }
+
+        tizen.contact.getDefaultAddressBook().find(
+            function(tizenContacts) {
+                if (multiple) {
+                    for (var index in tizenContacts) {
+                        contacts.push(ContactUtils.createContact(tizenContacts[index], fields));
+                    }
+                }
+                else {
+                    contacts.push(ContactUtils.createContact(tizenContacts[0], fields));
+                }
+
+                // return results
+                successCB(contacts);
+            },
+            function(error) {
+                if (typeof failCB === 'function') {
+                    failCB(ContactError.UNKNOWN_ERROR);
+                }
+            },
+            tizenFilter,
+            null);
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/manager.js
+define("cordova/plugin/tizen/manager", function(require, exports, module) {
+var cordova = require('cordova');
+
+module.exports = {
+    exec: function (successCallback, errorCallback, clazz, action, args) {
+        var plugin = require('cordova/plugin/tizen/' + clazz);
+
+        if (plugin && typeof plugin[action] === 'function') {
+            var result = plugin[action](successCallback, errorCallback, args);
+            return result || {status: cordova.callbackStatus.NO_RESULT};
+        }
+
+        return {"status" : cordova.callbackStatus.CLASS_NOT_FOUND_EXCEPTION, "message" : "Function " + clazz + "::" + action + " cannot be found"};
+    },
+    resume: function () {},
+    pause: function () {},
+    destroy: function () {}
+};
+
+});
+
+// file: lib/common/utils.js
+define("cordova/utils", function(require, exports, module) {
+var utils = exports;
+
+/**
+ * Returns an indication of whether the argument is an array or not
+ */
+utils.isArray = function(a) {
+    return Object.prototype.toString.call(a) == '[object Array]';
+};
+
+/**
+ * Returns an indication of whether the argument is a Date or not
+ */
+utils.isDate = function(d) {
+    return Object.prototype.toString.call(d) == '[object Date]';
+};
+
+/**
+ * Does a deep clone of the object.
+ */
+utils.clone = function(obj) {
+    if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
+        return obj;
+    }
+
+    var retVal, i;
+
+    if(utils.isArray(obj)){
+        retVal = [];
+        for(i = 0; i < obj.length; ++i){
+            retVal.push(utils.clone(obj[i]));
+        }
+        return retVal;
+    }
+
+    retVal = {};
+    for(i in obj){
+        if(!(i in retVal) || retVal[i] != obj[i]) {
+            retVal[i] = utils.clone(obj[i]);
+        }
+    }
+    return retVal;
+};
+
+/**
+ * Returns a wrappered version of the function
+ */
+utils.close = function(context, func, params) {
+    if (typeof params == 'undefined') {
+        return function() {
+            return func.apply(context, arguments);
+        };
+    } else {
+        return function() {
+            return func.apply(context, params);
+        };
+    }
+};
+
+/**
+ * Create a UUID
+ */
+utils.createUUID = function() {
+    return UUIDcreatePart(4) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(6);
+};
+
+/**
+ * Extends a child object from a parent object using classical inheritance
+ * pattern.
+ */
+utils.extend = (function() {
+    // proxy used to establish prototype chain
+    var F = function() {};
+    // extend Child from Parent
+    return function(Child, Parent) {
+        F.prototype = Parent.prototype;
+        Child.prototype = new F();
+        Child.__super__ = Parent.prototype;
+        Child.prototype.constructor = Child;
+    };
+}());
+
+/**
+ * Alerts a message in any available way: alert or console.log.
+ */
+utils.alert = function(msg) {
+    if (alert) {
+        alert(msg);
+    } else if (console && console.log) {
+        console.log(msg);
+    }
+};
+
+/**
+ * Formats a string and arguments following it ala sprintf()
+ *
+ * see utils.vformat() for more information
+ */
+utils.format = function(formatString /* ,... */) {
+    var args = [].slice.call(arguments, 1);
+    return utils.vformat(formatString, args);
+};
+
+/**
+ * Formats a string and arguments following it ala vsprintf()
+ *
+ * format chars:
+ *   %j - format arg as JSON
+ *   %o - format arg as JSON
+ *   %c - format arg as ''
+ *   %% - replace with '%'
+ * any other char following % will format it's
+ * arg via toString().
+ *
+ * for rationale, see FireBug's Console API:
+ *    http://getfirebug.com/wiki/index.php/Console_API
+ */
+utils.vformat = function(formatString, args) {
+    if (formatString === null || formatString === undefined) return "";
+    if (arguments.length == 1) return formatString.toString();
+    if (typeof formatString != "string") return formatString.toString();
+
+    var pattern = /(.*?)%(.)(.*)/;
+    var rest    = formatString;
+    var result  = [];
+
+    while (args.length) {
+        var arg   = args.shift();
+        var match = pattern.exec(rest);
+
+        if (!match) break;
+
+        rest = match[3];
+
+        result.push(match[1]);
+
+        if (match[2] == '%') {
+            result.push('%');
+            args.unshift(arg);
+            continue;
+        }
+
+        result.push(formatted(arg, match[2]));
+    }
+
+    result.push(rest);
+
+    return result.join('');
+};
+
+//------------------------------------------------------------------------------
+function UUIDcreatePart(length) {
+    var uuidpart = "";
+    for (var i=0; i<length; i++) {
+        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
+        if (uuidchar.length == 1) {
+            uuidchar = "0" + uuidchar;
+        }
+        uuidpart += uuidchar;
+    }
+    return uuidpart;
+}
+
+//------------------------------------------------------------------------------
+function formatted(object, formatChar) {
+
+    try {
+        switch(formatChar) {
+            case 'j':
+            case 'o': return JSON.stringify(object);
+            case 'c': return '';
+        }
+    }
+    catch (e) {
+        return "error JSON.stringify()ing argument: " + e;
+    }
+
+    if ((object === null) || (object === undefined)) {
+        return Object.prototype.toString.call(object);
+    }
+
+    return object.toString();
+}
+
+});
+
+
+window.cordova = require('cordova');
+
+// file: lib/scripts/bootstrap.js
+(function (context) {
+    var channel = require("cordova/channel"),
+        _self = {
+            boot: function () {
+                /**
+                 * Create all cordova objects once page has fully loaded and native side is ready.
+                 */
+                channel.join(function() {
+                    var builder = require('cordova/builder'),
+                        base = require('cordova/common'),
+                        platform = require('cordova/platform');
+
+                    // Drop the common globals into the window object, but be nice and don't overwrite anything.
+                    builder.build(base.objects).intoButDontClobber(window);
+
+                    // Drop the platform-specific globals into the window object
+                    // and clobber any existing object.
+                    builder.build(platform.objects).intoAndClobber(window);
+
+                    // Merge the platform-specific overrides/enhancements into
+                    // the window object.
+                    if (typeof platform.merges !== 'undefined') {
+                        builder.build(platform.merges).intoAndMerge(window);
+                    }
+
+                    // Call the platform-specific initialization
+                    platform.initialize();
+
+                    // Fire event to notify that all objects are created
+                    channel.onCordovaReady.fire();
+
+                    // Fire onDeviceReady event once all constructors have run and
+                    // cordova info has been received from native side.
+                    channel.join(function() {
+                        require('cordova').fireDocumentEvent('deviceready');
+                    }, channel.deviceReadyChannelsArray);
+
+                }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);
+            }
+        };
+
+    // boot up once native side is ready
+    channel.onNativeReady.subscribeOnce(_self.boot);
+
+    // _nativeReady is global variable that the native side can set
+    // to signify that the native code is ready. It is a global since
+    // it may be called before any cordova JS is ready.
+    if (window._nativeReady) {
+        channel.onNativeReady.fire();
+    }
+
+}(window));
+
+// file: lib/scripts/bootstrap-tizen.js
+require('cordova/channel').onNativeReady.fire();
+
+
+})();
\ No newline at end of file
diff --git a/samples/hello-cordova/css/index.css b/samples/hello-cordova/css/index.css
new file mode 100644
index 0000000..c869f87
--- /dev/null
+++ b/samples/hello-cordova/css/index.css
@@ -0,0 +1,100 @@
+html,
+body {
+    height:100%;
+    font-size:12px;
+    width:100%;
+}
+
+html {
+    display:table;
+}
+
+body {
+    background-color:#A7A7A7;
+    background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
+    background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
+    background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
+    background-image:-webkit-gradient(
+        linear,
+        left top,
+        left bottom,
+        color-stop(0, #A7A7A7),
+        color-stop(0.51, #E4E4E4)
+    );
+    display:table-cell;
+    font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif;
+    text-transform:uppercase;
+    vertical-align:middle;
+}
+
+.app {
+    background-image:url(../img/cordova.png);
+    background-repeat:no-repeat;
+    margin:0px auto;
+    width:275px;
+}
+
+h1 {
+    font-size:2em;
+    font-weight:300;
+    margin:0px;
+    overflow:visible;
+    padding:0px;
+    text-align:center;
+}
+
+.status {
+    background-color:#333333;
+    border-radius:4px;
+    -webkit-border-radius:4px;
+    color:#FFFFFF;
+    font-size:1em;
+    margin:0px auto;
+    padding:2px 10px;
+    text-align:center;
+    width:100%;
+    max-width:175px;
+}
+
+.status.complete {
+    background-color:#4B946A;
+}
+
+.hide {
+    display:none;
+}
+
+@keyframes fade {
+    from { opacity: 1.0; }
+    50% { opacity: 0.4; }
+    to { opacity: 1.0; }
+}
+ 
+@-webkit-keyframes fade {
+    from { opacity: 1.0; }
+    50% { opacity: 0.4; }
+    to { opacity: 1.0; }
+}
+ 
+.blink {
+    animation:fade 3000ms infinite;
+    -webkit-animation:fade 3000ms infinite;
+}
+
+/* portrait */
+/* @media screen and (max-aspect-ratio: 1/1) */
+.app {
+    background-position:center top;
+    height:100px;              /* adds enough room for text */
+    padding:180px 0px 0px 0px; /* background height - shadow offset */
+}
+
+/* lanscape (when wide enough) */
+@media screen and (min-aspect-ratio: 1/1) and (min-width:445px) {
+    .app {
+        background-position:left center;
+        height:140px;       /* height + padding = background image size */
+        padding-left:170px; /* background width */
+        padding-top:60px;   /* center the text */
+    }
+}
diff --git a/samples/hello-cordova/icon.png b/samples/hello-cordova/icon.png
new file mode 100755
index 0000000..eef3cd9
--- /dev/null
+++ b/samples/hello-cordova/icon.png
Binary files differ
diff --git a/samples/hello-cordova/img/cordova.png b/samples/hello-cordova/img/cordova.png
new file mode 100644
index 0000000..e8169cf
--- /dev/null
+++ b/samples/hello-cordova/img/cordova.png
Binary files differ
diff --git a/samples/hello-cordova/index.html b/samples/hello-cordova/index.html
new file mode 100644
index 0000000..fc9dd1d
--- /dev/null
+++ b/samples/hello-cordova/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <meta name = "format-detection" content = "telephone=no"/>
+        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width;" />
+        <link rel="stylesheet" type="text/css" href="css/index.css" />
+        <title>Hello Cordova</title>
+    </head>
+    <body>
+        <div class="app">
+            <h1>Apache Cordova</h1>
+            <div id="deviceready">
+                <p class="status pending blink">Connecting to Device</p>
+                <p class="status complete blink hide">Device is Ready</p>
+            </div>
+        </div>
+        <script type="text/javascript" src="cordova-2.0.0.js"></script>
+        <script type="text/javascript" src="js/index.js"></script>
+        <script type="text/javascript">
+            app.initialize();
+        </script>
+    </body>
+</html>
diff --git a/samples/hello-cordova/js/index.js b/samples/hello-cordova/js/index.js
new file mode 100644
index 0000000..6140331
--- /dev/null
+++ b/samples/hello-cordova/js/index.js
@@ -0,0 +1,20 @@
+var app = {
+    initialize: function() {
+        this.bind();
+    },
+    bind: function() {
+        document.addEventListener('deviceready', this.deviceready, false);
+    },
+    deviceready: function() {
+        // note that this is an event handler so the scope is that of the event
+        // so we need to call app.report(), and not this.report()
+        app.report('deviceready');
+    },
+    report: function(id) { 
+        console.log("report:" + id);
+        // hide the .pending <p> and show the .complete <p>
+        document.querySelector('#' + id + ' .pending').className += ' hide';
+        var completeElem = document.querySelector('#' + id + ' .complete');
+        completeElem.className = completeElem.className.split('hide').join('');
+    }
+};
diff --git a/samples/hello-cordova/spec.html b/samples/hello-cordova/spec.html
new file mode 100644
index 0000000..83d7d2e
--- /dev/null
+++ b/samples/hello-cordova/spec.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Jasmine Spec Runner</title>
+
+        <!-- jasmine source -->
+        <link rel="shortcut icon" type="image/png" href="spec/lib/jasmine-1.2.0/jasmine_favicon.png">
+        <link rel="stylesheet" type="text/css" href="spec/lib/jasmine-1.2.0/jasmine.css">
+        <script type="text/javascript" src="spec/lib/jasmine-1.2.0/jasmine.js"></script>
+        <script type="text/javascript" src="spec/lib/jasmine-1.2.0/jasmine-html.js"></script>
+
+        <!-- include source files here... -->
+        <script type="text/javascript" src="js/index.js"></script>
+
+        <!-- include spec files here... -->
+        <script type="text/javascript" src="spec/helper.js"></script>
+        <script type="text/javascript" src="spec/index.js"></script>
+
+        <script type="text/javascript">
+            (function() {
+                var jasmineEnv = jasmine.getEnv();
+                jasmineEnv.updateInterval = 1000;
+
+                var htmlReporter = new jasmine.HtmlReporter();
+
+                jasmineEnv.addReporter(htmlReporter);
+
+                jasmineEnv.specFilter = function(spec) {
+                    return htmlReporter.specFilter(spec);
+                };
+
+                var currentWindowOnload = window.onload;
+
+                window.onload = function() {
+                    if (currentWindowOnload) {
+                        currentWindowOnload();
+                    }
+                    execJasmine();
+                };
+
+                function execJasmine() {
+                    jasmineEnv.execute();
+                }
+            })();
+        </script>
+    </head>
+    <body>
+        <div id="stage" style="display:none;"></div>
+    </body>
+</html>
diff --git a/samples/hello-cordova/spec/helper.js b/samples/hello-cordova/spec/helper.js
new file mode 100644
index 0000000..9f99445
--- /dev/null
+++ b/samples/hello-cordova/spec/helper.js
@@ -0,0 +1,11 @@
+afterEach(function() {
+    document.getElementById('stage').innerHTML = '';
+});
+
+var helper = {
+    trigger: function(obj, name) {
+        var e = document.createEvent('Event');
+        e.initEvent(name, true, true);
+        obj.dispatchEvent(e);
+    }
+};
diff --git a/samples/hello-cordova/spec/index.js b/samples/hello-cordova/spec/index.js
new file mode 100644
index 0000000..121cf63
--- /dev/null
+++ b/samples/hello-cordova/spec/index.js
@@ -0,0 +1,49 @@
+describe('app', function() {
+    describe('initialize', function() {
+        it('should bind deviceready', function() {
+            runs(function() {
+                spyOn(app, 'deviceready');
+                app.initialize();
+                helper.trigger(window.document, 'deviceready');
+            });
+
+            waitsFor(function() {
+                return (app.deviceready.calls.length > 0);
+            }, 'deviceready should be called once', 500);
+
+            runs(function() {
+                expect(app.deviceready).toHaveBeenCalled();
+            });
+        });
+    });
+
+    describe('deviceready', function() {
+        it('should report that it fired', function() {
+            spyOn(app, 'report');
+            app.deviceready();
+            expect(app.report).toHaveBeenCalledWith('deviceready');
+        });
+    });
+
+    describe('report', function() {
+        beforeEach(function() {
+            var el = document.getElementById('stage');
+            el.innerHTML = ['<div id="deviceready">',
+                            '    <p class="status pending">Pending</p>',
+                            '    <p class="status complete hide">Complete</p>',
+                            '</div>'].join('\n');
+        });
+
+        it('should show the completion state', function() {
+            app.report('deviceready');
+            var el = document.querySelector('#deviceready .complete:not(.hide)');
+            expect(el).toBeTruthy();
+        });
+
+        it('should hide the pending state', function() {
+            app.report('deviceready');
+            var el = document.querySelector('#deviceready .pending.hide');
+            expect(el).toBeTruthy();
+        });
+    });
+});
diff --git a/samples/hello-cordova/spec/lib/jasmine-1.2.0/MIT.LICENSE b/samples/hello-cordova/spec/lib/jasmine-1.2.0/MIT.LICENSE
new file mode 100644
index 0000000..7c435ba
--- /dev/null
+++ b/samples/hello-cordova/spec/lib/jasmine-1.2.0/MIT.LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2008-2011 Pivotal Labs
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine-html.js b/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine-html.js
new file mode 100644
index 0000000..a0b0639
--- /dev/null
+++ b/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine-html.js
@@ -0,0 +1,616 @@
+jasmine.HtmlReporterHelpers = {};
+
+jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
+  var el = document.createElement(type);
+
+  for (var i = 2; i < arguments.length; i++) {
+    var child = arguments[i];
+
+    if (typeof child === 'string') {
+      el.appendChild(document.createTextNode(child));
+    } else {
+      if (child) {
+        el.appendChild(child);
+      }
+    }
+  }
+
+  for (var attr in attrs) {
+    if (attr == "className") {
+      el[attr] = attrs[attr];
+    } else {
+      el.setAttribute(attr, attrs[attr]);
+    }
+  }
+
+  return el;
+};
+
+jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
+  var results = child.results();
+  var status = results.passed() ? 'passed' : 'failed';
+  if (results.skipped) {
+    status = 'skipped';
+  }
+
+  return status;
+};
+
+jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
+  var parentDiv = this.dom.summary;
+  var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
+  var parent = child[parentSuite];
+
+  if (parent) {
+    if (typeof this.views.suites[parent.id] == 'undefined') {
+      this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
+    }
+    parentDiv = this.views.suites[parent.id].element;
+  }
+
+  parentDiv.appendChild(childElement);
+};
+
+
+jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
+  for(var fn in jasmine.HtmlReporterHelpers) {
+    ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
+  }
+};
+
+jasmine.HtmlReporter = function(_doc) {
+  var self = this;
+  var doc = _doc || window.document;
+
+  var reporterView;
+
+  var dom = {};
+
+  // Jasmine Reporter Public Interface
+  self.logRunningSpecs = false;
+
+  self.reportRunnerStarting = function(runner) {
+    var specs = runner.specs() || [];
+
+    if (specs.length == 0) {
+      return;
+    }
+
+    createReporterDom(runner.env.versionString());
+    doc.body.appendChild(dom.reporter);
+
+    reporterView = new jasmine.HtmlReporter.ReporterView(dom);
+    reporterView.addSpecs(specs, self.specFilter);
+  };
+
+  self.reportRunnerResults = function(runner) {
+    reporterView && reporterView.complete();
+  };
+
+  self.reportSuiteResults = function(suite) {
+    reporterView.suiteComplete(suite);
+  };
+
+  self.reportSpecStarting = function(spec) {
+    if (self.logRunningSpecs) {
+      self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
+    }
+  };
+
+  self.reportSpecResults = function(spec) {
+    reporterView.specComplete(spec);
+  };
+
+  self.log = function() {
+    var console = jasmine.getGlobal().console;
+    if (console && console.log) {
+      if (console.log.apply) {
+        console.log.apply(console, arguments);
+      } else {
+        console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
+      }
+    }
+  };
+
+  self.specFilter = function(spec) {
+    if (!focusedSpecName()) {
+      return true;
+    }
+
+    return spec.getFullName().indexOf(focusedSpecName()) === 0;
+  };
+
+  return self;
+
+  function focusedSpecName() {
+    var specName;
+
+    (function memoizeFocusedSpec() {
+      if (specName) {
+        return;
+      }
+
+      var paramMap = [];
+      var params = doc.location.search.substring(1).split('&');
+
+      for (var i = 0; i < params.length; i++) {
+        var p = params[i].split('=');
+        paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
+      }
+
+      specName = paramMap.spec;
+    })();
+
+    return specName;
+  }
+
+  function createReporterDom(version) {
+    dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
+      dom.banner = self.createDom('div', { className: 'banner' },
+        self.createDom('span', { className: 'title' }, "Jasmine "),
+        self.createDom('span', { className: 'version' }, version)),
+
+      dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
+      dom.alert = self.createDom('div', {className: 'alert'}),
+      dom.results = self.createDom('div', {className: 'results'},
+        dom.summary = self.createDom('div', { className: 'summary' }),
+        dom.details = self.createDom('div', { id: 'details' }))
+    );
+  }
+};
+jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporter.ReporterView = function(dom) {
+  this.startedAt = new Date();
+  this.runningSpecCount = 0;
+  this.completeSpecCount = 0;
+  this.passedCount = 0;
+  this.failedCount = 0;
+  this.skippedCount = 0;
+
+  this.createResultsMenu = function() {
+    this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
+      this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
+      ' | ',
+      this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
+
+    this.summaryMenuItem.onclick = function() {
+      dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
+    };
+
+    this.detailsMenuItem.onclick = function() {
+      showDetails();
+    };
+  };
+
+  this.addSpecs = function(specs, specFilter) {
+    this.totalSpecCount = specs.length;
+
+    this.views = {
+      specs: {},
+      suites: {}
+    };
+
+    for (var i = 0; i < specs.length; i++) {
+      var spec = specs[i];
+      this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
+      if (specFilter(spec)) {
+        this.runningSpecCount++;
+      }
+    }
+  };
+
+  this.specComplete = function(spec) {
+    this.completeSpecCount++;
+
+    if (isUndefined(this.views.specs[spec.id])) {
+      this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom);
+    }
+
+    var specView = this.views.specs[spec.id];
+
+    switch (specView.status()) {
+      case 'passed':
+        this.passedCount++;
+        break;
+
+      case 'failed':
+        this.failedCount++;
+        break;
+
+      case 'skipped':
+        this.skippedCount++;
+        break;
+    }
+
+    specView.refresh();
+    this.refresh();
+  };
+
+  this.suiteComplete = function(suite) {
+    var suiteView = this.views.suites[suite.id];
+    if (isUndefined(suiteView)) {
+      return;
+    }
+    suiteView.refresh();
+  };
+
+  this.refresh = function() {
+
+    if (isUndefined(this.resultsMenu)) {
+      this.createResultsMenu();
+    }
+
+    // currently running UI
+    if (isUndefined(this.runningAlert)) {
+      this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"});
+      dom.alert.appendChild(this.runningAlert);
+    }
+    this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);
+
+    // skipped specs UI
+    if (isUndefined(this.skippedAlert)) {
+      this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"});
+    }
+
+    this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
+
+    if (this.skippedCount === 1 && isDefined(dom.alert)) {
+      dom.alert.appendChild(this.skippedAlert);
+    }
+
+    // passing specs UI
+    if (isUndefined(this.passedAlert)) {
+      this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"});
+    }
+    this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);
+
+    // failing specs UI
+    if (isUndefined(this.failedAlert)) {
+      this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
+    }
+    this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount);
+
+    if (this.failedCount === 1 && isDefined(dom.alert)) {
+      dom.alert.appendChild(this.failedAlert);
+      dom.alert.appendChild(this.resultsMenu);
+    }
+
+    // summary info
+    this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount);
+    this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
+  };
+
+  this.complete = function() {
+    dom.alert.removeChild(this.runningAlert);
+
+    this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
+
+    if (this.failedCount === 0) {
+      dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount)));
+    } else {
+      showDetails();
+    }
+
+    dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
+  };
+
+  return this;
+
+  function showDetails() {
+    if (dom.reporter.className.search(/showDetails/) === -1) {
+      dom.reporter.className += " showDetails";
+    }
+  }
+
+  function isUndefined(obj) {
+    return typeof obj === 'undefined';
+  }
+
+  function isDefined(obj) {
+    return !isUndefined(obj);
+  }
+
+  function specPluralizedFor(count) {
+    var str = count + " spec";
+    if (count > 1) {
+      str += "s"
+    }
+    return str;
+  }
+
+};
+
+jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);
+
+
+jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
+  this.spec = spec;
+  this.dom = dom;
+  this.views = views;
+
+  this.symbol = this.createDom('li', { className: 'pending' });
+  this.dom.symbolSummary.appendChild(this.symbol);
+
+  this.summary = this.createDom('div', { className: 'specSummary' },
+      this.createDom('a', {
+        className: 'description',
+        href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
+        title: this.spec.getFullName()
+      }, this.spec.description)
+  );
+
+  this.detail = this.createDom('div', { className: 'specDetail' },
+      this.createDom('a', {
+        className: 'description',
+        href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
+        title: this.spec.getFullName()
+      }, this.spec.getFullName())
+  );
+};
+
+jasmine.HtmlReporter.SpecView.prototype.status = function() {
+  return this.getSpecStatus(this.spec);
+};
+
+jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
+  this.symbol.className = this.status();
+
+  switch (this.status()) {
+    case 'skipped':
+      break;
+
+    case 'passed':
+      this.appendSummaryToSuiteDiv();
+      break;
+
+    case 'failed':
+      this.appendSummaryToSuiteDiv();
+      this.appendFailureDetail();
+      break;
+  }
+};
+
+jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
+  this.summary.className += ' ' + this.status();
+  this.appendToSummary(this.spec, this.summary);
+};
+
+jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
+  this.detail.className += ' ' + this.status();
+
+  var resultItems = this.spec.results().getItems();
+  var messagesDiv = this.createDom('div', { className: 'messages' });
+
+  for (var i = 0; i < resultItems.length; i++) {
+    var result = resultItems[i];
+
+    if (result.type == 'log') {
+      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
+    } else if (result.type == 'expect' && result.passed && !result.passed()) {
+      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
+
+      if (result.trace.stack) {
+        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
+      }
+    }
+  }
+
+  if (messagesDiv.childNodes.length > 0) {
+    this.detail.appendChild(messagesDiv);
+    this.dom.details.appendChild(this.detail);
+  }
+};
+
+jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
+  this.suite = suite;
+  this.dom = dom;
+  this.views = views;
+
+  this.element = this.createDom('div', { className: 'suite' },
+      this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description)
+  );
+
+  this.appendToSummary(this.suite, this.element);
+};
+
+jasmine.HtmlReporter.SuiteView.prototype.status = function() {
+  return this.getSpecStatus(this.suite);
+};
+
+jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
+  this.element.className += " " + this.status();
+};
+
+jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);
+
+/* @deprecated Use jasmine.HtmlReporter instead
+ */
+jasmine.TrivialReporter = function(doc) {
+  this.document = doc || document;
+  this.suiteDivs = {};
+  this.logRunningSpecs = false;
+};
+
+jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
+  var el = document.createElement(type);
+
+  for (var i = 2; i < arguments.length; i++) {
+    var child = arguments[i];
+
+    if (typeof child === 'string') {
+      el.appendChild(document.createTextNode(child));
+    } else {
+      if (child) { el.appendChild(child); }
+    }
+  }
+
+  for (var attr in attrs) {
+    if (attr == "className") {
+      el[attr] = attrs[attr];
+    } else {
+      el.setAttribute(attr, attrs[attr]);
+    }
+  }
+
+  return el;
+};
+
+jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
+  var showPassed, showSkipped;
+
+  this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
+      this.createDom('div', { className: 'banner' },
+        this.createDom('div', { className: 'logo' },
+            this.createDom('span', { className: 'title' }, "Jasmine"),
+            this.createDom('span', { className: 'version' }, runner.env.versionString())),
+        this.createDom('div', { className: 'options' },
+            "Show ",
+            showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
+            this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
+            showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
+            this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
+            )
+          ),
+
+      this.runnerDiv = this.createDom('div', { className: 'runner running' },
+          this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
+          this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
+          this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
+      );
+
+  this.document.body.appendChild(this.outerDiv);
+
+  var suites = runner.suites();
+  for (var i = 0; i < suites.length; i++) {
+    var suite = suites[i];
+    var suiteDiv = this.createDom('div', { className: 'suite' },
+        this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
+        this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
+    this.suiteDivs[suite.id] = suiteDiv;
+    var parentDiv = this.outerDiv;
+    if (suite.parentSuite) {
+      parentDiv = this.suiteDivs[suite.parentSuite.id];
+    }
+    parentDiv.appendChild(suiteDiv);
+  }
+
+  this.startedAt = new Date();
+
+  var self = this;
+  showPassed.onclick = function(evt) {
+    if (showPassed.checked) {
+      self.outerDiv.className += ' show-passed';
+    } else {
+      self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
+    }
+  };
+
+  showSkipped.onclick = function(evt) {
+    if (showSkipped.checked) {
+      self.outerDiv.className += ' show-skipped';
+    } else {
+      self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
+    }
+  };
+};
+
+jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
+  var results = runner.results();
+  var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
+  this.runnerDiv.setAttribute("class", className);
+  //do it twice for IE
+  this.runnerDiv.setAttribute("className", className);
+  var specs = runner.specs();
+  var specCount = 0;
+  for (var i = 0; i < specs.length; i++) {
+    if (this.specFilter(specs[i])) {
+      specCount++;
+    }
+  }
+  var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
+  message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
+  this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
+
+  this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
+};
+
+jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
+  var results = suite.results();
+  var status = results.passed() ? 'passed' : 'failed';
+  if (results.totalCount === 0) { // todo: change this to check results.skipped
+    status = 'skipped';
+  }
+  this.suiteDivs[suite.id].className += " " + status;
+};
+
+jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
+  if (this.logRunningSpecs) {
+    this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
+  }
+};
+
+jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
+  var results = spec.results();
+  var status = results.passed() ? 'passed' : 'failed';
+  if (results.skipped) {
+    status = 'skipped';
+  }
+  var specDiv = this.createDom('div', { className: 'spec '  + status },
+      this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
+      this.createDom('a', {
+        className: 'description',
+        href: '?spec=' + encodeURIComponent(spec.getFullName()),
+        title: spec.getFullName()
+      }, spec.description));
+
+
+  var resultItems = results.getItems();
+  var messagesDiv = this.createDom('div', { className: 'messages' });
+  for (var i = 0; i < resultItems.length; i++) {
+    var result = resultItems[i];
+
+    if (result.type == 'log') {
+      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
+    } else if (result.type == 'expect' && result.passed && !result.passed()) {
+      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
+
+      if (result.trace.stack) {
+        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
+      }
+    }
+  }
+
+  if (messagesDiv.childNodes.length > 0) {
+    specDiv.appendChild(messagesDiv);
+  }
+
+  this.suiteDivs[spec.suite.id].appendChild(specDiv);
+};
+
+jasmine.TrivialReporter.prototype.log = function() {
+  var console = jasmine.getGlobal().console;
+  if (console && console.log) {
+    if (console.log.apply) {
+      console.log.apply(console, arguments);
+    } else {
+      console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
+    }
+  }
+};
+
+jasmine.TrivialReporter.prototype.getLocation = function() {
+  return this.document.location;
+};
+
+jasmine.TrivialReporter.prototype.specFilter = function(spec) {
+  var paramMap = {};
+  var params = this.getLocation().search.substring(1).split('&');
+  for (var i = 0; i < params.length; i++) {
+    var p = params[i].split('=');
+    paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
+  }
+
+  if (!paramMap.spec) {
+    return true;
+  }
+  return spec.getFullName().indexOf(paramMap.spec) === 0;
+};
diff --git a/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine.css b/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine.css
new file mode 100644
index 0000000..826e575
--- /dev/null
+++ b/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine.css
@@ -0,0 +1,81 @@
+body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
+
+#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; }
+#HTMLReporter a { text-decoration: none; }
+#HTMLReporter a:hover { text-decoration: underline; }
+#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; }
+#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; }
+#HTMLReporter #jasmine_content { position: fixed; right: 100%; }
+#HTMLReporter .version { color: #aaaaaa; }
+#HTMLReporter .banner { margin-top: 14px; }
+#HTMLReporter .duration { color: #aaaaaa; float: right; }
+#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; }
+#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; }
+#HTMLReporter .symbolSummary li.passed { font-size: 14px; }
+#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; }
+#HTMLReporter .symbolSummary li.failed { line-height: 9px; }
+#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; }
+#HTMLReporter .symbolSummary li.skipped { font-size: 14px; }
+#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; }
+#HTMLReporter .symbolSummary li.pending { line-height: 11px; }
+#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; }
+#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
+#HTMLReporter .runningAlert { background-color: #666666; }
+#HTMLReporter .skippedAlert { background-color: #aaaaaa; }
+#HTMLReporter .skippedAlert:first-child { background-color: #333333; }
+#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; }
+#HTMLReporter .passingAlert { background-color: #a6b779; }
+#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; }
+#HTMLReporter .failingAlert { background-color: #cf867e; }
+#HTMLReporter .failingAlert:first-child { background-color: #b03911; }
+#HTMLReporter .results { margin-top: 14px; }
+#HTMLReporter #details { display: none; }
+#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; }
+#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }
+#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }
+#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; }
+#HTMLReporter.showDetails .summary { display: none; }
+#HTMLReporter.showDetails #details { display: block; }
+#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; }
+#HTMLReporter .summary { margin-top: 14px; }
+#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; }
+#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; }
+#HTMLReporter .summary .specSummary.failed a { color: #b03911; }
+#HTMLReporter .description + .suite { margin-top: 0; }
+#HTMLReporter .suite { margin-top: 14px; }
+#HTMLReporter .suite a { color: #333333; }
+#HTMLReporter #details .specDetail { margin-bottom: 28px; }
+#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; }
+#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; }
+#HTMLReporter .resultMessage span.result { display: block; }
+#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }
+
+#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ }
+#TrivialReporter a:visited, #TrivialReporter a { color: #303; }
+#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; }
+#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; }
+#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; }
+#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; }
+#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; }
+#TrivialReporter .runner.running { background-color: yellow; }
+#TrivialReporter .options { text-align: right; font-size: .8em; }
+#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; }
+#TrivialReporter .suite .suite { margin: 5px; }
+#TrivialReporter .suite.passed { background-color: #dfd; }
+#TrivialReporter .suite.failed { background-color: #fdd; }
+#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; }
+#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; }
+#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; }
+#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; }
+#TrivialReporter .spec.skipped { background-color: #bbb; }
+#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; }
+#TrivialReporter .passed { background-color: #cfc; display: none; }
+#TrivialReporter .failed { background-color: #fbb; }
+#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; }
+#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; }
+#TrivialReporter .resultMessage .mismatch { color: black; }
+#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; }
+#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; }
+#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; }
+#TrivialReporter #jasmine_content { position: fixed; right: 100%; }
+#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; }
diff --git a/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine.js b/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine.js
new file mode 100644
index 0000000..03bf89a
--- /dev/null
+++ b/samples/hello-cordova/spec/lib/jasmine-1.2.0/jasmine.js
@@ -0,0 +1,2529 @@
+var isCommonJS = typeof window == "undefined";
+
+/**
+ * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
+ *
+ * @namespace
+ */
+var jasmine = {};
+if (isCommonJS) exports.jasmine = jasmine;
+/**
+ * @private
+ */
+jasmine.unimplementedMethod_ = function() {
+  throw new Error("unimplemented method");
+};
+
+/**
+ * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just
+ * a plain old variable and may be redefined by somebody else.
+ *
+ * @private
+ */
+jasmine.undefined = jasmine.___undefined___;
+
+/**
+ * Show diagnostic messages in the console if set to true
+ *
+ */
+jasmine.VERBOSE = false;
+
+/**
+ * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.
+ *
+ */
+jasmine.DEFAULT_UPDATE_INTERVAL = 250;
+
+/**
+ * Default timeout interval in milliseconds for waitsFor() blocks.
+ */
+jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
+
+jasmine.getGlobal = function() {
+  function getGlobal() {
+    return this;
+  }
+
+  return getGlobal();
+};
+
+/**
+ * Allows for bound functions to be compared.  Internal use only.
+ *
+ * @ignore
+ * @private
+ * @param base {Object} bound 'this' for the function
+ * @param name {Function} function to find
+ */
+jasmine.bindOriginal_ = function(base, name) {
+  var original = base[name];
+  if (original.apply) {
+    return function() {
+      return original.apply(base, arguments);
+    };
+  } else {
+    // IE support
+    return jasmine.getGlobal()[name];
+  }
+};
+
+jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout');
+jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout');
+jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval');
+jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval');
+
+jasmine.MessageResult = function(values) {
+  this.type = 'log';
+  this.values = values;
+  this.trace = new Error(); // todo: test better
+};
+
+jasmine.MessageResult.prototype.toString = function() {
+  var text = "";
+  for (var i = 0; i < this.values.length; i++) {
+    if (i > 0) text += " ";
+    if (jasmine.isString_(this.values[i])) {
+      text += this.values[i];
+    } else {
+      text += jasmine.pp(this.values[i]);
+    }
+  }
+  return text;
+};
+
+jasmine.ExpectationResult = function(params) {
+  this.type = 'expect';
+  this.matcherName = params.matcherName;
+  this.passed_ = params.passed;
+  this.expected = params.expected;
+  this.actual = params.actual;
+  this.message = this.passed_ ? 'Passed.' : params.message;
+
+  var trace = (params.trace || new Error(this.message));
+  this.trace = this.passed_ ? '' : trace;
+};
+
+jasmine.ExpectationResult.prototype.toString = function () {
+  return this.message;
+};
+
+jasmine.ExpectationResult.prototype.passed = function () {
+  return this.passed_;
+};
+
+/**
+ * Getter for the Jasmine environment. Ensures one gets created
+ */
+jasmine.getEnv = function() {
+  var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
+  return env;
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isArray_ = function(value) {
+  return jasmine.isA_("Array", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isString_ = function(value) {
+  return jasmine.isA_("String", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isNumber_ = function(value) {
+  return jasmine.isA_("Number", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param {String} typeName
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isA_ = function(typeName, value) {
+  return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';
+};
+
+/**
+ * Pretty printer for expecations.  Takes any object and turns it into a human-readable string.
+ *
+ * @param value {Object} an object to be outputted
+ * @returns {String}
+ */
+jasmine.pp = function(value) {
+  var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
+  stringPrettyPrinter.format(value);
+  return stringPrettyPrinter.string;
+};
+
+/**
+ * Returns true if the object is a DOM Node.
+ *
+ * @param {Object} obj object to check
+ * @returns {Boolean}
+ */
+jasmine.isDomNode = function(obj) {
+  return obj.nodeType > 0;
+};
+
+/**
+ * Returns a matchable 'generic' object of the class type.  For use in expecations of type when values don't matter.
+ *
+ * @example
+ * // don't care about which function is passed in, as long as it's a function
+ * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function));
+ *
+ * @param {Class} clazz
+ * @returns matchable object of the type clazz
+ */
+jasmine.any = function(clazz) {
+  return new jasmine.Matchers.Any(clazz);
+};
+
+/**
+ * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the
+ * attributes on the object.
+ *
+ * @example
+ * // don't care about any other attributes than foo.
+ * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"});
+ *
+ * @param sample {Object} sample
+ * @returns matchable object for the sample
+ */
+jasmine.objectContaining = function (sample) {
+    return new jasmine.Matchers.ObjectContaining(sample);
+};
+
+/**
+ * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
+ *
+ * Spies should be created in test setup, before expectations.  They can then be checked, using the standard Jasmine
+ * expectation syntax. Spies can be checked if they were called or not and what the calling params were.
+ *
+ * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs).
+ *
+ * Spies are torn down at the end of every spec.
+ *
+ * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.
+ *
+ * @example
+ * // a stub
+ * var myStub = jasmine.createSpy('myStub');  // can be used anywhere
+ *
+ * // spy example
+ * var foo = {
+ *   not: function(bool) { return !bool; }
+ * }
+ *
+ * // actual foo.not will not be called, execution stops
+ * spyOn(foo, 'not');
+
+ // foo.not spied upon, execution will continue to implementation
+ * spyOn(foo, 'not').andCallThrough();
+ *
+ * // fake example
+ * var foo = {
+ *   not: function(bool) { return !bool; }
+ * }
+ *
+ * // foo.not(val) will return val
+ * spyOn(foo, 'not').andCallFake(function(value) {return value;});
+ *
+ * // mock example
+ * foo.not(7 == 7);
+ * expect(foo.not).toHaveBeenCalled();
+ * expect(foo.not).toHaveBeenCalledWith(true);
+ *
+ * @constructor
+ * @see spyOn, jasmine.createSpy, jasmine.createSpyObj
+ * @param {String} name
+ */
+jasmine.Spy = function(name) {
+  /**
+   * The name of the spy, if provided.
+   */
+  this.identity = name || 'unknown';
+  /**
+   *  Is this Object a spy?
+   */
+  this.isSpy = true;
+  /**
+   * The actual function this spy stubs.
+   */
+  this.plan = function() {
+  };
+  /**
+   * Tracking of the most recent call to the spy.
+   * @example
+   * var mySpy = jasmine.createSpy('foo');
+   * mySpy(1, 2);
+   * mySpy.mostRecentCall.args = [1, 2];
+   */
+  this.mostRecentCall = {};
+
+  /**
+   * Holds arguments for each call to the spy, indexed by call count
+   * @example
+   * var mySpy = jasmine.createSpy('foo');
+   * mySpy(1, 2);
+   * mySpy(7, 8);
+   * mySpy.mostRecentCall.args = [7, 8];
+   * mySpy.argsForCall[0] = [1, 2];
+   * mySpy.argsForCall[1] = [7, 8];
+   */
+  this.argsForCall = [];
+  this.calls = [];
+};
+
+/**
+ * Tells a spy to call through to the actual implemenatation.
+ *
+ * @example
+ * var foo = {
+ *   bar: function() { // do some stuff }
+ * }
+ *
+ * // defining a spy on an existing property: foo.bar
+ * spyOn(foo, 'bar').andCallThrough();
+ */
+jasmine.Spy.prototype.andCallThrough = function() {
+  this.plan = this.originalValue;
+  return this;
+};
+
+/**
+ * For setting the return value of a spy.
+ *
+ * @example
+ * // defining a spy from scratch: foo() returns 'baz'
+ * var foo = jasmine.createSpy('spy on foo').andReturn('baz');
+ *
+ * // defining a spy on an existing property: foo.bar() returns 'baz'
+ * spyOn(foo, 'bar').andReturn('baz');
+ *
+ * @param {Object} value
+ */
+jasmine.Spy.prototype.andReturn = function(value) {
+  this.plan = function() {
+    return value;
+  };
+  return this;
+};
+
+/**
+ * For throwing an exception when a spy is called.
+ *
+ * @example
+ * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'
+ * var foo = jasmine.createSpy('spy on foo').andThrow('baz');
+ *
+ * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'
+ * spyOn(foo, 'bar').andThrow('baz');
+ *
+ * @param {String} exceptionMsg
+ */
+jasmine.Spy.prototype.andThrow = function(exceptionMsg) {
+  this.plan = function() {
+    throw exceptionMsg;
+  };
+  return this;
+};
+
+/**
+ * Calls an alternate implementation when a spy is called.
+ *
+ * @example
+ * var baz = function() {
+ *   // do some stuff, return something
+ * }
+ * // defining a spy from scratch: foo() calls the function baz
+ * var foo = jasmine.createSpy('spy on foo').andCall(baz);
+ *
+ * // defining a spy on an existing property: foo.bar() calls an anonymnous function
+ * spyOn(foo, 'bar').andCall(function() { return 'baz';} );
+ *
+ * @param {Function} fakeFunc
+ */
+jasmine.Spy.prototype.andCallFake = function(fakeFunc) {
+  this.plan = fakeFunc;
+  return this;
+};
+
+/**
+ * Resets all of a spy's the tracking variables so that it can be used again.
+ *
+ * @example
+ * spyOn(foo, 'bar');
+ *
+ * foo.bar();
+ *
+ * expect(foo.bar.callCount).toEqual(1);
+ *
+ * foo.bar.reset();
+ *
+ * expect(foo.bar.callCount).toEqual(0);
+ */
+jasmine.Spy.prototype.reset = function() {
+  this.wasCalled = false;
+  this.callCount = 0;
+  this.argsForCall = [];
+  this.calls = [];
+  this.mostRecentCall = {};
+};
+
+jasmine.createSpy = function(name) {
+
+  var spyObj = function() {
+    spyObj.wasCalled = true;
+    spyObj.callCount++;
+    var args = jasmine.util.argsToArray(arguments);
+    spyObj.mostRecentCall.object = this;
+    spyObj.mostRecentCall.args = args;
+    spyObj.argsForCall.push(args);
+    spyObj.calls.push({object: this, args: args});
+    return spyObj.plan.apply(this, arguments);
+  };
+
+  var spy = new jasmine.Spy(name);
+
+  for (var prop in spy) {
+    spyObj[prop] = spy[prop];
+  }
+
+  spyObj.reset();
+
+  return spyObj;
+};
+
+/**
+ * Determines whether an object is a spy.
+ *
+ * @param {jasmine.Spy|Object} putativeSpy
+ * @returns {Boolean}
+ */
+jasmine.isSpy = function(putativeSpy) {
+  return putativeSpy && putativeSpy.isSpy;
+};
+
+/**
+ * Creates a more complicated spy: an Object that has every property a function that is a spy.  Used for stubbing something
+ * large in one call.
+ *
+ * @param {String} baseName name of spy class
+ * @param {Array} methodNames array of names of methods to make spies
+ */
+jasmine.createSpyObj = function(baseName, methodNames) {
+  if (!jasmine.isArray_(methodNames) || methodNames.length === 0) {
+    throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
+  }
+  var obj = {};
+  for (var i = 0; i < methodNames.length; i++) {
+    obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
+  }
+  return obj;
+};
+
+/**
+ * All parameters are pretty-printed and concatenated together, then written to the current spec's output.
+ *
+ * Be careful not to leave calls to <code>jasmine.log</code> in production code.
+ */
+jasmine.log = function() {
+  var spec = jasmine.getEnv().currentSpec;
+  spec.log.apply(spec, arguments);
+};
+
+/**
+ * Function that installs a spy on an existing object's method name.  Used within a Spec to create a spy.
+ *
+ * @example
+ * // spy example
+ * var foo = {
+ *   not: function(bool) { return !bool; }
+ * }
+ * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops
+ *
+ * @see jasmine.createSpy
+ * @param obj
+ * @param methodName
+ * @returns a Jasmine spy that can be chained with all spy methods
+ */
+var spyOn = function(obj, methodName) {
+  return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
+};
+if (isCommonJS) exports.spyOn = spyOn;
+
+/**
+ * Creates a Jasmine spec that will be added to the current suite.
+ *
+ * // TODO: pending tests
+ *
+ * @example
+ * it('should be true', function() {
+ *   expect(true).toEqual(true);
+ * });
+ *
+ * @param {String} desc description of this specification
+ * @param {Function} func defines the preconditions and expectations of the spec
+ */
+var it = function(desc, func) {
+  return jasmine.getEnv().it(desc, func);
+};
+if (isCommonJS) exports.it = it;
+
+/**
+ * Creates a <em>disabled</em> Jasmine spec.
+ *
+ * A convenience method that allows existing specs to be disabled temporarily during development.
+ *
+ * @param {String} desc description of this specification
+ * @param {Function} func defines the preconditions and expectations of the spec
+ */
+var xit = function(desc, func) {
+  return jasmine.getEnv().xit(desc, func);
+};
+if (isCommonJS) exports.xit = xit;
+
+/**
+ * Starts a chain for a Jasmine expectation.
+ *
+ * It is passed an Object that is the actual value and should chain to one of the many
+ * jasmine.Matchers functions.
+ *
+ * @param {Object} actual Actual value to test against and expected value
+ */
+var expect = function(actual) {
+  return jasmine.getEnv().currentSpec.expect(actual);
+};
+if (isCommonJS) exports.expect = expect;
+
+/**
+ * Defines part of a jasmine spec.  Used in cominbination with waits or waitsFor in asynchrnous specs.
+ *
+ * @param {Function} func Function that defines part of a jasmine spec.
+ */
+var runs = function(func) {
+  jasmine.getEnv().currentSpec.runs(func);
+};
+if (isCommonJS) exports.runs = runs;
+
+/**
+ * Waits a fixed time period before moving to the next block.
+ *
+ * @deprecated Use waitsFor() instead
+ * @param {Number} timeout milliseconds to wait
+ */
+var waits = function(timeout) {
+  jasmine.getEnv().currentSpec.waits(timeout);
+};
+if (isCommonJS) exports.waits = waits;
+
+/**
+ * Waits for the latchFunction to return true before proceeding to the next block.
+ *
+ * @param {Function} latchFunction
+ * @param {String} optional_timeoutMessage
+ * @param {Number} optional_timeout
+ */
+var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
+  jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
+};
+if (isCommonJS) exports.waitsFor = waitsFor;
+
+/**
+ * A function that is called before each spec in a suite.
+ *
+ * Used for spec setup, including validating assumptions.
+ *
+ * @param {Function} beforeEachFunction
+ */
+var beforeEach = function(beforeEachFunction) {
+  jasmine.getEnv().beforeEach(beforeEachFunction);
+};
+if (isCommonJS) exports.beforeEach = beforeEach;
+
+/**
+ * A function that is called after each spec in a suite.
+ *
+ * Used for restoring any state that is hijacked during spec execution.
+ *
+ * @param {Function} afterEachFunction
+ */
+var afterEach = function(afterEachFunction) {
+  jasmine.getEnv().afterEach(afterEachFunction);
+};
+if (isCommonJS) exports.afterEach = afterEach;
+
+/**
+ * Defines a suite of specifications.
+ *
+ * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared
+ * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization
+ * of setup in some tests.
+ *
+ * @example
+ * // TODO: a simple suite
+ *
+ * // TODO: a simple suite with a nested describe block
+ *
+ * @param {String} description A string, usually the class under test.
+ * @param {Function} specDefinitions function that defines several specs.
+ */
+var describe = function(description, specDefinitions) {
+  return jasmine.getEnv().describe(description, specDefinitions);
+};
+if (isCommonJS) exports.describe = describe;
+
+/**
+ * Disables a suite of specifications.  Used to disable some suites in a file, or files, temporarily during development.
+ *
+ * @param {String} description A string, usually the class under test.
+ * @param {Function} specDefinitions function that defines several specs.
+ */
+var xdescribe = function(description, specDefinitions) {
+  return jasmine.getEnv().xdescribe(description, specDefinitions);
+};
+if (isCommonJS) exports.xdescribe = xdescribe;
+
+
+// Provide the XMLHttpRequest class for IE 5.x-6.x:
+jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
+  function tryIt(f) {
+    try {
+      return f();
+    } catch(e) {
+    }
+    return null;
+  }
+
+  var xhr = tryIt(function() {
+    return new ActiveXObject("Msxml2.XMLHTTP.6.0");
+  }) ||
+    tryIt(function() {
+      return new ActiveXObject("Msxml2.XMLHTTP.3.0");
+    }) ||
+    tryIt(function() {
+      return new ActiveXObject("Msxml2.XMLHTTP");
+    }) ||
+    tryIt(function() {
+      return new ActiveXObject("Microsoft.XMLHTTP");
+    });
+
+  if (!xhr) throw new Error("This browser does not support XMLHttpRequest.");
+
+  return xhr;
+} : XMLHttpRequest;
+/**
+ * @namespace
+ */
+jasmine.util = {};
+
+/**
+ * Declare that a child class inherit it's prototype from the parent class.
+ *
+ * @private
+ * @param {Function} childClass
+ * @param {Function} parentClass
+ */
+jasmine.util.inherit = function(childClass, parentClass) {
+  /**
+   * @private
+   */
+  var subclass = function() {
+  };
+  subclass.prototype = parentClass.prototype;
+  childClass.prototype = new subclass();
+};
+
+jasmine.util.formatException = function(e) {
+  var lineNumber;
+  if (e.line) {
+    lineNumber = e.line;
+  }
+  else if (e.lineNumber) {
+    lineNumber = e.lineNumber;
+  }
+
+  var file;
+
+  if (e.sourceURL) {
+    file = e.sourceURL;
+  }
+  else if (e.fileName) {
+    file = e.fileName;
+  }
+
+  var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString();
+
+  if (file && lineNumber) {
+    message += ' in ' + file + ' (line ' + lineNumber + ')';
+  }
+
+  return message;
+};
+
+jasmine.util.htmlEscape = function(str) {
+  if (!str) return str;
+  return str.replace(/&/g, '&amp;')
+    .replace(/</g, '&lt;')
+    .replace(/>/g, '&gt;');
+};
+
+jasmine.util.argsToArray = function(args) {
+  var arrayOfArgs = [];
+  for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]);
+  return arrayOfArgs;
+};
+
+jasmine.util.extend = function(destination, source) {
+  for (var property in source) destination[property] = source[property];
+  return destination;
+};
+
+/**
+ * Environment for Jasmine
+ *
+ * @constructor
+ */
+jasmine.Env = function() {
+  this.currentSpec = null;
+  this.currentSuite = null;
+  this.currentRunner_ = new jasmine.Runner(this);
+
+  this.reporter = new jasmine.MultiReporter();
+
+  this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;
+  this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;
+  this.lastUpdate = 0;
+  this.specFilter = function() {
+    return true;
+  };
+
+  this.nextSpecId_ = 0;
+  this.nextSuiteId_ = 0;
+  this.equalityTesters_ = [];
+
+  // wrap matchers
+  this.matchersClass = function() {
+    jasmine.Matchers.apply(this, arguments);
+  };
+  jasmine.util.inherit(this.matchersClass, jasmine.Matchers);
+
+  jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass);
+};
+
+
+jasmine.Env.prototype.setTimeout = jasmine.setTimeout;
+jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout;
+jasmine.Env.prototype.setInterval = jasmine.setInterval;
+jasmine.Env.prototype.clearInterval = jasmine.clearInterval;
+
+/**
+ * @returns an object containing jasmine version build info, if set.
+ */
+jasmine.Env.prototype.version = function () {
+  if (jasmine.version_) {
+    return jasmine.version_;
+  } else {
+    throw new Error('Version not set');
+  }
+};
+
+/**
+ * @returns string containing jasmine version build info, if set.
+ */
+jasmine.Env.prototype.versionString = function() {
+  if (!jasmine.version_) {
+    return "version unknown";
+  }
+
+  var version = this.version();
+  var versionString = version.major + "." + version.minor + "." + version.build;
+  if (version.release_candidate) {
+    versionString += ".rc" + version.release_candidate;
+  }
+  versionString += " revision " + version.revision;
+  return versionString;
+};
+
+/**
+ * @returns a sequential integer starting at 0
+ */
+jasmine.Env.prototype.nextSpecId = function () {
+  return this.nextSpecId_++;
+};
+
+/**
+ * @returns a sequential integer starting at 0
+ */
+jasmine.Env.prototype.nextSuiteId = function () {
+  return this.nextSuiteId_++;
+};
+
+/**
+ * Register a reporter to receive status updates from Jasmine.
+ * @param {jasmine.Reporter} reporter An object which will receive status updates.
+ */
+jasmine.Env.prototype.addReporter = function(reporter) {
+  this.reporter.addReporter(reporter);
+};
+
+jasmine.Env.prototype.execute = function() {
+  this.currentRunner_.execute();
+};
+
+jasmine.Env.prototype.describe = function(description, specDefinitions) {
+  var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite);
+
+  var parentSuite = this.currentSuite;
+  if (parentSuite) {
+    parentSuite.add(suite);
+  } else {
+    this.currentRunner_.add(suite);
+  }
+
+  this.currentSuite = suite;
+
+  var declarationError = null;
+  try {
+    specDefinitions.call(suite);
+  } catch(e) {
+    declarationError = e;
+  }
+
+  if (declarationError) {
+    this.it("encountered a declaration exception", function() {
+      throw declarationError;
+    });
+  }
+
+  this.currentSuite = parentSuite;
+
+  return suite;
+};
+
+jasmine.Env.prototype.beforeEach = function(beforeEachFunction) {
+  if (this.currentSuite) {
+    this.currentSuite.beforeEach(beforeEachFunction);
+  } else {
+    this.currentRunner_.beforeEach(beforeEachFunction);
+  }
+};
+
+jasmine.Env.prototype.currentRunner = function () {
+  return this.currentRunner_;
+};
+
+jasmine.Env.prototype.afterEach = function(afterEachFunction) {
+  if (this.currentSuite) {
+    this.currentSuite.afterEach(afterEachFunction);
+  } else {
+    this.currentRunner_.afterEach(afterEachFunction);
+  }
+
+};
+
+jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) {
+  return {
+    execute: function() {
+    }
+  };
+};
+
+jasmine.Env.prototype.it = function(description, func) {
+  var spec = new jasmine.Spec(this, this.currentSuite, description);
+  this.currentSuite.add(spec);
+  this.currentSpec = spec;
+
+  if (func) {
+    spec.runs(func);
+  }
+
+  return spec;
+};
+
+jasmine.Env.prototype.xit = function(desc, func) {
+  return {
+    id: this.nextSpecId(),
+    runs: function() {
+    }
+  };
+};
+
+jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {
+  if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {
+    return true;
+  }
+
+  a.__Jasmine_been_here_before__ = b;
+  b.__Jasmine_been_here_before__ = a;
+
+  var hasKey = function(obj, keyName) {
+    return obj !== null && obj[keyName] !== jasmine.undefined;
+  };
+
+  for (var property in b) {
+    if (!hasKey(a, property) && hasKey(b, property)) {
+      mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
+    }
+  }
+  for (property in a) {
+    if (!hasKey(b, property) && hasKey(a, property)) {
+      mismatchKeys.push("expected missing key '" + property + "', but present in actual.");
+    }
+  }
+  for (property in b) {
+    if (property == '__Jasmine_been_here_before__') continue;
+    if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) {
+      mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual.");
+    }
+  }
+
+  if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) {
+    mismatchValues.push("arrays were not the same length");
+  }
+
+  delete a.__Jasmine_been_here_before__;
+  delete b.__Jasmine_been_here_before__;
+  return (mismatchKeys.length === 0 && mismatchValues.length === 0);
+};
+
+jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
+  mismatchKeys = mismatchKeys || [];
+  mismatchValues = mismatchValues || [];
+
+  for (var i = 0; i < this.equalityTesters_.length; i++) {
+    var equalityTester = this.equalityTesters_[i];
+    var result = equalityTester(a, b, this, mismatchKeys, mismatchValues);
+    if (result !== jasmine.undefined) return result;
+  }
+
+  if (a === b) return true;
+
+  if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) {
+    return (a == jasmine.undefined && b == jasmine.undefined);
+  }
+
+  if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) {
+    return a === b;
+  }
+
+  if (a instanceof Date && b instanceof Date) {
+    return a.getTime() == b.getTime();
+  }
+
+  if (a.jasmineMatches) {
+    return a.jasmineMatches(b);
+  }
+
+  if (b.jasmineMatches) {
+    return b.jasmineMatches(a);
+  }
+
+  if (a instanceof jasmine.Matchers.ObjectContaining) {
+    return a.matches(b);
+  }
+
+  if (b instanceof jasmine.Matchers.ObjectContaining) {
+    return b.matches(a);
+  }
+
+  if (jasmine.isString_(a) && jasmine.isString_(b)) {
+    return (a == b);
+  }
+
+  if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) {
+    return (a == b);
+  }
+
+  if (typeof a === "object" && typeof b === "object") {
+    return this.compareObjects_(a, b, mismatchKeys, mismatchValues);
+  }
+
+  //Straight check
+  return (a === b);
+};
+
+jasmine.Env.prototype.contains_ = function(haystack, needle) {
+  if (jasmine.isArray_(haystack)) {
+    for (var i = 0; i < haystack.length; i++) {
+      if (this.equals_(haystack[i], needle)) return true;
+    }
+    return false;
+  }
+  return haystack.indexOf(needle) >= 0;
+};
+
+jasmine.Env.prototype.addEqualityTester = function(equalityTester) {
+  this.equalityTesters_.push(equalityTester);
+};
+/** No-op base class for Jasmine reporters.
+ *
+ * @constructor
+ */
+jasmine.Reporter = function() {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportRunnerStarting = function(runner) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportRunnerResults = function(runner) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSuiteResults = function(suite) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSpecStarting = function(spec) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.reportSpecResults = function(spec) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.Reporter.prototype.log = function(str) {
+};
+
+/**
+ * Blocks are functions with executable code that make up a spec.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {Function} func
+ * @param {jasmine.Spec} spec
+ */
+jasmine.Block = function(env, func, spec) {
+  this.env = env;
+  this.func = func;
+  this.spec = spec;
+};
+
+jasmine.Block.prototype.execute = function(onComplete) {  
+  try {
+    this.func.apply(this.spec);
+  } catch (e) {
+    this.spec.fail(e);
+  }
+  onComplete();
+};
+/** JavaScript API reporter.
+ *
+ * @constructor
+ */
+jasmine.JsApiReporter = function() {
+  this.started = false;
+  this.finished = false;
+  this.suites_ = [];
+  this.results_ = {};
+};
+
+jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) {
+  this.started = true;
+  var suites = runner.topLevelSuites();
+  for (var i = 0; i < suites.length; i++) {
+    var suite = suites[i];
+    this.suites_.push(this.summarize_(suite));
+  }
+};
+
+jasmine.JsApiReporter.prototype.suites = function() {
+  return this.suites_;
+};
+
+jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) {
+  var isSuite = suiteOrSpec instanceof jasmine.Suite;
+  var summary = {
+    id: suiteOrSpec.id,
+    name: suiteOrSpec.description,
+    type: isSuite ? 'suite' : 'spec',
+    children: []
+  };
+  
+  if (isSuite) {
+    var children = suiteOrSpec.children();
+    for (var i = 0; i < children.length; i++) {
+      summary.children.push(this.summarize_(children[i]));
+    }
+  }
+  return summary;
+};
+
+jasmine.JsApiReporter.prototype.results = function() {
+  return this.results_;
+};
+
+jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) {
+  return this.results_[specId];
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) {
+  this.finished = true;
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) {
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) {
+  this.results_[spec.id] = {
+    messages: spec.results().getItems(),
+    result: spec.results().failedCount > 0 ? "failed" : "passed"
+  };
+};
+
+//noinspection JSUnusedLocalSymbols
+jasmine.JsApiReporter.prototype.log = function(str) {
+};
+
+jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){
+  var results = {};
+  for (var i = 0; i < specIds.length; i++) {
+    var specId = specIds[i];
+    results[specId] = this.summarizeResult_(this.results_[specId]);
+  }
+  return results;
+};
+
+jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){
+  var summaryMessages = [];
+  var messagesLength = result.messages.length;
+  for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {
+    var resultMessage = result.messages[messageIndex];
+    summaryMessages.push({
+      text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined,
+      passed: resultMessage.passed ? resultMessage.passed() : true,
+      type: resultMessage.type,
+      message: resultMessage.message,
+      trace: {
+        stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined
+      }
+    });
+  }
+
+  return {
+    result : result.result,
+    messages : summaryMessages
+  };
+};
+
+/**
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param actual
+ * @param {jasmine.Spec} spec
+ */
+jasmine.Matchers = function(env, actual, spec, opt_isNot) {
+  this.env = env;
+  this.actual = actual;
+  this.spec = spec;
+  this.isNot = opt_isNot || false;
+  this.reportWasCalled_ = false;
+};
+
+// todo: @deprecated as of Jasmine 0.11, remove soon [xw]
+jasmine.Matchers.pp = function(str) {
+  throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!");
+};
+
+// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw]
+jasmine.Matchers.prototype.report = function(result, failing_message, details) {
+  throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs");
+};
+
+jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) {
+  for (var methodName in prototype) {
+    if (methodName == 'report') continue;
+    var orig = prototype[methodName];
+    matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig);
+  }
+};
+
+jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
+  return function() {
+    var matcherArgs = jasmine.util.argsToArray(arguments);
+    var result = matcherFunction.apply(this, arguments);
+
+    if (this.isNot) {
+      result = !result;
+    }
+
+    if (this.reportWasCalled_) return result;
+
+    var message;
+    if (!result) {
+      if (this.message) {
+        message = this.message.apply(this, arguments);
+        if (jasmine.isArray_(message)) {
+          message = message[this.isNot ? 1 : 0];
+        }
+      } else {
+        var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });
+        message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate;
+        if (matcherArgs.length > 0) {
+          for (var i = 0; i < matcherArgs.length; i++) {
+            if (i > 0) message += ",";
+            message += " " + jasmine.pp(matcherArgs[i]);
+          }
+        }
+        message += ".";
+      }
+    }
+    var expectationResult = new jasmine.ExpectationResult({
+      matcherName: matcherName,
+      passed: result,
+      expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0],
+      actual: this.actual,
+      message: message
+    });
+    this.spec.addMatcherResult(expectationResult);
+    return jasmine.undefined;
+  };
+};
+
+
+
+
+/**
+ * toBe: compares the actual to the expected using ===
+ * @param expected
+ */
+jasmine.Matchers.prototype.toBe = function(expected) {
+  return this.actual === expected;
+};
+
+/**
+ * toNotBe: compares the actual to the expected using !==
+ * @param expected
+ * @deprecated as of 1.0. Use not.toBe() instead.
+ */
+jasmine.Matchers.prototype.toNotBe = function(expected) {
+  return this.actual !== expected;
+};
+
+/**
+ * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc.
+ *
+ * @param expected
+ */
+jasmine.Matchers.prototype.toEqual = function(expected) {
+  return this.env.equals_(this.actual, expected);
+};
+
+/**
+ * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
+ * @param expected
+ * @deprecated as of 1.0. Use not.toEqual() instead.
+ */
+jasmine.Matchers.prototype.toNotEqual = function(expected) {
+  return !this.env.equals_(this.actual, expected);
+};
+
+/**
+ * Matcher that compares the actual to the expected using a regular expression.  Constructs a RegExp, so takes
+ * a pattern or a String.
+ *
+ * @param expected
+ */
+jasmine.Matchers.prototype.toMatch = function(expected) {
+  return new RegExp(expected).test(this.actual);
+};
+
+/**
+ * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch
+ * @param expected
+ * @deprecated as of 1.0. Use not.toMatch() instead.
+ */
+jasmine.Matchers.prototype.toNotMatch = function(expected) {
+  return !(new RegExp(expected).test(this.actual));
+};
+
+/**
+ * Matcher that compares the actual to jasmine.undefined.
+ */
+jasmine.Matchers.prototype.toBeDefined = function() {
+  return (this.actual !== jasmine.undefined);
+};
+
+/**
+ * Matcher that compares the actual to jasmine.undefined.
+ */
+jasmine.Matchers.prototype.toBeUndefined = function() {
+  return (this.actual === jasmine.undefined);
+};
+
+/**
+ * Matcher that compares the actual to null.
+ */
+jasmine.Matchers.prototype.toBeNull = function() {
+  return (this.actual === null);
+};
+
+/**
+ * Matcher that boolean not-nots the actual.
+ */
+jasmine.Matchers.prototype.toBeTruthy = function() {
+  return !!this.actual;
+};
+
+
+/**
+ * Matcher that boolean nots the actual.
+ */
+jasmine.Matchers.prototype.toBeFalsy = function() {
+  return !this.actual;
+};
+
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was called.
+ */
+jasmine.Matchers.prototype.toHaveBeenCalled = function() {
+  if (arguments.length > 0) {
+    throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith');
+  }
+
+  if (!jasmine.isSpy(this.actual)) {
+    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+  }
+
+  this.message = function() {
+    return [
+      "Expected spy " + this.actual.identity + " to have been called.",
+      "Expected spy " + this.actual.identity + " not to have been called."
+    ];
+  };
+
+  return this.actual.wasCalled;
+};
+
+/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
+jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was not called.
+ *
+ * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead
+ */
+jasmine.Matchers.prototype.wasNotCalled = function() {
+  if (arguments.length > 0) {
+    throw new Error('wasNotCalled does not take arguments');
+  }
+
+  if (!jasmine.isSpy(this.actual)) {
+    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+  }
+
+  this.message = function() {
+    return [
+      "Expected spy " + this.actual.identity + " to not have been called.",
+      "Expected spy " + this.actual.identity + " to have been called."
+    ];
+  };
+
+  return !this.actual.wasCalled;
+};
+
+/**
+ * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.
+ *
+ * @example
+ *
+ */
+jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
+  var expectedArgs = jasmine.util.argsToArray(arguments);
+  if (!jasmine.isSpy(this.actual)) {
+    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+  }
+  this.message = function() {
+    if (this.actual.callCount === 0) {
+      // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
+      return [
+        "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
+        "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
+      ];
+    } else {
+      return [
+        "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
+        "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
+      ];
+    }
+  };
+
+  return this.env.contains_(this.actual.argsForCall, expectedArgs);
+};
+
+/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
+jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;
+
+/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */
+jasmine.Matchers.prototype.wasNotCalledWith = function() {
+  var expectedArgs = jasmine.util.argsToArray(arguments);
+  if (!jasmine.isSpy(this.actual)) {
+    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
+  }
+
+  this.message = function() {
+    return [
+      "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
+      "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
+    ];
+  };
+
+  return !this.env.contains_(this.actual.argsForCall, expectedArgs);
+};
+
+/**
+ * Matcher that checks that the expected item is an element in the actual Array.
+ *
+ * @param {Object} expected
+ */
+jasmine.Matchers.prototype.toContain = function(expected) {
+  return this.env.contains_(this.actual, expected);
+};
+
+/**
+ * Matcher that checks that the expected item is NOT an element in the actual Array.
+ *
+ * @param {Object} expected
+ * @deprecated as of 1.0. Use not.toContain() instead.
+ */
+jasmine.Matchers.prototype.toNotContain = function(expected) {
+  return !this.env.contains_(this.actual, expected);
+};
+
+jasmine.Matchers.prototype.toBeLessThan = function(expected) {
+  return this.actual < expected;
+};
+
+jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
+  return this.actual > expected;
+};
+
+/**
+ * Matcher that checks that the expected item is equal to the actual item
+ * up to a given level of decimal precision (default 2).
+ *
+ * @param {Number} expected
+ * @param {Number} precision
+ */
+jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) {
+  if (!(precision === 0)) {
+    precision = precision || 2;
+  }
+  var multiplier = Math.pow(10, precision);
+  var actual = Math.round(this.actual * multiplier);
+  expected = Math.round(expected * multiplier);
+  return expected == actual;
+};
+
+/**
+ * Matcher that checks that the expected exception was thrown by the actual.
+ *
+ * @param {String} expected
+ */
+jasmine.Matchers.prototype.toThrow = function(expected) {
+  var result = false;
+  var exception;
+  if (typeof this.actual != 'function') {
+    throw new Error('Actual is not a function');
+  }
+  try {
+    this.actual();
+  } catch (e) {
+    exception = e;
+  }
+  if (exception) {
+    result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
+  }
+
+  var not = this.isNot ? "not " : "";
+
+  this.message = function() {
+    if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
+      return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' ');
+    } else {
+      return "Expected function to throw an exception.";
+    }
+  };
+
+  return result;
+};
+
+jasmine.Matchers.Any = function(expectedClass) {
+  this.expectedClass = expectedClass;
+};
+
+jasmine.Matchers.Any.prototype.jasmineMatches = function(other) {
+  if (this.expectedClass == String) {
+    return typeof other == 'string' || other instanceof String;
+  }
+
+  if (this.expectedClass == Number) {
+    return typeof other == 'number' || other instanceof Number;
+  }
+
+  if (this.expectedClass == Function) {
+    return typeof other == 'function' || other instanceof Function;
+  }
+
+  if (this.expectedClass == Object) {
+    return typeof other == 'object';
+  }
+
+  return other instanceof this.expectedClass;
+};
+
+jasmine.Matchers.Any.prototype.jasmineToString = function() {
+  return '<jasmine.any(' + this.expectedClass + ')>';
+};
+
+jasmine.Matchers.ObjectContaining = function (sample) {
+  this.sample = sample;
+};
+
+jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) {
+  mismatchKeys = mismatchKeys || [];
+  mismatchValues = mismatchValues || [];
+
+  var env = jasmine.getEnv();
+
+  var hasKey = function(obj, keyName) {
+    return obj != null && obj[keyName] !== jasmine.undefined;
+  };
+
+  for (var property in this.sample) {
+    if (!hasKey(other, property) && hasKey(this.sample, property)) {
+      mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
+    }
+    else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) {
+      mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual.");
+    }
+  }
+
+  return (mismatchKeys.length === 0 && mismatchValues.length === 0);
+};
+
+jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () {
+  return "<jasmine.objectContaining(" + jasmine.pp(this.sample) + ")>";
+};
+// Mock setTimeout, clearTimeout
+// Contributed by Pivotal Computer Systems, www.pivotalsf.com
+
+jasmine.FakeTimer = function() {
+  this.reset();
+
+  var self = this;
+  self.setTimeout = function(funcToCall, millis) {
+    self.timeoutsMade++;
+    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
+    return self.timeoutsMade;
+  };
+
+  self.setInterval = function(funcToCall, millis) {
+    self.timeoutsMade++;
+    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
+    return self.timeoutsMade;
+  };
+
+  self.clearTimeout = function(timeoutKey) {
+    self.scheduledFunctions[timeoutKey] = jasmine.undefined;
+  };
+
+  self.clearInterval = function(timeoutKey) {
+    self.scheduledFunctions[timeoutKey] = jasmine.undefined;
+  };
+
+};
+
+jasmine.FakeTimer.prototype.reset = function() {
+  this.timeoutsMade = 0;
+  this.scheduledFunctions = {};
+  this.nowMillis = 0;
+};
+
+jasmine.FakeTimer.prototype.tick = function(millis) {
+  var oldMillis = this.nowMillis;
+  var newMillis = oldMillis + millis;
+  this.runFunctionsWithinRange(oldMillis, newMillis);
+  this.nowMillis = newMillis;
+};
+
+jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
+  var scheduledFunc;
+  var funcsToRun = [];
+  for (var timeoutKey in this.scheduledFunctions) {
+    scheduledFunc = this.scheduledFunctions[timeoutKey];
+    if (scheduledFunc != jasmine.undefined &&
+        scheduledFunc.runAtMillis >= oldMillis &&
+        scheduledFunc.runAtMillis <= nowMillis) {
+      funcsToRun.push(scheduledFunc);
+      this.scheduledFunctions[timeoutKey] = jasmine.undefined;
+    }
+  }
+
+  if (funcsToRun.length > 0) {
+    funcsToRun.sort(function(a, b) {
+      return a.runAtMillis - b.runAtMillis;
+    });
+    for (var i = 0; i < funcsToRun.length; ++i) {
+      try {
+        var funcToRun = funcsToRun[i];
+        this.nowMillis = funcToRun.runAtMillis;
+        funcToRun.funcToCall();
+        if (funcToRun.recurring) {
+          this.scheduleFunction(funcToRun.timeoutKey,
+              funcToRun.funcToCall,
+              funcToRun.millis,
+              true);
+        }
+      } catch(e) {
+      }
+    }
+    this.runFunctionsWithinRange(oldMillis, nowMillis);
+  }
+};
+
+jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
+  this.scheduledFunctions[timeoutKey] = {
+    runAtMillis: this.nowMillis + millis,
+    funcToCall: funcToCall,
+    recurring: recurring,
+    timeoutKey: timeoutKey,
+    millis: millis
+  };
+};
+
+/**
+ * @namespace
+ */
+jasmine.Clock = {
+  defaultFakeTimer: new jasmine.FakeTimer(),
+
+  reset: function() {
+    jasmine.Clock.assertInstalled();
+    jasmine.Clock.defaultFakeTimer.reset();
+  },
+
+  tick: function(millis) {
+    jasmine.Clock.assertInstalled();
+    jasmine.Clock.defaultFakeTimer.tick(millis);
+  },
+
+  runFunctionsWithinRange: function(oldMillis, nowMillis) {
+    jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
+  },
+
+  scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
+    jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
+  },
+
+  useMock: function() {
+    if (!jasmine.Clock.isInstalled()) {
+      var spec = jasmine.getEnv().currentSpec;
+      spec.after(jasmine.Clock.uninstallMock);
+
+      jasmine.Clock.installMock();
+    }
+  },
+
+  installMock: function() {
+    jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
+  },
+
+  uninstallMock: function() {
+    jasmine.Clock.assertInstalled();
+    jasmine.Clock.installed = jasmine.Clock.real;
+  },
+
+  real: {
+    setTimeout: jasmine.getGlobal().setTimeout,
+    clearTimeout: jasmine.getGlobal().clearTimeout,
+    setInterval: jasmine.getGlobal().setInterval,
+    clearInterval: jasmine.getGlobal().clearInterval
+  },
+
+  assertInstalled: function() {
+    if (!jasmine.Clock.isInstalled()) {
+      throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
+    }
+  },
+
+  isInstalled: function() {
+    return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer;
+  },
+
+  installed: null
+};
+jasmine.Clock.installed = jasmine.Clock.real;
+
+//else for IE support
+jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
+  if (jasmine.Clock.installed.setTimeout.apply) {
+    return jasmine.Clock.installed.setTimeout.apply(this, arguments);
+  } else {
+    return jasmine.Clock.installed.setTimeout(funcToCall, millis);
+  }
+};
+
+jasmine.getGlobal().setInterval = function(funcToCall, millis) {
+  if (jasmine.Clock.installed.setInterval.apply) {
+    return jasmine.Clock.installed.setInterval.apply(this, arguments);
+  } else {
+    return jasmine.Clock.installed.setInterval(funcToCall, millis);
+  }
+};
+
+jasmine.getGlobal().clearTimeout = function(timeoutKey) {
+  if (jasmine.Clock.installed.clearTimeout.apply) {
+    return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
+  } else {
+    return jasmine.Clock.installed.clearTimeout(timeoutKey);
+  }
+};
+
+jasmine.getGlobal().clearInterval = function(timeoutKey) {
+  if (jasmine.Clock.installed.clearTimeout.apply) {
+    return jasmine.Clock.installed.clearInterval.apply(this, arguments);
+  } else {
+    return jasmine.Clock.installed.clearInterval(timeoutKey);
+  }
+};
+
+/**
+ * @constructor
+ */
+jasmine.MultiReporter = function() {
+  this.subReporters_ = [];
+};
+jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter);
+
+jasmine.MultiReporter.prototype.addReporter = function(reporter) {
+  this.subReporters_.push(reporter);
+};
+
+(function() {
+  var functionNames = [
+    "reportRunnerStarting",
+    "reportRunnerResults",
+    "reportSuiteResults",
+    "reportSpecStarting",
+    "reportSpecResults",
+    "log"
+  ];
+  for (var i = 0; i < functionNames.length; i++) {
+    var functionName = functionNames[i];
+    jasmine.MultiReporter.prototype[functionName] = (function(functionName) {
+      return function() {
+        for (var j = 0; j < this.subReporters_.length; j++) {
+          var subReporter = this.subReporters_[j];
+          if (subReporter[functionName]) {
+            subReporter[functionName].apply(subReporter, arguments);
+          }
+        }
+      };
+    })(functionName);
+  }
+})();
+/**
+ * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults
+ *
+ * @constructor
+ */
+jasmine.NestedResults = function() {
+  /**
+   * The total count of results
+   */
+  this.totalCount = 0;
+  /**
+   * Number of passed results
+   */
+  this.passedCount = 0;
+  /**
+   * Number of failed results
+   */
+  this.failedCount = 0;
+  /**
+   * Was this suite/spec skipped?
+   */
+  this.skipped = false;
+  /**
+   * @ignore
+   */
+  this.items_ = [];
+};
+
+/**
+ * Roll up the result counts.
+ *
+ * @param result
+ */
+jasmine.NestedResults.prototype.rollupCounts = function(result) {
+  this.totalCount += result.totalCount;
+  this.passedCount += result.passedCount;
+  this.failedCount += result.failedCount;
+};
+
+/**
+ * Adds a log message.
+ * @param values Array of message parts which will be concatenated later.
+ */
+jasmine.NestedResults.prototype.log = function(values) {
+  this.items_.push(new jasmine.MessageResult(values));
+};
+
+/**
+ * Getter for the results: message & results.
+ */
+jasmine.NestedResults.prototype.getItems = function() {
+  return this.items_;
+};
+
+/**
+ * Adds a result, tracking counts (total, passed, & failed)
+ * @param {jasmine.ExpectationResult|jasmine.NestedResults} result
+ */
+jasmine.NestedResults.prototype.addResult = function(result) {
+  if (result.type != 'log') {
+    if (result.items_) {
+      this.rollupCounts(result);
+    } else {
+      this.totalCount++;
+      if (result.passed()) {
+        this.passedCount++;
+      } else {
+        this.failedCount++;
+      }
+    }
+  }
+  this.items_.push(result);
+};
+
+/**
+ * @returns {Boolean} True if <b>everything</b> below passed
+ */
+jasmine.NestedResults.prototype.passed = function() {
+  return this.passedCount === this.totalCount;
+};
+/**
+ * Base class for pretty printing for expectation results.
+ */
+jasmine.PrettyPrinter = function() {
+  this.ppNestLevel_ = 0;
+};
+
+/**
+ * Formats a value in a nice, human-readable string.
+ *
+ * @param value
+ */
+jasmine.PrettyPrinter.prototype.format = function(value) {
+  if (this.ppNestLevel_ > 40) {
+    throw new Error('jasmine.PrettyPrinter: format() nested too deeply!');
+  }
+
+  this.ppNestLevel_++;
+  try {
+    if (value === jasmine.undefined) {
+      this.emitScalar('undefined');
+    } else if (value === null) {
+      this.emitScalar('null');
+    } else if (value === jasmine.getGlobal()) {
+      this.emitScalar('<global>');
+    } else if (value.jasmineToString) {
+      this.emitScalar(value.jasmineToString());
+    } else if (typeof value === 'string') {
+      this.emitString(value);
+    } else if (jasmine.isSpy(value)) {
+      this.emitScalar("spy on " + value.identity);
+    } else if (value instanceof RegExp) {
+      this.emitScalar(value.toString());
+    } else if (typeof value === 'function') {
+      this.emitScalar('Function');
+    } else if (typeof value.nodeType === 'number') {
+      this.emitScalar('HTMLNode');
+    } else if (value instanceof Date) {
+      this.emitScalar('Date(' + value + ')');
+    } else if (value.__Jasmine_been_here_before__) {
+      this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>');
+    } else if (jasmine.isArray_(value) || typeof value == 'object') {
+      value.__Jasmine_been_here_before__ = true;
+      if (jasmine.isArray_(value)) {
+        this.emitArray(value);
+      } else {
+        this.emitObject(value);
+      }
+      delete value.__Jasmine_been_here_before__;
+    } else {
+      this.emitScalar(value.toString());
+    }
+  } finally {
+    this.ppNestLevel_--;
+  }
+};
+
+jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
+  for (var property in obj) {
+    if (property == '__Jasmine_been_here_before__') continue;
+    fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined && 
+                                         obj.__lookupGetter__(property) !== null) : false);
+  }
+};
+
+jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_;
+jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_;
+
+jasmine.StringPrettyPrinter = function() {
+  jasmine.PrettyPrinter.call(this);
+
+  this.string = '';
+};
+jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter);
+
+jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) {
+  this.append(value);
+};
+
+jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
+  this.append("'" + value + "'");
+};
+
+jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
+  this.append('[ ');
+  for (var i = 0; i < array.length; i++) {
+    if (i > 0) {
+      this.append(', ');
+    }
+    this.format(array[i]);
+  }
+  this.append(' ]');
+};
+
+jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {
+  var self = this;
+  this.append('{ ');
+  var first = true;
+
+  this.iterateObject(obj, function(property, isGetter) {
+    if (first) {
+      first = false;
+    } else {
+      self.append(', ');
+    }
+
+    self.append(property);
+    self.append(' : ');
+    if (isGetter) {
+      self.append('<getter>');
+    } else {
+      self.format(obj[property]);
+    }
+  });
+
+  this.append(' }');
+};
+
+jasmine.StringPrettyPrinter.prototype.append = function(value) {
+  this.string += value;
+};
+jasmine.Queue = function(env) {
+  this.env = env;
+  this.blocks = [];
+  this.running = false;
+  this.index = 0;
+  this.offset = 0;
+  this.abort = false;
+};
+
+jasmine.Queue.prototype.addBefore = function(block) {
+  this.blocks.unshift(block);
+};
+
+jasmine.Queue.prototype.add = function(block) {
+  this.blocks.push(block);
+};
+
+jasmine.Queue.prototype.insertNext = function(block) {
+  this.blocks.splice((this.index + this.offset + 1), 0, block);
+  this.offset++;
+};
+
+jasmine.Queue.prototype.start = function(onComplete) {
+  this.running = true;
+  this.onComplete = onComplete;
+  this.next_();
+};
+
+jasmine.Queue.prototype.isRunning = function() {
+  return this.running;
+};
+
+jasmine.Queue.LOOP_DONT_RECURSE = true;
+
+jasmine.Queue.prototype.next_ = function() {
+  var self = this;
+  var goAgain = true;
+
+  while (goAgain) {
+    goAgain = false;
+    
+    if (self.index < self.blocks.length && !this.abort) {
+      var calledSynchronously = true;
+      var completedSynchronously = false;
+
+      var onComplete = function () {
+        if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) {
+          completedSynchronously = true;
+          return;
+        }
+
+        if (self.blocks[self.index].abort) {
+          self.abort = true;
+        }
+
+        self.offset = 0;
+        self.index++;
+
+        var now = new Date().getTime();
+        if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) {
+          self.env.lastUpdate = now;
+          self.env.setTimeout(function() {
+            self.next_();
+          }, 0);
+        } else {
+          if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) {
+            goAgain = true;
+          } else {
+            self.next_();
+          }
+        }
+      };
+      self.blocks[self.index].execute(onComplete);
+
+      calledSynchronously = false;
+      if (completedSynchronously) {
+        onComplete();
+      }
+      
+    } else {
+      self.running = false;
+      if (self.onComplete) {
+        self.onComplete();
+      }
+    }
+  }
+};
+
+jasmine.Queue.prototype.results = function() {
+  var results = new jasmine.NestedResults();
+  for (var i = 0; i < this.blocks.length; i++) {
+    if (this.blocks[i].results) {
+      results.addResult(this.blocks[i].results());
+    }
+  }
+  return results;
+};
+
+
+/**
+ * Runner
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ */
+jasmine.Runner = function(env) {
+  var self = this;
+  self.env = env;
+  self.queue = new jasmine.Queue(env);
+  self.before_ = [];
+  self.after_ = [];
+  self.suites_ = [];
+};
+
+jasmine.Runner.prototype.execute = function() {
+  var self = this;
+  if (self.env.reporter.reportRunnerStarting) {
+    self.env.reporter.reportRunnerStarting(this);
+  }
+  self.queue.start(function () {
+    self.finishCallback();
+  });
+};
+
+jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
+  beforeEachFunction.typeName = 'beforeEach';
+  this.before_.splice(0,0,beforeEachFunction);
+};
+
+jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
+  afterEachFunction.typeName = 'afterEach';
+  this.after_.splice(0,0,afterEachFunction);
+};
+
+
+jasmine.Runner.prototype.finishCallback = function() {
+  this.env.reporter.reportRunnerResults(this);
+};
+
+jasmine.Runner.prototype.addSuite = function(suite) {
+  this.suites_.push(suite);
+};
+
+jasmine.Runner.prototype.add = function(block) {
+  if (block instanceof jasmine.Suite) {
+    this.addSuite(block);
+  }
+  this.queue.add(block);
+};
+
+jasmine.Runner.prototype.specs = function () {
+  var suites = this.suites();
+  var specs = [];
+  for (var i = 0; i < suites.length; i++) {
+    specs = specs.concat(suites[i].specs());
+  }
+  return specs;
+};
+
+jasmine.Runner.prototype.suites = function() {
+  return this.suites_;
+};
+
+jasmine.Runner.prototype.topLevelSuites = function() {
+  var topLevelSuites = [];
+  for (var i = 0; i < this.suites_.length; i++) {
+    if (!this.suites_[i].parentSuite) {
+      topLevelSuites.push(this.suites_[i]);
+    }
+  }
+  return topLevelSuites;
+};
+
+jasmine.Runner.prototype.results = function() {
+  return this.queue.results();
+};
+/**
+ * Internal representation of a Jasmine specification, or test.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {jasmine.Suite} suite
+ * @param {String} description
+ */
+jasmine.Spec = function(env, suite, description) {
+  if (!env) {
+    throw new Error('jasmine.Env() required');
+  }
+  if (!suite) {
+    throw new Error('jasmine.Suite() required');
+  }
+  var spec = this;
+  spec.id = env.nextSpecId ? env.nextSpecId() : null;
+  spec.env = env;
+  spec.suite = suite;
+  spec.description = description;
+  spec.queue = new jasmine.Queue(env);
+
+  spec.afterCallbacks = [];
+  spec.spies_ = [];
+
+  spec.results_ = new jasmine.NestedResults();
+  spec.results_.description = description;
+  spec.matchersClass = null;
+};
+
+jasmine.Spec.prototype.getFullName = function() {
+  return this.suite.getFullName() + ' ' + this.description + '.';
+};
+
+
+jasmine.Spec.prototype.results = function() {
+  return this.results_;
+};
+
+/**
+ * All parameters are pretty-printed and concatenated together, then written to the spec's output.
+ *
+ * Be careful not to leave calls to <code>jasmine.log</code> in production code.
+ */
+jasmine.Spec.prototype.log = function() {
+  return this.results_.log(arguments);
+};
+
+jasmine.Spec.prototype.runs = function (func) {
+  var block = new jasmine.Block(this.env, func, this);
+  this.addToQueue(block);
+  return this;
+};
+
+jasmine.Spec.prototype.addToQueue = function (block) {
+  if (this.queue.isRunning()) {
+    this.queue.insertNext(block);
+  } else {
+    this.queue.add(block);
+  }
+};
+
+/**
+ * @param {jasmine.ExpectationResult} result
+ */
+jasmine.Spec.prototype.addMatcherResult = function(result) {
+  this.results_.addResult(result);
+};
+
+jasmine.Spec.prototype.expect = function(actual) {
+  var positive = new (this.getMatchersClass_())(this.env, actual, this);
+  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
+  return positive;
+};
+
+/**
+ * Waits a fixed time period before moving to the next block.
+ *
+ * @deprecated Use waitsFor() instead
+ * @param {Number} timeout milliseconds to wait
+ */
+jasmine.Spec.prototype.waits = function(timeout) {
+  var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);
+  this.addToQueue(waitsFunc);
+  return this;
+};
+
+/**
+ * Waits for the latchFunction to return true before proceeding to the next block.
+ *
+ * @param {Function} latchFunction
+ * @param {String} optional_timeoutMessage
+ * @param {Number} optional_timeout
+ */
+jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
+  var latchFunction_ = null;
+  var optional_timeoutMessage_ = null;
+  var optional_timeout_ = null;
+
+  for (var i = 0; i < arguments.length; i++) {
+    var arg = arguments[i];
+    switch (typeof arg) {
+      case 'function':
+        latchFunction_ = arg;
+        break;
+      case 'string':
+        optional_timeoutMessage_ = arg;
+        break;
+      case 'number':
+        optional_timeout_ = arg;
+        break;
+    }
+  }
+
+  var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);
+  this.addToQueue(waitsForFunc);
+  return this;
+};
+
+jasmine.Spec.prototype.fail = function (e) {
+  var expectationResult = new jasmine.ExpectationResult({
+    passed: false,
+    message: e ? jasmine.util.formatException(e) : 'Exception',
+    trace: { stack: e.stack }
+  });
+  this.results_.addResult(expectationResult);
+};
+
+jasmine.Spec.prototype.getMatchersClass_ = function() {
+  return this.matchersClass || this.env.matchersClass;
+};
+
+jasmine.Spec.prototype.addMatchers = function(matchersPrototype) {
+  var parent = this.getMatchersClass_();
+  var newMatchersClass = function() {
+    parent.apply(this, arguments);
+  };
+  jasmine.util.inherit(newMatchersClass, parent);
+  jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass);
+  this.matchersClass = newMatchersClass;
+};
+
+jasmine.Spec.prototype.finishCallback = function() {
+  this.env.reporter.reportSpecResults(this);
+};
+
+jasmine.Spec.prototype.finish = function(onComplete) {
+  this.removeAllSpies();
+  this.finishCallback();
+  if (onComplete) {
+    onComplete();
+  }
+};
+
+jasmine.Spec.prototype.after = function(doAfter) {
+  if (this.queue.isRunning()) {
+    this.queue.add(new jasmine.Block(this.env, doAfter, this));
+  } else {
+    this.afterCallbacks.unshift(doAfter);
+  }
+};
+
+jasmine.Spec.prototype.execute = function(onComplete) {
+  var spec = this;
+  if (!spec.env.specFilter(spec)) {
+    spec.results_.skipped = true;
+    spec.finish(onComplete);
+    return;
+  }
+
+  this.env.reporter.reportSpecStarting(this);
+
+  spec.env.currentSpec = spec;
+
+  spec.addBeforesAndAftersToQueue();
+
+  spec.queue.start(function () {
+    spec.finish(onComplete);
+  });
+};
+
+jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
+  var runner = this.env.currentRunner();
+  var i;
+
+  for (var suite = this.suite; suite; suite = suite.parentSuite) {
+    for (i = 0; i < suite.before_.length; i++) {
+      this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this));
+    }
+  }
+  for (i = 0; i < runner.before_.length; i++) {
+    this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));
+  }
+  for (i = 0; i < this.afterCallbacks.length; i++) {
+    this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this));
+  }
+  for (suite = this.suite; suite; suite = suite.parentSuite) {
+    for (i = 0; i < suite.after_.length; i++) {
+      this.queue.add(new jasmine.Block(this.env, suite.after_[i], this));
+    }
+  }
+  for (i = 0; i < runner.after_.length; i++) {
+    this.queue.add(new jasmine.Block(this.env, runner.after_[i], this));
+  }
+};
+
+jasmine.Spec.prototype.explodes = function() {
+  throw 'explodes function should not have been called';
+};
+
+jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) {
+  if (obj == jasmine.undefined) {
+    throw "spyOn could not find an object to spy upon for " + methodName + "()";
+  }
+
+  if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) {
+    throw methodName + '() method does not exist';
+  }
+
+  if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) {
+    throw new Error(methodName + ' has already been spied upon');
+  }
+
+  var spyObj = jasmine.createSpy(methodName);
+
+  this.spies_.push(spyObj);
+  spyObj.baseObj = obj;
+  spyObj.methodName = methodName;
+  spyObj.originalValue = obj[methodName];
+
+  obj[methodName] = spyObj;
+
+  return spyObj;
+};
+
+jasmine.Spec.prototype.removeAllSpies = function() {
+  for (var i = 0; i < this.spies_.length; i++) {
+    var spy = this.spies_[i];
+    spy.baseObj[spy.methodName] = spy.originalValue;
+  }
+  this.spies_ = [];
+};
+
+/**
+ * Internal representation of a Jasmine suite.
+ *
+ * @constructor
+ * @param {jasmine.Env} env
+ * @param {String} description
+ * @param {Function} specDefinitions
+ * @param {jasmine.Suite} parentSuite
+ */
+jasmine.Suite = function(env, description, specDefinitions, parentSuite) {
+  var self = this;
+  self.id = env.nextSuiteId ? env.nextSuiteId() : null;
+  self.description = description;
+  self.queue = new jasmine.Queue(env);
+  self.parentSuite = parentSuite;
+  self.env = env;
+  self.before_ = [];
+  self.after_ = [];
+  self.children_ = [];
+  self.suites_ = [];
+  self.specs_ = [];
+};
+
+jasmine.Suite.prototype.getFullName = function() {
+  var fullName = this.description;
+  for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) {
+    fullName = parentSuite.description + ' ' + fullName;
+  }
+  return fullName;
+};
+
+jasmine.Suite.prototype.finish = function(onComplete) {
+  this.env.reporter.reportSuiteResults(this);
+  this.finished = true;
+  if (typeof(onComplete) == 'function') {
+    onComplete();
+  }
+};
+
+jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
+  beforeEachFunction.typeName = 'beforeEach';
+  this.before_.unshift(beforeEachFunction);
+};
+
+jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
+  afterEachFunction.typeName = 'afterEach';
+  this.after_.unshift(afterEachFunction);
+};
+
+jasmine.Suite.prototype.results = function() {
+  return this.queue.results();
+};
+
+jasmine.Suite.prototype.add = function(suiteOrSpec) {
+  this.children_.push(suiteOrSpec);
+  if (suiteOrSpec instanceof jasmine.Suite) {
+    this.suites_.push(suiteOrSpec);
+    this.env.currentRunner().addSuite(suiteOrSpec);
+  } else {
+    this.specs_.push(suiteOrSpec);
+  }
+  this.queue.add(suiteOrSpec);
+};
+
+jasmine.Suite.prototype.specs = function() {
+  return this.specs_;
+};
+
+jasmine.Suite.prototype.suites = function() {
+  return this.suites_;
+};
+
+jasmine.Suite.prototype.children = function() {
+  return this.children_;
+};
+
+jasmine.Suite.prototype.execute = function(onComplete) {
+  var self = this;
+  this.queue.start(function () {
+    self.finish(onComplete);
+  });
+};
+jasmine.WaitsBlock = function(env, timeout, spec) {
+  this.timeout = timeout;
+  jasmine.Block.call(this, env, null, spec);
+};
+
+jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);
+
+jasmine.WaitsBlock.prototype.execute = function (onComplete) {
+  if (jasmine.VERBOSE) {
+    this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');
+  }
+  this.env.setTimeout(function () {
+    onComplete();
+  }, this.timeout);
+};
+/**
+ * A block which waits for some condition to become true, with timeout.
+ *
+ * @constructor
+ * @extends jasmine.Block
+ * @param {jasmine.Env} env The Jasmine environment.
+ * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.
+ * @param {Function} latchFunction A function which returns true when the desired condition has been met.
+ * @param {String} message The message to display if the desired condition hasn't been met within the given time period.
+ * @param {jasmine.Spec} spec The Jasmine spec.
+ */
+jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {
+  this.timeout = timeout || env.defaultTimeoutInterval;
+  this.latchFunction = latchFunction;
+  this.message = message;
+  this.totalTimeSpentWaitingForLatch = 0;
+  jasmine.Block.call(this, env, null, spec);
+};
+jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
+
+jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
+
+jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
+  if (jasmine.VERBOSE) {
+    this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
+  }
+  var latchFunctionResult;
+  try {
+    latchFunctionResult = this.latchFunction.apply(this.spec);
+  } catch (e) {
+    this.spec.fail(e);
+    onComplete();
+    return;
+  }
+
+  if (latchFunctionResult) {
+    onComplete();
+  } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {
+    var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');
+    this.spec.fail({
+      name: 'timeout',
+      message: message
+    });
+
+    this.abort = true;
+    onComplete();
+  } else {
+    this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
+    var self = this;
+    this.env.setTimeout(function() {
+      self.execute(onComplete);
+    }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
+  }
+};
+
+jasmine.version_= {
+  "major": 1,
+  "minor": 2,
+  "build": 0,
+  "revision": 1337005947
+};
diff --git a/templates/CordovaBasicTemplate/description.xml b/templates/CordovaBasicTemplate/description.xml
new file mode 100644
index 0000000..36c582c
--- /dev/null
+++ b/templates/CordovaBasicTemplate/description.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet type="text/xsl" href="../description.xsl"?>
+<Overview version="0.2">
+  <SampleName>Cordova Blank Application</SampleName>
+  <SampleVersion></SampleVersion>
+  <Preview>snapshot.png</Preview>
+  <Description>
+    Cordova Tizen Blank Application.
+  </Description>
+</Overview>
diff --git a/templates/CordovaBasicTemplate/ic_cordova_32.png b/templates/CordovaBasicTemplate/ic_cordova_32.png
new file mode 100755
index 0000000..b6fbeb8
--- /dev/null
+++ b/templates/CordovaBasicTemplate/ic_cordova_32.png
Binary files differ
diff --git a/templates/CordovaBasicTemplate/ic_cordova_64.png b/templates/CordovaBasicTemplate/ic_cordova_64.png
new file mode 100755
index 0000000..eef3cd9
--- /dev/null
+++ b/templates/CordovaBasicTemplate/ic_cordova_64.png
Binary files differ
diff --git a/templates/CordovaBasicTemplate/project/config.xml b/templates/CordovaBasicTemplate/project/config.xml
new file mode 100644
index 0000000..3f408d1
--- /dev/null
+++ b/templates/CordovaBasicTemplate/project/config.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" version="2.0 Beta" viewmodes="fullscreen" id="http://YourDomain.com/cordova-basic-template">  
+	<icon src="icon.png"/>  
+	<content src="index.html"/>  
+	<feature name="http://tizen.org/api/application" required="true"/>  
+	<feature name="http://tizen.org/api/application.kill" required="true"/>  
+	<feature name="http://tizen.org/api/application.launch" required="true"/>  
+	<feature name="http://tizen.org/api/application.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact" required="true"/>  
+	<feature name="http://tizen.org/api/contact.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact.write" required="true"/>  
+	<feature name="http://tizen.org/api/systeminfo" required="true"/>  
+	<feature name="http://tizen.org/api/time" required="true"/>  
+	<feature name="http://tizen.org/api/time.read" required="true"/>  
+	<feature name="http://tizen.org/api/time.write" required="true"/>  
+	<feature name="http://tizen.org/api/tizen" required="true"/>  
+	<name>cordova-basic-template</name>
+</widget>
diff --git a/templates/CordovaBasicTemplate/project/cordova-2.0.0.js b/templates/CordovaBasicTemplate/project/cordova-2.0.0.js
new file mode 100644
index 0000000..ee17d0d
--- /dev/null
+++ b/templates/CordovaBasicTemplate/project/cordova-2.0.0.js
@@ -0,0 +1,6957 @@
+// commit 870218e03979cb7fb6fcae8cd8532008d163d6cc
+
+// File generated at :: Thu Aug 02 2012 17:18:02 GMT+0200 (CEST)
+
+/*
+ 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.
+*/
+
+;(function() {
+
+// file: lib/scripts/require.js
+var require,
+    define;
+
+(function () {
+    var modules = {};
+
+    function build(module) {
+        var factory = module.factory;
+        module.exports = {};
+        delete module.factory;
+        factory(require, module.exports, module);
+        return module.exports;
+    }
+
+    require = function (id) {
+        if (!modules[id]) {
+            throw "module " + id + " not found";
+        }
+        return modules[id].factory ? build(modules[id]) : modules[id].exports;
+    };
+
+    define = function (id, factory) {
+        if (modules[id]) {
+            throw "module " + id + " already defined";
+        }
+
+        modules[id] = {
+            id: id,
+            factory: factory
+        };
+    };
+
+    define.remove = function (id) {
+        delete modules[id];
+    };
+
+})();
+
+//Export for use in node
+if (typeof module === "object" && typeof require === "function") {
+    module.exports.require = require;
+    module.exports.define = define;
+}
+// file: lib/cordova.js
+define("cordova", function(require, exports, module) {
+var channel = require('cordova/channel');
+
+/**
+ * Listen for DOMContentLoaded and notify our channel subscribers.
+ */
+document.addEventListener('DOMContentLoaded', function() {
+    channel.onDOMContentLoaded.fire();
+}, false);
+if (document.readyState == 'complete' || document.readyState == 'interactive') {
+    channel.onDOMContentLoaded.fire();
+}
+
+/**
+ * Intercept calls to addEventListener + removeEventListener and handle deviceready,
+ * resume, and pause events.
+ */
+var m_document_addEventListener = document.addEventListener;
+var m_document_removeEventListener = document.removeEventListener;
+var m_window_addEventListener = window.addEventListener;
+var m_window_removeEventListener = window.removeEventListener;
+
+/**
+ * Houses custom event handlers to intercept on document + window event listeners.
+ */
+var documentEventHandlers = {},
+    windowEventHandlers = {};
+
+document.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof documentEventHandlers[e] != 'undefined') {
+        if (evt === 'deviceready') {
+            documentEventHandlers[e].subscribeOnce(handler);
+        } else {
+            documentEventHandlers[e].subscribe(handler);
+        }
+    } else {
+        m_document_addEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof windowEventHandlers[e] != 'undefined') {
+        windowEventHandlers[e].subscribe(handler);
+    } else {
+        m_window_addEventListener.call(window, evt, handler, capture);
+    }
+};
+
+document.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof documentEventHandlers[e] != "undefined") {
+        documentEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_document_removeEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof windowEventHandlers[e] != "undefined") {
+        windowEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_window_removeEventListener.call(window, evt, handler, capture);
+    }
+};
+
+function createEvent(type, data) {
+    var event = document.createEvent('Events');
+    event.initEvent(type, false, false);
+    if (data) {
+        for (var i in data) {
+            if (data.hasOwnProperty(i)) {
+                event[i] = data[i];
+            }
+        }
+    }
+    return event;
+}
+
+if(typeof window.console === "undefined") {
+    window.console = {
+        log:function(){}
+    };
+}
+
+var cordova = {
+    define:define,
+    require:require,
+    /**
+     * Methods to add/remove your own addEventListener hijacking on document + window.
+     */
+    addWindowEventHandler:function(event, opts) {
+        return (windowEventHandlers[event] = channel.create(event, opts));
+    },
+    addDocumentEventHandler:function(event, opts) {
+        return (documentEventHandlers[event] = channel.create(event, opts));
+    },
+    removeWindowEventHandler:function(event) {
+        delete windowEventHandlers[event];
+    },
+    removeDocumentEventHandler:function(event) {
+        delete documentEventHandlers[event];
+    },
+    /**
+     * Retreive original event handlers that were replaced by Cordova
+     *
+     * @return object
+     */
+    getOriginalHandlers: function() {
+        return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
+        'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
+    },
+    /**
+     * Method to fire event from native code
+     */
+    fireDocumentEvent: function(type, data) {
+        var evt = createEvent(type, data);
+        if (typeof documentEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                documentEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            document.dispatchEvent(evt);
+        }
+    },
+    fireWindowEvent: function(type, data) {
+        var evt = createEvent(type,data);
+        if (typeof windowEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                windowEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            window.dispatchEvent(evt);
+        }
+    },
+    // TODO: this is Android only; think about how to do this better
+    shuttingDown:false,
+    UsePolling:false,
+    // END TODO
+
+    // TODO: iOS only
+    // This queue holds the currently executing command and all pending
+    // commands executed with cordova.exec().
+    commandQueue:[],
+    // Indicates if we're currently in the middle of flushing the command
+    // queue on the native side.
+    commandQueueFlushing:false,
+    // END TODO
+    /**
+     * Plugin callback mechanism.
+     */
+    callbackId: 0,
+    callbacks:  {},
+    callbackStatus: {
+        NO_RESULT: 0,
+        OK: 1,
+        CLASS_NOT_FOUND_EXCEPTION: 2,
+        ILLEGAL_ACCESS_EXCEPTION: 3,
+        INSTANTIATION_EXCEPTION: 4,
+        MALFORMED_URL_EXCEPTION: 5,
+        IO_EXCEPTION: 6,
+        INVALID_ACTION: 7,
+        JSON_EXCEPTION: 8,
+        ERROR: 9
+    },
+
+    /**
+     * Called by native code when returning successful result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackSuccess: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+
+            // If result is to be sent to callback
+            if (args.status == cordova.callbackStatus.OK) {
+                try {
+                    if (cordova.callbacks[callbackId].success) {
+                        cordova.callbacks[callbackId].success(args.message);
+                    }
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+callbackId+" = "+e);
+                }
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+
+    /**
+     * Called by native code when returning error result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackError: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+            try {
+                if (cordova.callbacks[callbackId].fail) {
+                    cordova.callbacks[callbackId].fail(args.message);
+                }
+            }
+            catch (e) {
+                console.log("Error in error callback: "+callbackId+" = "+e);
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+    addConstructor: function(func) {
+        channel.onCordovaReady.subscribeOnce(function() {
+            try {
+                func();
+            } catch(e) {
+                console.log("Failed to run constructor: " + e);
+            }
+        });
+    }
+};
+
+// Register pause, resume and deviceready channels as events on document.
+channel.onPause = cordova.addDocumentEventHandler('pause');
+channel.onResume = cordova.addDocumentEventHandler('resume');
+channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
+
+module.exports = cordova;
+
+});
+
+// file: lib/common/builder.js
+define("cordova/builder", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+function each(objects, func, context) {
+    for (var prop in objects) {
+        if (objects.hasOwnProperty(prop)) {
+            func.apply(context, [objects[prop], prop]);
+        }
+    }
+}
+
+function include(parent, objects, clobber, merge) {
+    each(objects, function (obj, key) {
+        try {
+          var result = obj.path ? require(obj.path) : {};
+
+          if (clobber) {
+              // Clobber if it doesn't exist.
+              if (typeof parent[key] === 'undefined') {
+                  parent[key] = result;
+              } else if (typeof obj.path !== 'undefined') {
+                  // If merging, merge properties onto parent, otherwise, clobber.
+                  if (merge) {
+                      recursiveMerge(parent[key], result);
+                  } else {
+                      parent[key] = result;
+                  }
+              }
+              result = parent[key];
+          } else {
+            // Overwrite if not currently defined.
+            if (typeof parent[key] == 'undefined') {
+              parent[key] = result;
+            } else if (merge && typeof obj.path !== 'undefined') {
+              // If merging, merge parent onto result
+              recursiveMerge(result, parent[key]);
+              parent[key] = result;
+            } 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);
+          }
+        } catch(e) {
+          utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');
+        }
+    });
+}
+
+/**
+ * Merge properties from one object onto another recursively.  Properties from
+ * the src object will overwrite existing target property.
+ *
+ * @param target Object to merge properties into.
+ * @param src Object to merge properties from.
+ */
+function recursiveMerge(target, src) {
+    for (var prop in src) {
+        if (src.hasOwnProperty(prop)) {
+            if (typeof target.prototype !== 'undefined' && target.prototype.constructor === target) {
+                // If the target object is a constructor override off prototype.
+                target.prototype[prop] = src[prop];
+            } else {
+                target[prop] = typeof src[prop] === 'object' ? recursiveMerge(
+                        target[prop], src[prop]) : src[prop];
+            }
+        }
+    }
+    return target;
+}
+
+module.exports = {
+    build: function (objects) {
+        return {
+            intoButDontClobber: function (target) {
+                include(target, objects, false, false);
+            },
+            intoAndClobber: function(target) {
+                include(target, objects, true, false);
+            },
+            intoAndMerge: function(target) {
+                include(target, objects, true, true);
+            }
+        };
+    }
+};
+
+});
+
+// file: lib/common/channel.js
+define("cordova/channel", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+/**
+ * Custom pub-sub "channel" that can have functions subscribed to it
+ * This object is used to define and control firing of events for
+ * cordova initialization.
+ *
+ * The order of events during page load and Cordova startup is as follows:
+ *
+ * onDOMContentLoaded         Internal event that is received when the web page is loaded and parsed.
+ * onNativeReady              Internal event that indicates the Cordova native side is ready.
+ * onCordovaReady             Internal event fired when all Cordova JavaScript objects have been created.
+ * onCordovaInfoReady         Internal event fired when device properties are available.
+ * onCordovaConnectionReady   Internal event fired when the connection property has been set.
+ * onDeviceReady              User event fired to indicate that Cordova is ready
+ * onResume                   User event fired to indicate a start/resume lifecycle event
+ * onPause                    User event fired to indicate a pause lifecycle event
+ * onDestroy                  Internal event fired when app is being destroyed (User should use window.onunload event, not this one).
+ *
+ * The only Cordova events that user code should register for are:
+ *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
+ *      pause                 App has moved to background
+ *      resume                App has returned to foreground
+ *
+ * Listeners can be registered as:
+ *      document.addEventListener("deviceready", myDeviceReadyListener, false);
+ *      document.addEventListener("resume", myResumeListener, false);
+ *      document.addEventListener("pause", myPauseListener, false);
+ *
+ * The DOM lifecycle events should be used for saving and restoring state
+ *      window.onload
+ *      window.onunload
+ *
+ */
+
+/**
+ * Channel
+ * @constructor
+ * @param type  String the channel name
+ * @param opts  Object options to pass into the channel, currently
+ *                     supports:
+ *                     onSubscribe: callback that fires when
+ *                       something subscribes to the Channel. Sets
+ *                       context to the Channel.
+ *                     onUnsubscribe: callback that fires when
+ *                       something unsubscribes to the Channel. Sets
+ *                       context to the Channel.
+ */
+var Channel = function(type, opts) {
+    this.type = type;
+    this.handlers = {};
+    this.numHandlers = 0;
+    this.guid = 1;
+    this.fired = false;
+    this.enabled = true;
+    this.events = {
+        onSubscribe:null,
+        onUnsubscribe:null
+    };
+    if (opts) {
+        if (opts.onSubscribe) this.events.onSubscribe = opts.onSubscribe;
+        if (opts.onUnsubscribe) this.events.onUnsubscribe = opts.onUnsubscribe;
+    }
+},
+    channel = {
+        /**
+         * Calls the provided function only after all of the channels specified
+         * have been fired.
+         */
+        join: function (h, c) {
+            var i = c.length;
+            var len = i;
+            var f = function() {
+                if (!(--i)) h();
+            };
+            for (var j=0; j<len; j++) {
+                !c[j].fired?c[j].subscribeOnce(f):i--;
+            }
+            if (!i) h();
+        },
+        create: function (type, opts) {
+            channel[type] = new Channel(type, opts);
+            return channel[type];
+        },
+
+        /**
+         * cordova Channels that must fire before "deviceready" is fired.
+         */
+        deviceReadyChannelsArray: [],
+        deviceReadyChannelsMap: {},
+
+        /**
+         * Indicate that a feature needs to be initialized before it is ready to be used.
+         * This holds up Cordova's "deviceready" event until the feature has been initialized
+         * and Cordova.initComplete(feature) is called.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        waitForInitialization: function(feature) {
+            if (feature) {
+                var c = null;
+                if (this[feature]) {
+                    c = this[feature];
+                }
+                else {
+                    c = this.create(feature);
+                }
+                this.deviceReadyChannelsMap[feature] = c;
+                this.deviceReadyChannelsArray.push(c);
+            }
+        },
+
+        /**
+         * Indicate that initialization code has completed and the feature is ready to be used.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        initializationComplete: function(feature) {
+            var c = this.deviceReadyChannelsMap[feature];
+            if (c) {
+                c.fire();
+            }
+        }
+    };
+
+function forceFunction(f) {
+    if (f === null || f === undefined || typeof f != 'function') throw "Function required as first argument!";
+}
+
+/**
+ * Subscribes the given function to the channel. Any time that
+ * Channel.fire is called so too will the function.
+ * Optionally specify an execution context for the function
+ * and a guid that can be used to stop subscribing to the channel.
+ * Returns the guid.
+ */
+Channel.prototype.subscribe = function(f, c, g) {
+    // need a function to call
+    forceFunction(f);
+
+    var func = f;
+    if (typeof c == "object") { func = utils.close(c, f); }
+
+    g = g || func.observer_guid || f.observer_guid;
+    if (!g) {
+        // first time we've seen this subscriber
+        g = this.guid++;
+    }
+    else {
+        // subscriber already handled; dont set it twice
+        return g;
+    }
+    func.observer_guid = g;
+    f.observer_guid = g;
+    this.handlers[g] = func;
+    this.numHandlers++;
+    if (this.events.onSubscribe) this.events.onSubscribe.call(this);
+    if (this.fired) func.call(this);
+    return g;
+};
+
+/**
+ * Like subscribe but the function is only called once and then it
+ * auto-unsubscribes itself.
+ */
+Channel.prototype.subscribeOnce = function(f, c) {
+    // need a function to call
+    forceFunction(f);
+
+    var g = null;
+    var _this = this;
+    var m = function() {
+        f.apply(c || null, arguments);
+        _this.unsubscribe(g);
+    };
+    if (this.fired) {
+        if (typeof c == "object") { f = utils.close(c, f); }
+        f.apply(this, this.fireArgs);
+    } else {
+        g = this.subscribe(m);
+    }
+    return g;
+};
+
+/**
+ * Unsubscribes the function with the given guid from the channel.
+ */
+Channel.prototype.unsubscribe = function(g) {
+    // need a function to unsubscribe
+    if (g === null || g === undefined) { throw "You must pass _something_ into Channel.unsubscribe"; }
+
+    if (typeof g == 'function') { g = g.observer_guid; }
+    var handler = this.handlers[g];
+    if (handler) {
+        if (handler.observer_guid) handler.observer_guid=null;
+        this.handlers[g] = null;
+        delete this.handlers[g];
+        this.numHandlers--;
+        if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
+    }
+};
+
+/**
+ * Calls all functions subscribed to this channel.
+ */
+Channel.prototype.fire = function(e) {
+    if (this.enabled) {
+        var fail = false;
+        this.fired = true;
+        for (var item in this.handlers) {
+            var handler = this.handlers[item];
+            if (typeof handler == 'function') {
+                var rv = (handler.apply(this, arguments)===false);
+                fail = fail || rv;
+            }
+        }
+        this.fireArgs = arguments;
+        return !fail;
+    }
+    return true;
+};
+
+// defining them here so they are ready super fast!
+// DOM event that is received when the web page is loaded and parsed.
+channel.create('onDOMContentLoaded');
+
+// Event to indicate the Cordova native side is ready.
+channel.create('onNativeReady');
+
+// Event to indicate that all Cordova JavaScript objects have been created
+// and it's time to run plugin constructors.
+channel.create('onCordovaReady');
+
+// Event to indicate that device properties are available
+channel.create('onCordovaInfoReady');
+
+// Event to indicate that the connection property has been set.
+channel.create('onCordovaConnectionReady');
+
+// Event to indicate that Cordova is ready
+channel.create('onDeviceReady');
+
+// Event to indicate a resume lifecycle event
+channel.create('onResume');
+
+// Event to indicate a pause lifecycle event
+channel.create('onPause');
+
+// Event to indicate a destroy lifecycle event
+channel.create('onDestroy');
+
+// Channels that must fire before "deviceready" is fired.
+channel.waitForInitialization('onCordovaReady');
+channel.waitForInitialization('onCordovaConnectionReady');
+
+module.exports = channel;
+
+});
+
+// file: lib/common/common.js
+define("cordova/common", function(require, exports, module) {
+module.exports = {
+    objects: {
+        cordova: {
+            path: 'cordova',
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                },
+                logger: {
+                    path: 'cordova/plugin/logger'
+                }
+            }
+        },
+        Cordova: {
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        PhoneGap:{
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        navigator: {
+            children: {
+                notification: {
+                    path: 'cordova/plugin/notification'
+                },
+                accelerometer: {
+                    path: 'cordova/plugin/accelerometer'
+                },
+                battery: {
+                    path: 'cordova/plugin/battery'
+                },
+                camera:{
+                    path: 'cordova/plugin/Camera'
+                },
+                compass:{
+                    path: 'cordova/plugin/compass'
+                },
+                contacts: {
+                    path: 'cordova/plugin/contacts'
+                },
+                device:{
+                    children:{
+                        capture: {
+                            path: 'cordova/plugin/capture'
+                        }
+                    }
+                },
+                geolocation: {
+                    path: 'cordova/plugin/geolocation'
+                },
+                network: {
+                    children: {
+                        connection: {
+                            path: 'cordova/plugin/network'
+                        }
+                    }
+                },
+                splashscreen: {
+                    path: 'cordova/plugin/splashscreen'
+                }
+            }
+        },
+        Acceleration: {
+            path: 'cordova/plugin/Acceleration'
+        },
+        Camera:{
+            path: 'cordova/plugin/CameraConstants'
+        },
+        CameraPopoverOptions: {
+            path: 'cordova/plugin/CameraPopoverOptions'
+        },
+        CaptureError: {
+            path: 'cordova/plugin/CaptureError'
+        },
+        CaptureAudioOptions:{
+            path: 'cordova/plugin/CaptureAudioOptions'
+        },
+        CaptureImageOptions: {
+            path: 'cordova/plugin/CaptureImageOptions'
+        },
+        CaptureVideoOptions: {
+            path: 'cordova/plugin/CaptureVideoOptions'
+        },
+        CompassHeading:{
+            path: 'cordova/plugin/CompassHeading'
+        },
+        CompassError:{
+            path: 'cordova/plugin/CompassError'
+        },
+        ConfigurationData: {
+            path: 'cordova/plugin/ConfigurationData'
+        },
+        Connection: {
+            path: 'cordova/plugin/Connection'
+        },
+        Contact: {
+            path: 'cordova/plugin/Contact'
+        },
+        ContactAddress: {
+            path: 'cordova/plugin/ContactAddress'
+        },
+        ContactError: {
+            path: 'cordova/plugin/ContactError'
+        },
+        ContactField: {
+            path: 'cordova/plugin/ContactField'
+        },
+        ContactFindOptions: {
+            path: 'cordova/plugin/ContactFindOptions'
+        },
+        ContactName: {
+            path: 'cordova/plugin/ContactName'
+        },
+        ContactOrganization: {
+            path: 'cordova/plugin/ContactOrganization'
+        },
+        Coordinates: {
+            path: 'cordova/plugin/Coordinates'
+        },
+        device: {
+            path: 'cordova/plugin/device'
+        },
+        DirectoryEntry: {
+            path: 'cordova/plugin/DirectoryEntry'
+        },
+        DirectoryReader: {
+            path: 'cordova/plugin/DirectoryReader'
+        },
+        Entry: {
+            path: 'cordova/plugin/Entry'
+        },
+        File: {
+            path: 'cordova/plugin/File'
+        },
+        FileEntry: {
+            path: 'cordova/plugin/FileEntry'
+        },
+        FileError: {
+            path: 'cordova/plugin/FileError'
+        },
+        FileReader: {
+            path: 'cordova/plugin/FileReader'
+        },
+        FileSystem: {
+            path: 'cordova/plugin/FileSystem'
+        },
+        FileTransfer: {
+            path: 'cordova/plugin/FileTransfer'
+        },
+        FileTransferError: {
+            path: 'cordova/plugin/FileTransferError'
+        },
+        FileUploadOptions: {
+            path: 'cordova/plugin/FileUploadOptions'
+        },
+        FileUploadResult: {
+            path: 'cordova/plugin/FileUploadResult'
+        },
+        FileWriter: {
+            path: 'cordova/plugin/FileWriter'
+        },
+        Flags: {
+            path: 'cordova/plugin/Flags'
+        },
+        LocalFileSystem: {
+            path: 'cordova/plugin/LocalFileSystem'
+        },
+        Media: {
+            path: 'cordova/plugin/Media'
+        },
+        MediaError: {
+            path: 'cordova/plugin/MediaError'
+        },
+        MediaFile: {
+            path: 'cordova/plugin/MediaFile'
+        },
+        MediaFileData:{
+            path: 'cordova/plugin/MediaFileData'
+        },
+        Metadata:{
+            path: 'cordova/plugin/Metadata'
+        },
+        Position: {
+            path: 'cordova/plugin/Position'
+        },
+        PositionError: {
+            path: 'cordova/plugin/PositionError'
+        },
+        ProgressEvent: {
+            path: 'cordova/plugin/ProgressEvent'
+        },
+        requestFileSystem:{
+            path: 'cordova/plugin/requestFileSystem'
+        },
+        resolveLocalFileSystemURI:{
+            path: 'cordova/plugin/resolveLocalFileSystemURI'
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/exec.js
+define("cordova/exec", function(require, exports, module) {
+/**
+ * Execute a cordova command.  It is up to the native side whether this action
+ * is synchronous or asynchronous.  The native side can return:
+ *      Synchronous: PluginResult object as a JSON string
+ *      Asynchrounous: Empty string ""
+ * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
+ * depending upon the result of the action.
+ *
+ * @param {Function} successCB  The success callback
+ * @param {Function} failCB     The fail callback
+ * @param {String} service      The name of the service to use
+ * @param {String} action       Action to be run in cordova
+ * @param {String[]} [args]     Zero or more arguments to pass to the method
+ */
+
+var tizen = require('cordova/plugin/tizen/manager'),
+    cordova = require('cordova'),
+    utils = require('cordova/utils');
+
+module.exports = function(successCB, failCB, service, action, args) {
+
+    try {
+        var v = tizen.exec(successCB, failCB, service, action, args);
+
+        // If status is OK, then return value back to caller
+        if (v.status == cordova.callbackStatus.OK) {
+
+            // If there is a success callback, then call it now with returned value
+            if (successCB) {
+                try {
+                    successCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+ service + "." + action + " = " + e);
+                }
+
+            }
+            return v.message;
+        } else if (v.status == cordova.callbackStatus.NO_RESULT) {
+            // Nothing to do here
+        } else {
+            // If error, then display error
+            console.log("Error: " + service + "." + action + " Status=" + v.status + " Message=" + v.message);
+
+            // If there is a fail callback, then call it now with returned value
+            if (failCB) {
+                try {
+                    failCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in error callback: " + service + "." + action + " = "+e);
+                }
+            }
+            return null;
+        }
+    } catch (e) {
+        utils.alert("Error: " + e);
+    }
+};
+
+});
+
+// file: lib/tizen/platform.js
+define("cordova/platform", function(require, exports, module) {
+module.exports = {
+    id: "tizen",
+    initialize: function() {},
+    objects: {
+        device: {
+            path: "cordova/plugin/tizen/Device"
+        },
+        File: { // exists natively, override
+            path: "cordova/plugin/File"
+        },
+        FileReader: { // exists natively, override
+            path: "cordova/plugin/FileReader"
+        },
+        FileError: { //exists natively, override
+            path: "cordova/plugin/FileError"
+        }
+    },
+    merges: {
+        MediaError: { // exists natively
+            path: "cordova/plugin/tizen/MediaError"
+        },
+        navigator: {
+            children: {
+                device: {
+                    path: "cordova/plugin/tizen/Device"
+                },
+                contacts: {
+                    path: "cordova/plugin/tizen/contacts"
+                },
+               notification: {
+                   path: "cordova/plugin/tizen/Notification"
+               }
+            }
+        },
+        Contact: {
+            path: "cordova/plugin/tizen/Contact"
+        }
+    }
+};
+
+});
+
+// file: lib/common/plugin/Acceleration.js
+define("cordova/plugin/Acceleration", function(require, exports, module) {
+var Acceleration = function(x, y, z, timestamp) {
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.timestamp = timestamp || (new Date()).getTime();
+};
+
+module.exports = Acceleration;
+
+});
+
+// file: lib/common/plugin/Camera.js
+define("cordova/plugin/Camera", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    Camera = require('cordova/plugin/CameraConstants');
+
+var cameraExport = {};
+
+// Tack on the Camera Constants to the base camera plugin.
+for (var key in Camera) {
+    cameraExport[key] = Camera[key];
+}
+
+/**
+ * Gets a picture from source defined by "options.sourceType", and returns the
+ * image as defined by the "options.destinationType" option.
+
+ * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
+ *
+ * @param {Function} successCallback
+ * @param {Function} errorCallback
+ * @param {Object} options
+ */
+cameraExport.getPicture = function(successCallback, errorCallback, options) {
+    // successCallback required
+    if (typeof successCallback != "function") {
+        console.log("Camera Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback != "function")) {
+        console.log("Camera Error: errorCallback is not a function");
+        return;
+    }
+
+    var quality = 50;
+    if (options && typeof options.quality == "number") {
+        quality = options.quality;
+    } else if (options && typeof options.quality == "string") {
+        var qlity = parseInt(options.quality, 10);
+        if (isNaN(qlity) === false) {
+            quality = qlity.valueOf();
+        }
+    }
+
+    var destinationType = Camera.DestinationType.FILE_URI;
+    if (typeof options.destinationType == "number") {
+        destinationType = options.destinationType;
+    }
+
+    var sourceType = Camera.PictureSourceType.CAMERA;
+    if (typeof options.sourceType == "number") {
+        sourceType = options.sourceType;
+    }
+
+    var targetWidth = -1;
+    if (typeof options.targetWidth == "number") {
+        targetWidth = options.targetWidth;
+    } else if (typeof options.targetWidth == "string") {
+        var width = parseInt(options.targetWidth, 10);
+        if (isNaN(width) === false) {
+            targetWidth = width.valueOf();
+        }
+    }
+
+    var targetHeight = -1;
+    if (typeof options.targetHeight == "number") {
+        targetHeight = options.targetHeight;
+    } else if (typeof options.targetHeight == "string") {
+        var height = parseInt(options.targetHeight, 10);
+        if (isNaN(height) === false) {
+            targetHeight = height.valueOf();
+        }
+    }
+
+    var encodingType = Camera.EncodingType.JPEG;
+    if (typeof options.encodingType == "number") {
+        encodingType = options.encodingType;
+    }
+
+    var mediaType = Camera.MediaType.PICTURE;
+    if (typeof options.mediaType == "number") {
+        mediaType = options.mediaType;
+    }
+    var allowEdit = false;
+    if (typeof options.allowEdit == "boolean") {
+        allowEdit = options.allowEdit;
+    } else if (typeof options.allowEdit == "number") {
+        allowEdit = options.allowEdit <= 0 ? false : true;
+    }
+    var correctOrientation = false;
+    if (typeof options.correctOrientation == "boolean") {
+        correctOrientation = options.correctOrientation;
+    } else if (typeof options.correctOrientation == "number") {
+        correctOrientation = options.correctOrientation <=0 ? false : true;
+    }
+    var saveToPhotoAlbum = false;
+    if (typeof options.saveToPhotoAlbum == "boolean") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum;
+    } else if (typeof options.saveToPhotoAlbum == "number") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum <=0 ? false : true;
+    }
+    var popoverOptions = null;
+    if (typeof options.popoverOptions == "object") {
+        popoverOptions = options.popoverOptions;
+    }
+
+    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
+
+    exec(successCallback, errorCallback, "Camera", "takePicture", args);
+};
+
+cameraExport.cleanup = function(successCallback, errorCallback) {
+    exec(successCallback, errorCallback, "Camera", "cleanup", []);
+};
+
+module.exports = cameraExport;
+});
+
+// file: lib/common/plugin/CameraConstants.js
+define("cordova/plugin/CameraConstants", function(require, exports, module) {
+module.exports = {
+  DestinationType:{
+    DATA_URL: 0,         // Return base64 encoded string
+    FILE_URI: 1          // Return file uri (content://media/external/images/media/2 for Android)
+  },
+  EncodingType:{
+    JPEG: 0,             // Return JPEG encoded image
+    PNG: 1               // Return PNG encoded image
+  },
+  MediaType:{
+    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
+    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
+    ALLMEDIA : 2         // allow selection from all media types
+  },
+  PictureSourceType:{
+    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
+    CAMERA : 1,          // Take picture from camera
+    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
+  },
+  PopoverArrowDirection:{
+      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
+      ARROW_DOWN : 2,
+      ARROW_LEFT : 4,
+      ARROW_RIGHT : 8,
+      ARROW_ANY : 15
+  }
+};
+});
+
+// file: lib/common/plugin/CameraPopoverOptions.js
+define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
+var Camera = require('cordova/plugin/CameraConstants');
+
+/**
+ * Encapsulates options for iOS Popover image picker
+ */
+var CameraPopoverOptions = function(x,y,width,height,arrowDir){
+    // information of rectangle that popover should be anchored to
+    this.x = x || 0;
+    this.y = y || 32;
+    this.width = width || 320;
+    this.height = height || 480;
+    // The direction of the popover arrow
+    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
+};
+
+module.exports = CameraPopoverOptions;
+});
+
+// file: lib/common/plugin/CaptureAudioOptions.js
+define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
+/**
+ * Encapsulates all audio capture operation configuration options.
+ */
+var CaptureAudioOptions = function(){
+    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single sound clip in seconds.
+    this.duration = 0;
+    // The selected audio mode. Must match with one of the elements in supportedAudioModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureAudioOptions;
+});
+
+// file: lib/common/plugin/CaptureError.js
+define("cordova/plugin/CaptureError", function(require, exports, module) {
+/**
+ * The CaptureError interface encapsulates all errors in the Capture API.
+ */
+var CaptureError = function(c) {
+   this.code = c || null;
+};
+
+// Camera or microphone failed to capture image or sound.
+CaptureError.CAPTURE_INTERNAL_ERR = 0;
+// Camera application or audio capture application is currently serving other capture request.
+CaptureError.CAPTURE_APPLICATION_BUSY = 1;
+// Invalid use of the API (e.g. limit parameter has value less than one).
+CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
+// User exited camera application or audio capture application before capturing anything.
+CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
+// The requested capture operation is not supported.
+CaptureError.CAPTURE_NOT_SUPPORTED = 20;
+
+module.exports = CaptureError;
+});
+
+// file: lib/common/plugin/CaptureImageOptions.js
+define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
+/**
+ * Encapsulates all image capture operation configuration options.
+ */
+var CaptureImageOptions = function(){
+    // Upper limit of images user can take. Value must be equal or greater than 1.
+    this.limit = 1;
+    // The selected image mode. Must match with one of the elements in supportedImageModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureImageOptions;
+});
+
+// file: lib/common/plugin/CaptureVideoOptions.js
+define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
+/**
+ * Encapsulates all video capture operation configuration options.
+ */
+var CaptureVideoOptions = function(){
+    // Upper limit of videos user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single video clip in seconds.
+    this.duration = 0;
+    // The selected video mode. Must match with one of the elements in supportedVideoModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureVideoOptions;
+});
+
+// file: lib/common/plugin/CompassError.js
+define("cordova/plugin/CompassError", function(require, exports, module) {
+/**
+ *  CompassError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var CompassError = function(err) {
+    this.code = (err !== undefined ? err : null);
+};
+
+CompassError.COMPASS_INTERNAL_ERR = 0;
+CompassError.COMPASS_NOT_SUPPORTED = 20;
+
+module.exports = CompassError;
+});
+
+// file: lib/common/plugin/CompassHeading.js
+define("cordova/plugin/CompassHeading", function(require, exports, module) {
+var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
+  this.magneticHeading = (magneticHeading !== undefined ? magneticHeading : null);
+  this.trueHeading = (trueHeading !== undefined ? trueHeading : null);
+  this.headingAccuracy = (headingAccuracy !== undefined ? headingAccuracy : null);
+  this.timestamp = (timestamp !== undefined ? timestamp : new Date().getTime());
+};
+
+module.exports = CompassHeading;
+});
+
+// file: lib/common/plugin/ConfigurationData.js
+define("cordova/plugin/ConfigurationData", function(require, exports, module) {
+/**
+ * Encapsulates a set of parameters that the capture device supports.
+ */
+function ConfigurationData() {
+    // The ASCII-encoded string in lower case representing the media type.
+    this.type = null;
+    // The height attribute represents height of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0.
+    this.height = 0;
+    // The width attribute represents width of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0
+    this.width = 0;
+}
+
+module.exports = ConfigurationData;
+});
+
+// file: lib/common/plugin/Connection.js
+define("cordova/plugin/Connection", function(require, exports, module) {
+/**
+ * Network status
+ */
+module.exports = {
+        UNKNOWN: "unknown",
+        ETHERNET: "ethernet",
+        WIFI: "wifi",
+        CELL_2G: "2g",
+        CELL_3G: "3g",
+        CELL_4G: "4g",
+        NONE: "none"
+};
+});
+
+// file: lib/common/plugin/Contact.js
+define("cordova/plugin/Contact", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils');
+
+/**
+* Converts primitives into Complex Object
+* Currently only used for Date fields
+*/
+function convertIn(contact) {
+    var value = contact.birthday;
+    try {
+      contact.birthday = new Date(parseFloat(value));
+    } catch (exception){
+      console.log("Cordova Contact convertIn error: exception creating date.");
+    }
+    return contact;
+}
+
+/**
+* Converts Complex objects into primitives
+* Only conversion at present is for Dates.
+**/
+
+function convertOut(contact) {
+    var value = contact.birthday;
+    if (value !== null) {
+        // try to make it a Date object if it is not already
+        if (!utils.isDate(value)){
+            try {
+                value = new Date(value);
+            } catch(exception){
+                value = null;
+            }
+        }
+        if (utils.isDate(value)){
+            value = value.valueOf(); // convert to milliseconds
+        }
+        contact.birthday = value;
+    }
+    return contact;
+}
+
+/**
+* Contains information about a single contact.
+* @constructor
+* @param {DOMString} id unique identifier
+* @param {DOMString} displayName
+* @param {ContactName} name
+* @param {DOMString} nickname
+* @param {Array.<ContactField>} phoneNumbers array of phone numbers
+* @param {Array.<ContactField>} emails array of email addresses
+* @param {Array.<ContactAddress>} addresses array of addresses
+* @param {Array.<ContactField>} ims instant messaging user ids
+* @param {Array.<ContactOrganization>} organizations
+* @param {DOMString} birthday contact's birthday
+* @param {DOMString} note user notes about contact
+* @param {Array.<ContactField>} photos
+* @param {Array.<ContactField>} categories
+* @param {Array.<ContactField>} urls contact's web sites
+*/
+var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
+    ims, organizations, birthday, note, photos, categories, urls) {
+    this.id = id || null;
+    this.rawId = null;
+    this.displayName = displayName || null;
+    this.name = name || null; // ContactName
+    this.nickname = nickname || null;
+    this.phoneNumbers = phoneNumbers || null; // ContactField[]
+    this.emails = emails || null; // ContactField[]
+    this.addresses = addresses || null; // ContactAddress[]
+    this.ims = ims || null; // ContactField[]
+    this.organizations = organizations || null; // ContactOrganization[]
+    this.birthday = birthday || null;
+    this.note = note || null;
+    this.photos = photos || null; // ContactField[]
+    this.categories = categories || null; // ContactField[]
+    this.urls = urls || null; // ContactField[]
+};
+
+/**
+* Removes contact from device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.remove = function(successCB, errorCB) {
+    var fail = function(code) {
+        errorCB(new ContactError(code));
+    };
+    if (this.id === null) {
+        fail(ContactError.UNKNOWN_ERROR);
+    }
+    else {
+        exec(successCB, fail, "Contacts", "remove", [this.id]);
+    }
+};
+
+/**
+* Creates a deep copy of this Contact.
+* With the contact ID set to null.
+* @return copy of this Contact
+*/
+Contact.prototype.clone = function() {
+    var clonedContact = utils.clone(this);
+    var i;
+    clonedContact.id = null;
+    clonedContact.rawId = null;
+    // Loop through and clear out any id's in phones, emails, etc.
+    if (clonedContact.phoneNumbers) {
+        for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
+            clonedContact.phoneNumbers[i].id = null;
+        }
+    }
+    if (clonedContact.emails) {
+        for (i = 0; i < clonedContact.emails.length; i++) {
+            clonedContact.emails[i].id = null;
+        }
+    }
+    if (clonedContact.addresses) {
+        for (i = 0; i < clonedContact.addresses.length; i++) {
+            clonedContact.addresses[i].id = null;
+        }
+    }
+    if (clonedContact.ims) {
+        for (i = 0; i < clonedContact.ims.length; i++) {
+            clonedContact.ims[i].id = null;
+        }
+    }
+    if (clonedContact.organizations) {
+        for (i = 0; i < clonedContact.organizations.length; i++) {
+            clonedContact.organizations[i].id = null;
+        }
+    }
+    if (clonedContact.categories) {
+        for (i = 0; i < clonedContact.categories.length; i++) {
+            clonedContact.categories[i].id = null;
+        }
+    }
+    if (clonedContact.photos) {
+        for (i = 0; i < clonedContact.photos.length; i++) {
+            clonedContact.photos[i].id = null;
+        }
+    }
+    if (clonedContact.urls) {
+        for (i = 0; i < clonedContact.urls.length; i++) {
+            clonedContact.urls[i].id = null;
+        }
+    }
+    return clonedContact;
+};
+
+/**
+* Persists contact to device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.save = function(successCB, errorCB) {
+  var fail = function(code) {
+      errorCB(new ContactError(code));
+  };
+    var success = function(result) {
+      if (result) {
+          if (typeof successCB === 'function') {
+              var fullContact = require('cordova/plugin/contacts').create(result);
+              successCB(convertIn(fullContact));
+          }
+      }
+      else {
+          // no Entry object returned
+          fail(ContactError.UNKNOWN_ERROR);
+      }
+  };
+    var dupContact = convertOut(utils.clone(this));
+    exec(success, fail, "Contacts", "save", [dupContact]);
+};
+
+
+module.exports = Contact;
+
+});
+
+// file: lib/common/plugin/ContactAddress.js
+define("cordova/plugin/ContactAddress", function(require, exports, module) {
+/**
+* Contact address.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code
+* @param formatted // NOTE: not a W3C standard
+* @param streetAddress
+* @param locality
+* @param region
+* @param postalCode
+* @param country
+*/
+
+var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.formatted = formatted || null;
+    this.streetAddress = streetAddress || null;
+    this.locality = locality || null;
+    this.region = region || null;
+    this.postalCode = postalCode || null;
+    this.country = country || null;
+};
+
+module.exports = ContactAddress;
+});
+
+// file: lib/common/plugin/ContactError.js
+define("cordova/plugin/ContactError", function(require, exports, module) {
+/**
+ *  ContactError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var ContactError = function(err) {
+    this.code = (typeof err != 'undefined' ? err : null);
+};
+
+/**
+ * Error codes
+ */
+ContactError.UNKNOWN_ERROR = 0;
+ContactError.INVALID_ARGUMENT_ERROR = 1;
+ContactError.TIMEOUT_ERROR = 2;
+ContactError.PENDING_OPERATION_ERROR = 3;
+ContactError.IO_ERROR = 4;
+ContactError.NOT_SUPPORTED_ERROR = 5;
+ContactError.PERMISSION_DENIED_ERROR = 20;
+
+module.exports = ContactError;
+});
+
+// file: lib/common/plugin/ContactField.js
+define("cordova/plugin/ContactField", function(require, exports, module) {
+/**
+* Generic contact field.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param type
+* @param value
+* @param pref
+*/
+var ContactField = function(type, value, pref) {
+    this.id = null;
+    this.type = (type && type.toString()) || null;
+    this.value = (value && value.toString()) || null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+};
+
+module.exports = ContactField;
+});
+
+// file: lib/common/plugin/ContactFindOptions.js
+define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
+/**
+ * ContactFindOptions.
+ * @constructor
+ * @param filter used to match contacts against
+ * @param multiple boolean used to determine if more than one contact should be returned
+ */
+
+var ContactFindOptions = function(filter, multiple) {
+    this.filter = filter || '';
+    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
+};
+
+module.exports = ContactFindOptions;
+});
+
+// file: lib/common/plugin/ContactName.js
+define("cordova/plugin/ContactName", function(require, exports, module) {
+/**
+* Contact name.
+* @constructor
+* @param formatted // NOTE: not part of W3C standard
+* @param familyName
+* @param givenName
+* @param middle
+* @param prefix
+* @param suffix
+*/
+var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
+    this.formatted = formatted || null;
+    this.familyName = familyName || null;
+    this.givenName = givenName || null;
+    this.middleName = middle || null;
+    this.honorificPrefix = prefix || null;
+    this.honorificSuffix = suffix || null;
+};
+
+module.exports = ContactName;
+});
+
+// file: lib/common/plugin/ContactOrganization.js
+define("cordova/plugin/ContactOrganization", function(require, exports, module) {
+/**
+* Contact organization.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param name
+* @param dept
+* @param title
+* @param startDate
+* @param endDate
+* @param location
+* @param desc
+*/
+
+var ContactOrganization = function(pref, type, name, dept, title) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.name = name || null;
+    this.department = dept || null;
+    this.title = title || null;
+};
+
+module.exports = ContactOrganization;
+});
+
+// file: lib/common/plugin/Coordinates.js
+define("cordova/plugin/Coordinates", function(require, exports, module) {
+/**
+ * This class contains position information.
+ * @param {Object} lat
+ * @param {Object} lng
+ * @param {Object} alt
+ * @param {Object} acc
+ * @param {Object} head
+ * @param {Object} vel
+ * @param {Object} altacc
+ * @constructor
+ */
+var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
+    /**
+     * The latitude of the position.
+     */
+    this.latitude = lat;
+    /**
+     * The longitude of the position,
+     */
+    this.longitude = lng;
+    /**
+     * The accuracy of the position.
+     */
+    this.accuracy = acc;
+    /**
+     * The altitude of the position.
+     */
+    this.altitude = (alt !== undefined ? alt : null);
+    /**
+     * The direction the device is moving at the position.
+     */
+    this.heading = (head !== undefined ? head : null);
+    /**
+     * The velocity with which the device is moving at the position.
+     */
+    this.speed = (vel !== undefined ? vel : null);
+
+    if (this.speed === 0 || this.speed === null) {
+        this.heading = NaN;
+    }
+
+    /**
+     * The altitude accuracy of the position.
+     */
+    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
+};
+
+module.exports = Coordinates;
+
+});
+
+// file: lib/common/plugin/DirectoryEntry.js
+define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileError = require('cordova/plugin/FileError'),
+    DirectoryReader = require('cordova/plugin/DirectoryReader');
+
+/**
+ * An interface representing a directory on the file system.
+ *
+ * {boolean} isFile always false (readonly)
+ * {boolean} isDirectory always true (readonly)
+ * {DOMString} name of the directory, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the directory (readonly)
+ * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
+ */
+var DirectoryEntry = function(name, fullPath) {
+     DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
+};
+
+utils.extend(DirectoryEntry, Entry);
+
+/**
+ * Creates a new DirectoryReader to read entries from this directory
+ */
+DirectoryEntry.prototype.createReader = function() {
+    return new DirectoryReader(this.fullPath);
+};
+
+/**
+ * Creates or looks up a directory
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
+ * @param {Flags} options to create or excluively create the directory
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
+};
+
+/**
+ * Deletes a directory and all of it's contents
+ *
+ * @param {Function} successCallback is called with no parameters
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
+};
+
+/**
+ * Creates or looks up a file
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
+ * @param {Flags} options to create or excluively create the file
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var FileEntry = require('cordova/plugin/FileEntry');
+        var entry = new FileEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
+};
+
+module.exports = DirectoryEntry;
+
+});
+
+// file: lib/common/plugin/DirectoryReader.js
+define("cordova/plugin/DirectoryReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError') ;
+
+/**
+ * An interface that lists the files and directories in a directory.
+ */
+function DirectoryReader(path) {
+    this.path = path || null;
+}
+
+/**
+ * Returns a list of entries from a directory.
+ *
+ * @param {Function} successCallback is called with a list of entries
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var retVal = [];
+        for (var i=0; i<result.length; i++) {
+            var entry = null;
+            if (result[i].isDirectory) {
+                entry = new (require('cordova/plugin/DirectoryEntry'))();
+            }
+            else if (result[i].isFile) {
+                entry = new (require('cordova/plugin/FileEntry'))();
+            }
+            entry.isDirectory = result[i].isDirectory;
+            entry.isFile = result[i].isFile;
+            entry.name = result[i].name;
+            entry.fullPath = result[i].fullPath;
+            retVal.push(entry);
+        }
+        successCallback(retVal);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "readEntries", [this.path]);
+};
+
+module.exports = DirectoryReader;
+
+});
+
+// file: lib/common/plugin/Entry.js
+define("cordova/plugin/Entry", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    Metadata = require('cordova/plugin/Metadata');
+
+/**
+ * Represents a file or directory on the local file system.
+ *
+ * @param isFile
+ *            {boolean} true if Entry is a file (readonly)
+ * @param isDirectory
+ *            {boolean} true if Entry is a directory (readonly)
+ * @param name
+ *            {DOMString} name of the file or directory, excluding the path
+ *            leading to it (readonly)
+ * @param fullPath
+ *            {DOMString} the absolute full path to the file or directory
+ *            (readonly)
+ */
+function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
+    this.isFile = (typeof isFile != 'undefined'?isFile:false);
+    this.isDirectory = (typeof isDirectory != 'undefined'?isDirectory:false);
+    this.name = name || '';
+    this.fullPath = fullPath || '';
+    this.filesystem = fileSystem || null;
+}
+
+/**
+ * Look up the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ */
+Entry.prototype.getMetadata = function(successCallback, errorCallback) {
+  var success = typeof successCallback !== 'function' ? null : function(lastModified) {
+      var metadata = new Metadata(lastModified);
+      successCallback(metadata);
+  };
+  var fail = typeof errorCallback !== 'function' ? null : function(code) {
+      errorCallback(new FileError(code));
+  };
+
+  exec(success, fail, "File", "getMetadata", [this.fullPath]);
+};
+
+/**
+ * Set the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ * @param metadataObject
+ *            {Object} keys and values to set
+ */
+Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
+
+  exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
+};
+
+/**
+ * Move a file or directory to a new location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to move this entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new DirectoryEntry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+    // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Copy a directory to a different location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to copy the entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new Entry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+
+        // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        // success callback
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Return a URL that can be used to identify this entry.
+ */
+Entry.prototype.toURL = function() {
+    // fullPath attribute contains the full URL
+    return this.fullPath;
+};
+
+/**
+ * Returns a URI that can be used to identify this entry.
+ *
+ * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
+ * @return uri
+ */
+Entry.prototype.toURI = function(mimeType) {
+    console.log("DEPRECATED: Update your code to use 'toURL'");
+    // fullPath attribute contains the full URI
+    return this.toURL();
+};
+
+/**
+ * Remove a file or directory. It is an error to attempt to delete a
+ * directory that is not empty. It is an error to attempt to delete a
+ * root directory of a file system.
+ *
+ * @param successCallback {Function} called with no parameters
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.remove = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "remove", [this.fullPath]);
+};
+
+/**
+ * Look up the parent DirectoryEntry of this entry.
+ *
+ * @param successCallback {Function} called with the parent DirectoryEntry object
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.getParent = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getParent", [this.fullPath]);
+};
+
+module.exports = Entry;
+});
+
+// file: lib/common/plugin/File.js
+define("cordova/plugin/File", function(require, exports, module) {
+/**
+ * Constructor.
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+
+var File = function(name, fullPath, type, lastModifiedDate, size){
+    this.name = name || '';
+    this.fullPath = fullPath || null;
+    this.type = type || null;
+    this.lastModifiedDate = lastModifiedDate || null;
+    this.size = size || 0;
+};
+
+module.exports = File;
+});
+
+// file: lib/common/plugin/FileEntry.js
+define("cordova/plugin/FileEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileWriter = require('cordova/plugin/FileWriter'),
+    File = require('cordova/plugin/File'),
+    FileError = require('cordova/plugin/FileError');
+
+/**
+ * An interface representing a file on the file system.
+ *
+ * {boolean} isFile always true (readonly)
+ * {boolean} isDirectory always false (readonly)
+ * {DOMString} name of the file, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the file (readonly)
+ * {FileSystem} filesystem on which the file resides (readonly)
+ */
+var FileEntry = function(name, fullPath) {
+     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
+};
+
+utils.extend(FileEntry, Entry);
+
+/**
+ * Creates a new FileWriter associated with the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new FileWriter
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
+    this.file(function(filePointer) {
+        var writer = new FileWriter(filePointer);
+
+        if (writer.fileName === null || writer.fileName === "") {
+            if (typeof errorCallback === "function") {
+                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
+            }
+        } else {
+            if (typeof successCallback === "function") {
+                successCallback(writer);
+            }
+        }
+    }, errorCallback);
+};
+
+/**
+ * Returns a File that represents the current state of the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new File object
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.file = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(f) {
+        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
+        successCallback(file);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
+};
+
+
+module.exports = FileEntry;
+});
+
+// file: lib/common/plugin/FileError.js
+define("cordova/plugin/FileError", function(require, exports, module) {
+/**
+ * FileError
+ */
+function FileError(error) {
+  this.code = error || null;
+}
+
+// File error codes
+// Found in DOMException
+FileError.NOT_FOUND_ERR = 1;
+FileError.SECURITY_ERR = 2;
+FileError.ABORT_ERR = 3;
+
+// Added by File API specification
+FileError.NOT_READABLE_ERR = 4;
+FileError.ENCODING_ERR = 5;
+FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
+FileError.INVALID_STATE_ERR = 7;
+FileError.SYNTAX_ERR = 8;
+FileError.INVALID_MODIFICATION_ERR = 9;
+FileError.QUOTA_EXCEEDED_ERR = 10;
+FileError.TYPE_MISMATCH_ERR = 11;
+FileError.PATH_EXISTS_ERR = 12;
+
+module.exports = FileError;
+});
+
+// file: lib/common/plugin/FileReader.js
+define("cordova/plugin/FileReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class reads the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To read from the SD card, the file name is "sdcard/my_file.txt"
+ * @constructor
+ */
+var FileReader = function() {
+    this.fileName = "";
+
+    this.readyState = 0; // FileReader.EMPTY
+
+    // File data
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onloadstart = null;    // When the read starts.
+    this.onprogress = null;     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)
+    this.onload = null;         // When the read has successfully completed.
+    this.onerror = null;        // When the read has failed (see errors).
+    this.onloadend = null;      // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the read has been aborted. For instance, by invoking the abort() method.
+};
+
+// States
+FileReader.EMPTY = 0;
+FileReader.LOADING = 1;
+FileReader.DONE = 2;
+
+/**
+ * Abort reading file.
+ */
+FileReader.prototype.abort = function() {
+    this.result = null;
+
+    if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
+      return;
+    }
+
+    this.readyState = FileReader.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === 'function') {
+        this.onabort(new ProgressEvent('abort', {target:this}));
+    }
+    // If load end callback
+    if (typeof this.onloadend === 'function') {
+        this.onloadend(new ProgressEvent('loadend', {target:this}));
+    }
+};
+
+/**
+ * Read text file.
+ *
+ * @param file          {File} File object containing file properties
+ * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
+ */
+FileReader.prototype.readAsText = function(file, encoding) {
+    // Figure out pathing
+    this.fileName = '';
+    if (typeof file.fullPath === 'undefined') {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    // Default encoding is UTF-8
+    var enc = encoding ? encoding : "UTF-8";
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // null result
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsText", [this.fileName, enc]);
+};
+
+
+/**
+ * Read file and return data as a base64 encoded data url.
+ * A data url is of the form:
+ *      data:[<mediatype>][;base64],<data>
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsDataURL = function(file) {
+    this.fileName = "";
+    if (typeof file.fullPath === "undefined") {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsDataURL", [this.fileName]);
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsBinaryString = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('method "readAsBinaryString" is not supported at this time.');
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsArrayBuffer = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('This method is not supported at this time.');
+};
+
+module.exports = FileReader;
+});
+
+// file: lib/common/plugin/FileSystem.js
+define("cordova/plugin/FileSystem", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+
+/**
+ * An interface representing a file system
+ *
+ * @constructor
+ * {DOMString} name the unique name of the file system (readonly)
+ * {DirectoryEntry} root directory of the file system (readonly)
+ */
+var FileSystem = function(name, root) {
+    this.name = name || null;
+    if (root) {
+        this.root = new DirectoryEntry(root.name, root.fullPath);
+    }
+};
+
+module.exports = FileSystem;
+
+});
+
+// file: lib/common/plugin/FileTransfer.js
+define("cordova/plugin/FileTransfer", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileTransferError = require('cordova/plugin/FileTransferError');
+
+/**
+ * FileTransfer uploads a file to a remote server.
+ * @constructor
+ */
+var FileTransfer = function() {};
+
+/**
+* Given an absolute file path, uploads a file on the device to a remote server
+* using a multipart HTTP request.
+* @param filePath {String}           Full path of the file on the device
+* @param server {String}             URL of the server to receive the file
+* @param successCallback (Function}  Callback to be invoked when upload has completed
+* @param errorCallback {Function}    Callback to be invoked upon error
+* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
+* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
+*/
+FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
+    // sanity parameter checking
+    if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
+    // check for options
+    var fileKey = null;
+    var fileName = null;
+    var mimeType = null;
+    var params = null;
+    var chunkedMode = true;
+    var headers = null;
+    if (options) {
+        fileKey = options.fileKey;
+        fileName = options.fileName;
+        mimeType = options.mimeType;
+        headers = options.headers;
+        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
+            chunkedMode = options.chunkedMode;
+        }
+        if (options.params) {
+            params = options.params;
+        }
+        else {
+            params = {};
+        }
+    }
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers]);
+};
+
+/**
+ * Downloads a file form a given URL and saves it to the specified directory.
+ * @param source {String}          URL of the server to receive the file
+ * @param target {String}         Full path of the file on the device
+ * @param successCallback (Function}  Callback to be invoked when upload has completed
+ * @param errorCallback {Function}    Callback to be invoked upon error
+ */
+FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
+    // sanity parameter checking
+    if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
+    var win = function(result) {
+        var entry = null;
+        if (result.isDirectory) {
+            entry = new (require('cordova/plugin/DirectoryEntry'))();
+        }
+        else if (result.isFile) {
+            entry = new (require('cordova/plugin/FileEntry'))();
+        }
+        entry.isDirectory = result.isDirectory;
+        entry.isFile = result.isFile;
+        entry.name = result.name;
+        entry.fullPath = result.fullPath;
+        successCallback(entry);
+    };
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
+};
+
+module.exports = FileTransfer;
+
+});
+
+// file: lib/common/plugin/FileTransferError.js
+define("cordova/plugin/FileTransferError", function(require, exports, module) {
+/**
+ * FileTransferError
+ * @constructor
+ */
+var FileTransferError = function(code, source, target, status) {
+    this.code = code || null;
+    this.source = source || null;
+    this.target = target || null;
+    this.http_status = status || null;
+};
+
+FileTransferError.FILE_NOT_FOUND_ERR = 1;
+FileTransferError.INVALID_URL_ERR = 2;
+FileTransferError.CONNECTION_ERR = 3;
+
+module.exports = FileTransferError;
+
+});
+
+// file: lib/common/plugin/FileUploadOptions.js
+define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
+/**
+ * Options to customize the HTTP request used to upload files.
+ * @constructor
+ * @param fileKey {String}   Name of file request parameter.
+ * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
+ * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
+ * @param params {Object}    Object with key: value params to send to the server.
+ * @param headers {Object}   Keys are header names, values are header values. Multiple
+ *                           headers of the same name are not supported.
+ */
+var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {
+    this.fileKey = fileKey || null;
+    this.fileName = fileName || null;
+    this.mimeType = mimeType || null;
+    this.params = params || null;
+    this.headers = headers || null;
+};
+
+module.exports = FileUploadOptions;
+
+});
+
+// file: lib/common/plugin/FileUploadResult.js
+define("cordova/plugin/FileUploadResult", function(require, exports, module) {
+/**
+ * FileUploadResult
+ * @constructor
+ */
+var FileUploadResult = function() {
+    this.bytesSent = 0;
+    this.responseCode = null;
+    this.response = null;
+};
+
+module.exports = FileUploadResult;
+});
+
+// file: lib/common/plugin/FileWriter.js
+define("cordova/plugin/FileWriter", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class writes to the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To write to the SD card, the file name is "sdcard/my_file.txt"
+ *
+ * @constructor
+ * @param file {File} File object containing file properties
+ * @param append if true write to the end of the file, otherwise overwrite the file
+ */
+var FileWriter = function(file) {
+    this.fileName = "";
+    this.length = 0;
+    if (file) {
+        this.fileName = file.fullPath || file;
+        this.length = file.size || 0;
+    }
+    // default is to write at the beginning of the file
+    this.position = 0;
+
+    this.readyState = 0; // EMPTY
+
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onwritestart = null;   // When writing starts
+    this.onprogress = null;     // While writing the file, and reporting partial file data
+    this.onwrite = null;        // When the write has successfully completed.
+    this.onwriteend = null;     // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
+    this.onerror = null;        // When the write has failed (see errors).
+};
+
+// States
+FileWriter.INIT = 0;
+FileWriter.WRITING = 1;
+FileWriter.DONE = 2;
+
+/**
+ * Abort writing file.
+ */
+FileWriter.prototype.abort = function() {
+    // check for invalid state
+    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // set error
+    this.error = new FileError(FileError.ABORT_ERR);
+
+    this.readyState = FileWriter.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === "function") {
+        this.onabort(new ProgressEvent("abort", {"target":this}));
+    }
+
+    // If write end callback
+    if (typeof this.onwriteend === "function") {
+        this.onwriteend(new ProgressEvent("writeend", {"target":this}));
+    }
+};
+
+/**
+ * Writes data to the file
+ *
+ * @param text to be written
+ */
+FileWriter.prototype.write = function(text) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":me}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // position always increases by bytes written because file would be extended
+            me.position += r;
+            // The length of the file is now where we are done writing.
+
+            me.length = me.position;
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "write", [this.fileName, text, this.position]);
+};
+
+/**
+ * Moves the file pointer to the location specified.
+ *
+ * If the offset is a negative number the position of the file
+ * pointer is rewound.  If the offset is greater than the file
+ * size the position is set to the end of the file.
+ *
+ * @param offset is the location to move the file pointer to.
+ */
+FileWriter.prototype.seek = function(offset) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    if (!offset && offset !== 0) {
+        return;
+    }
+
+    // See back from end of file.
+    if (offset < 0) {
+        this.position = Math.max(offset + this.length, 0);
+    }
+    // Offset is bigger then file size so set position
+    // to the end of the file.
+    else if (offset > this.length) {
+        this.position = this.length;
+    }
+    // Offset is between 0 and file size so set the position
+    // to start writing.
+    else {
+        this.position = offset;
+    }
+};
+
+/**
+ * Truncates the file to the size specified.
+ *
+ * @param size to chop the file at.
+ */
+FileWriter.prototype.truncate = function(size) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":this}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Update the length of the file
+            me.length = r;
+            me.position = Math.min(me.position, r);
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "truncate", [this.fileName, size]);
+};
+
+module.exports = FileWriter;
+
+});
+
+// file: lib/common/plugin/Flags.js
+define("cordova/plugin/Flags", function(require, exports, module) {
+/**
+ * Supplies arguments to methods that lookup or create files and directories.
+ *
+ * @param create
+ *            {boolean} file or directory if it doesn't exist
+ * @param exclusive
+ *            {boolean} used with create; if true the command will fail if
+ *            target path exists
+ */
+function Flags(create, exclusive) {
+    this.create = create || false;
+    this.exclusive = exclusive || false;
+}
+
+module.exports = Flags;
+});
+
+// file: lib/common/plugin/LocalFileSystem.js
+define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Represents a local file system.
+ */
+var LocalFileSystem = function() {
+
+};
+
+LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
+LocalFileSystem.PERSISTENT = 1; //persistent
+
+module.exports = LocalFileSystem;
+});
+
+// file: lib/common/plugin/Media.js
+define("cordova/plugin/Media", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+var mediaObjects = {};
+
+/**
+ * This class provides access to the device media, interfaces to both sound and video
+ *
+ * @constructor
+ * @param src                   The file name or url to play
+ * @param successCallback       The callback to be called when the file is done playing or recording.
+ *                                  successCallback()
+ * @param errorCallback         The callback to be called if there is an error.
+ *                                  errorCallback(int errorCode) - OPTIONAL
+ * @param statusCallback        The callback to be called when media status has changed.
+ *                                  statusCallback(int statusCode) - OPTIONAL
+ */
+var Media = function(src, successCallback, errorCallback, statusCallback) {
+
+    // successCallback optional
+    if (successCallback && (typeof successCallback !== "function")) {
+        console.log("Media Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Media Error: errorCallback is not a function");
+        return;
+    }
+
+    // statusCallback optional
+    if (statusCallback && (typeof statusCallback !== "function")) {
+        console.log("Media Error: statusCallback is not a function");
+        return;
+    }
+
+    this.id = utils.createUUID();
+    mediaObjects[this.id] = this;
+    this.src = src;
+    this.successCallback = successCallback;
+    this.errorCallback = errorCallback;
+    this.statusCallback = statusCallback;
+    this._duration = -1;
+    this._position = -1;
+    exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
+};
+
+// Media messages
+Media.MEDIA_STATE = 1;
+Media.MEDIA_DURATION = 2;
+Media.MEDIA_POSITION = 3;
+Media.MEDIA_ERROR = 9;
+
+// Media states
+Media.MEDIA_NONE = 0;
+Media.MEDIA_STARTING = 1;
+Media.MEDIA_RUNNING = 2;
+Media.MEDIA_PAUSED = 3;
+Media.MEDIA_STOPPED = 4;
+Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"];
+
+// "static" function to return existing objs.
+Media.get = function(id) {
+    return mediaObjects[id];
+};
+
+/**
+ * Start or resume playing audio file.
+ */
+Media.prototype.play = function(options) {
+    exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]);
+};
+
+/**
+ * Stop playing audio file.
+ */
+Media.prototype.stop = function() {
+    var me = this;
+    exec(function() {
+        me._position = 0;
+        me.successCallback();
+    }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
+};
+
+/**
+ * Seek or jump to a new time in the track..
+ */
+Media.prototype.seekTo = function(milliseconds) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+    }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]);
+};
+
+/**
+ * Pause playing audio file.
+ */
+Media.prototype.pause = function() {
+    exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]);
+};
+
+/**
+ * Get duration of an audio file.
+ * The duration is only set for audio that is playing, paused or stopped.
+ *
+ * @return      duration or -1 if not known.
+ */
+Media.prototype.getDuration = function() {
+    return this._duration;
+};
+
+/**
+ * Get position of audio.
+ */
+Media.prototype.getCurrentPosition = function(success, fail) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+        success(p);
+    }, fail, "Media", "getCurrentPositionAudio", [this.id]);
+};
+
+/**
+ * Start recording audio file.
+ */
+Media.prototype.startRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+};
+
+/**
+ * Stop recording audio file.
+ */
+Media.prototype.stopRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
+};
+
+/**
+ * Release the resources.
+ */
+Media.prototype.release = function() {
+    exec(null, this.errorCallback, "Media", "release", [this.id]);
+};
+
+/**
+ * Adjust the volume.
+ */
+Media.prototype.setVolume = function(volume) {
+    exec(null, null, "Media", "setVolume", [this.id, volume]);
+};
+
+/**
+ * Audio has status update.
+ * PRIVATE
+ *
+ * @param id            The media object id (string)
+ * @param status        The status code (int)
+ * @param msg           The status message (string)
+ */
+Media.onStatus = function(id, msg, value) {
+    var media = mediaObjects[id];
+    // If state update
+    if (msg === Media.MEDIA_STATE) {
+        if (value === Media.MEDIA_STOPPED) {
+            if (media.successCallback) {
+                media.successCallback();
+            }
+        }
+        if (media.statusCallback) {
+            media.statusCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_DURATION) {
+        media._duration = value;
+    }
+    else if (msg === Media.MEDIA_ERROR) {
+        if (media.errorCallback) {
+            // value should be a MediaError object when msg == MEDIA_ERROR
+            media.errorCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_POSITION) {
+        media._position = value;
+    }
+};
+
+module.exports = Media;
+});
+
+// file: lib/common/plugin/MediaError.js
+define("cordova/plugin/MediaError", function(require, exports, module) {
+/**
+ * This class contains information about any Media errors.
+ * @constructor
+ */
+var MediaError = function(code, msg) {
+    this.code = (code !== undefined ? code : null);
+    this.message = msg || "";
+};
+
+MediaError.MEDIA_ERR_NONE_ACTIVE    = 0;
+MediaError.MEDIA_ERR_ABORTED        = 1;
+MediaError.MEDIA_ERR_NETWORK        = 2;
+MediaError.MEDIA_ERR_DECODE         = 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+
+module.exports = MediaError;
+});
+
+// file: lib/common/plugin/MediaFile.js
+define("cordova/plugin/MediaFile", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    File = require('cordova/plugin/File'),
+    CaptureError = require('cordova/plugin/CaptureError');
+/**
+ * Represents a single file.
+ *
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+var MediaFile = function(name, fullPath, type, lastModifiedDate, size){
+    MediaFile.__super__.constructor.apply(this, arguments);
+};
+
+utils.extend(MediaFile, File);
+
+/**
+ * Request capture format data for a specific file and type
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ */
+MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
+    if (typeof this.fullPath === "undefined" || this.fullPath === null) {
+        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
+    } else {
+        exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]);
+    }
+};
+
+// TODO: can we axe this?
+/**
+ * Casts a PluginResult message property  (array of objects) to an array of MediaFile objects
+ * (used in Objective-C and Android)
+ *
+ * @param {PluginResult} pluginResult
+ */
+MediaFile.cast = function(pluginResult) {
+    var mediaFiles = [];
+    for (var i=0; i<pluginResult.message.length; i++) {
+        var mediaFile = new MediaFile();
+        mediaFile.name = pluginResult.message[i].name;
+        mediaFile.fullPath = pluginResult.message[i].fullPath;
+        mediaFile.type = pluginResult.message[i].type;
+        mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
+        mediaFile.size = pluginResult.message[i].size;
+        mediaFiles.push(mediaFile);
+    }
+    pluginResult.message = mediaFiles;
+    return pluginResult;
+};
+
+module.exports = MediaFile;
+
+});
+
+// file: lib/common/plugin/MediaFileData.js
+define("cordova/plugin/MediaFileData", function(require, exports, module) {
+/**
+ * MediaFileData encapsulates format information of a media file.
+ *
+ * @param {DOMString} codecs
+ * @param {long} bitrate
+ * @param {long} height
+ * @param {long} width
+ * @param {float} duration
+ */
+var MediaFileData = function(codecs, bitrate, height, width, duration){
+    this.codecs = codecs || null;
+    this.bitrate = bitrate || 0;
+    this.height = height || 0;
+    this.width = width || 0;
+    this.duration = duration || 0;
+};
+
+module.exports = MediaFileData;
+});
+
+// file: lib/common/plugin/Metadata.js
+define("cordova/plugin/Metadata", function(require, exports, module) {
+/**
+ * Information about the state of the file or directory
+ *
+ * {Date} modificationTime (readonly)
+ */
+var Metadata = function(time) {
+    this.modificationTime = (typeof time != 'undefined'?new Date(time):null);
+};
+
+module.exports = Metadata;
+});
+
+// file: lib/common/plugin/Position.js
+define("cordova/plugin/Position", function(require, exports, module) {
+var Coordinates = require('cordova/plugin/Coordinates');
+
+var Position = function(coords, timestamp) {
+    if (coords) {
+        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
+    } else {
+        this.coords = new Coordinates();
+    }
+    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
+};
+
+module.exports = Position;
+
+});
+
+// file: lib/common/plugin/PositionError.js
+define("cordova/plugin/PositionError", function(require, exports, module) {
+/**
+ * Position error object
+ *
+ * @constructor
+ * @param code
+ * @param message
+ */
+var PositionError = function(code, message) {
+    this.code = code || null;
+    this.message = message || '';
+};
+
+PositionError.PERMISSION_DENIED = 1;
+PositionError.POSITION_UNAVAILABLE = 2;
+PositionError.TIMEOUT = 3;
+
+module.exports = PositionError;
+});
+
+// file: lib/common/plugin/ProgressEvent.js
+define("cordova/plugin/ProgressEvent", function(require, exports, module) {
+// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
+// Feature test: See if we can instantiate a native ProgressEvent;
+// if so, use that approach,
+// otherwise fill-in with our own implementation.
+//
+// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
+var ProgressEvent = (function() {
+    /*
+    var createEvent = function(data) {
+        var event = document.createEvent('Events');
+        event.initEvent('ProgressEvent', false, false);
+        if (data) {
+            for (var i in data) {
+                if (data.hasOwnProperty(i)) {
+                    event[i] = data[i];
+                }
+            }
+            if (data.target) {
+                // TODO: cannot call <some_custom_object>.dispatchEvent
+                // need to first figure out how to implement EventTarget
+            }
+        }
+        return event;
+    };
+    try {
+        var ev = createEvent({type:"abort",target:document});
+        return function ProgressEvent(type, data) {
+            data.type = type;
+            return createEvent(data);
+        };
+    } catch(e){
+    */
+        return function ProgressEvent(type, dict) {
+            this.type = type;
+            this.bubbles = false;
+            this.cancelBubble = false;
+            this.cancelable = false;
+            this.lengthComputable = false;
+            this.loaded = dict && dict.loaded ? dict.loaded : 0;
+            this.total = dict && dict.total ? dict.total : 0;
+            this.target = dict && dict.target ? dict.target : null;
+        };
+    //}
+})();
+
+module.exports = ProgressEvent;
+});
+
+// file: lib/common/plugin/accelerometer.js
+define("cordova/plugin/accelerometer", function(require, exports, module) {
+/**
+ * This class provides access to device accelerometer data.
+ * @constructor
+ */
+var utils = require("cordova/utils"),
+    exec = require("cordova/exec"),
+    Acceleration = require('cordova/plugin/Acceleration');
+
+// Is the accel sensor running?
+var running = false;
+
+// Keeps reference to watchAcceleration calls.
+var timers = {};
+
+// Array of listeners; used to keep track of when we should call start and stop.
+var listeners = [];
+
+// Last returned acceleration object from native
+var accel = null;
+
+// Tells native to start.
+function start() {
+    exec(function(a) {
+        var tempListeners = listeners.slice(0);
+        accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].win(accel);
+        }
+    }, function(e) {
+        var tempListeners = listeners.slice(0);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].fail(e);
+        }
+    }, "Accelerometer", "start", []);
+    running = true;
+}
+
+// Tells native to stop.
+function stop() {
+    exec(null, null, "Accelerometer", "stop", []);
+    running = false;
+}
+
+// Adds a callback pair to the listeners array
+function createCallbackPair(win, fail) {
+    return {win:win, fail:fail};
+}
+
+// Removes a win/fail listener pair from the listeners array
+function removeListeners(l) {
+    var idx = listeners.indexOf(l);
+    if (idx > -1) {
+        listeners.splice(idx, 1);
+        if (listeners.length === 0) {
+            stop();
+        }
+    }
+}
+
+var accelerometer = {
+    /**
+     * Asynchronously aquires the current acceleration.
+     *
+     * @param {Function} successCallback    The function to call when the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     */
+    getCurrentAcceleration: function(successCallback, errorCallback, options) {
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "getCurrentAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        var p;
+        var win = function(a) {
+            removeListeners(p);
+            successCallback(a);
+        };
+        var fail = function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        };
+
+        p = createCallbackPair(win, fail);
+        listeners.push(p);
+
+        if (!running) {
+            start();
+        }
+    },
+
+    /**
+     * Asynchronously aquires the acceleration repeatedly at a given interval.
+     *
+     * @param {Function} successCallback    The function to call each time the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchAcceleration: function(successCallback, errorCallback, options) {
+        // Default interval (10 sec)
+        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
+
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "watchAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        // Keep reference to watch id, and report accel readings as often as defined in frequency
+        var id = utils.createUUID();
+
+        var p = createCallbackPair(function(){}, function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        });
+        listeners.push(p);
+
+        timers[id] = {
+            timer:window.setInterval(function() {
+                if (accel) {
+                    successCallback(accel);
+                }
+            }, frequency),
+            listeners:p
+        };
+
+        if (running) {
+            // If we're already running then immediately invoke the success callback
+            // but only if we have retreived a value, sample code does not check for null ...
+            if(accel) {
+                successCallback(accel);
+            }
+        } else {
+            start();
+        }
+
+        return id;
+    },
+
+    /**
+     * Clears the specified accelerometer watch.
+     *
+     * @param {String} id       The id of the watch returned from #watchAcceleration.
+     */
+    clearWatch: function(id) {
+        // Stop javascript timer & remove from timer list
+        if (id && timers[id]) {
+            window.clearInterval(timers[id].timer);
+            removeListeners(timers[id].listeners);
+            delete timers[id];
+        }
+    }
+};
+
+module.exports = accelerometer;
+
+});
+
+// file: lib/common/plugin/battery.js
+define("cordova/plugin/battery", function(require, exports, module) {
+/**
+ * This class contains information about the current battery status.
+ * @constructor
+ */
+var cordova = require('cordova'),
+    exec = require('cordova/exec');
+
+function handlers() {
+  return battery.channels.batterystatus.numHandlers +
+         battery.channels.batterylow.numHandlers +
+         battery.channels.batterycritical.numHandlers;
+}
+
+var Battery = function() {
+    this._level = null;
+    this._isPlugged = null;
+    // Create new event handlers on the window (returns a channel instance)
+    var subscriptionEvents = {
+      onSubscribe:this.onSubscribe,
+      onUnsubscribe:this.onUnsubscribe
+    };
+    this.channels = {
+      batterystatus:cordova.addWindowEventHandler("batterystatus", subscriptionEvents),
+      batterylow:cordova.addWindowEventHandler("batterylow", subscriptionEvents),
+      batterycritical:cordova.addWindowEventHandler("batterycritical", subscriptionEvents)
+    };
+};
+/**
+ * Event handlers for when callbacks get registered for the battery.
+ * Keep track of how many handlers we have so we can start and stop the native battery listener
+ * appropriately (and hopefully save on battery life!).
+ */
+Battery.prototype.onSubscribe = function() {
+  var me = battery;
+  // If we just registered the first handler, make sure native listener is started.
+  if (handlers() === 1) {
+    exec(me._status, me._error, "Battery", "start", []);
+  }
+};
+
+Battery.prototype.onUnsubscribe = function() {
+  var me = battery;
+
+  // If we just unregistered the last handler, make sure native listener is stopped.
+  if (handlers() === 0) {
+      exec(null, null, "Battery", "stop", []);
+  }
+};
+
+/**
+ * Callback for battery status
+ *
+ * @param {Object} info            keys: level, isPlugged
+ */
+Battery.prototype._status = function(info) {
+    if (info) {
+        var me = battery;
+    var level = info.level;
+        if (me._level !== level || me._isPlugged !== info.isPlugged) {
+            // Fire batterystatus event
+            cordova.fireWindowEvent("batterystatus", info);
+
+            // Fire low battery event
+            if (level === 20 || level === 5) {
+                if (level === 20) {
+                    cordova.fireWindowEvent("batterylow", info);
+                }
+                else {
+                    cordova.fireWindowEvent("batterycritical", info);
+                }
+            }
+        }
+        me._level = level;
+        me._isPlugged = info.isPlugged;
+    }
+};
+
+/**
+ * Error callback for battery start
+ */
+Battery.prototype._error = function(e) {
+    console.log("Error initializing Battery: " + e);
+};
+
+var battery = new Battery();
+
+module.exports = battery;
+});
+
+// file: lib/common/plugin/capture.js
+define("cordova/plugin/capture", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    MediaFile = require('cordova/plugin/MediaFile');
+
+/**
+ * Launches a capture of different types.
+ *
+ * @param (DOMString} type
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+function _capture(type, successCallback, errorCallback, options) {
+    var win = function(pluginResult) {
+        var mediaFiles = [];
+        var i;
+        for (i = 0; i < pluginResult.length; i++) {
+            var mediaFile = new MediaFile();
+            mediaFile.name = pluginResult[i].name;
+            mediaFile.fullPath = pluginResult[i].fullPath;
+            mediaFile.type = pluginResult[i].type;
+            mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
+            mediaFile.size = pluginResult[i].size;
+            mediaFiles.push(mediaFile);
+        }
+        successCallback(mediaFiles);
+    };
+    exec(win, errorCallback, "Capture", type, [options]);
+}
+/**
+ * The Capture interface exposes an interface to the camera and microphone of the hosting device.
+ */
+function Capture() {
+    this.supportedAudioModes = [];
+    this.supportedImageModes = [];
+    this.supportedVideoModes = [];
+}
+
+/**
+ * Launch audio recorder application for recording audio clip(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureAudioOptions} options
+ */
+Capture.prototype.captureAudio = function(successCallback, errorCallback, options){
+    _capture("captureAudio", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch camera application for taking image(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureImageOptions} options
+ */
+Capture.prototype.captureImage = function(successCallback, errorCallback, options){
+    _capture("captureImage", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch device camera application for recording video(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+Capture.prototype.captureVideo = function(successCallback, errorCallback, options){
+    _capture("captureVideo", successCallback, errorCallback, options);
+};
+
+
+module.exports = new Capture();
+
+});
+
+// file: lib/common/plugin/compass.js
+define("cordova/plugin/compass", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    utils = require('cordova/utils'),
+    CompassHeading = require('cordova/plugin/CompassHeading'),
+    CompassError = require('cordova/plugin/CompassError'),
+    timers = {},
+    compass = {
+        /**
+         * Asynchronously acquires the current heading.
+         * @param {Function} successCallback The function to call when the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {CompassOptions} options The options for getting the heading data (not used).
+         */
+        getCurrentHeading:function(successCallback, errorCallback, options) {
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var win = function(result) {
+                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
+                successCallback(ch);
+            };
+            var fail = function(code) {
+                var ce = new CompassError(code);
+                errorCallback(ce);
+            };
+
+            // Get heading
+            exec(win, fail, "Compass", "getHeading", [options]);
+        },
+
+        /**
+         * Asynchronously acquires the heading repeatedly at a given interval.
+         * @param {Function} successCallback The function to call each time the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {HeadingOptions} options The options for getting the heading data
+         * such as timeout and the frequency of the watch. For iOS, filter parameter
+         * specifies to watch via a distance filter rather than time.
+         */
+        watchHeading:function(successCallback, errorCallback, options) {
+            // Default interval (100 msec)
+            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
+            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
+
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var id = utils.createUUID();
+            if (filter > 0) {
+                // is an iOS request for watch by filter, no timer needed
+                timers[id] = "iOS";
+                compass.getCurrentHeading(successCallback, errorCallback, options);
+            } else {
+                // Start watch timer to get headings
+                timers[id] = window.setInterval(function() {
+                    compass.getCurrentHeading(successCallback, errorCallback);
+                }, frequency);
+            }
+
+            return id;
+        },
+
+        /**
+         * Clears the specified heading watch.
+         * @param {String} watchId The ID of the watch returned from #watchHeading.
+         */
+        clearWatch:function(id) {
+            // Stop javascript timer & remove from timer list
+            if (id && timers[id]) {
+                if (timers[id] != "iOS") {
+                      clearInterval(timers[id]);
+                  } else {
+                    // is iOS watch by filter so call into device to stop
+                    exec(null, null, "Compass", "stopHeading", []);
+                }
+                delete timers[id];
+            }
+        }
+    };
+
+module.exports = compass;
+});
+
+// file: lib/common/plugin/console-via-logger.js
+define("cordova/plugin/console-via-logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+
+var logger = require("cordova/plugin/logger");
+var utils  = require("cordova/utils");
+
+//------------------------------------------------------------------------------
+// object that we're exporting
+//------------------------------------------------------------------------------
+var console = module.exports;
+
+//------------------------------------------------------------------------------
+// copy of the original console object
+//------------------------------------------------------------------------------
+var WinConsole = window.console;
+
+//------------------------------------------------------------------------------
+// whether to use the logger
+//------------------------------------------------------------------------------
+var UseLogger = false;
+
+//------------------------------------------------------------------------------
+// Timers
+//------------------------------------------------------------------------------
+var Timers = {};
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+function noop() {}
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+console.useLogger = function (value) {
+    if (arguments.length) UseLogger = !!value;
+
+    if (UseLogger) {
+        if (logger.useConsole()) {
+            throw new Error("console and logger are too intertwingly");
+        }
+    }
+
+    return UseLogger;
+};
+
+//------------------------------------------------------------------------------
+console.log = function() {
+    if (logger.useConsole()) return;
+    logger.log.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.error = function() {
+    if (logger.useConsole()) return;
+    logger.error.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.warn = function() {
+    if (logger.useConsole()) return;
+    logger.warn.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.info = function() {
+    if (logger.useConsole()) return;
+    logger.info.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.debug = function() {
+    if (logger.useConsole()) return;
+    logger.debug.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.assert = function(expression) {
+    if (expression) return;
+
+    var message = utils.vformat(arguments[1], [].slice.call(arguments, 2));
+    console.log("ASSERT: " + message);
+};
+
+//------------------------------------------------------------------------------
+console.clear = function() {};
+
+//------------------------------------------------------------------------------
+console.dir = function(object) {
+    console.log("%o", object);
+};
+
+//------------------------------------------------------------------------------
+console.dirxml = function(node) {
+    console.log(node.innerHTML);
+};
+
+//------------------------------------------------------------------------------
+console.trace = noop;
+
+//------------------------------------------------------------------------------
+console.group = console.log;
+
+//------------------------------------------------------------------------------
+console.groupCollapsed = console.log;
+
+//------------------------------------------------------------------------------
+console.groupEnd = noop;
+
+//------------------------------------------------------------------------------
+console.time = function(name) {
+    Timers[name] = new Date().valueOf();
+};
+
+//------------------------------------------------------------------------------
+console.timeEnd = function(name) {
+    var timeStart = Timers[name];
+    if (!timeStart) {
+        console.warn("unknown timer: " + name);
+        return;
+    }
+
+    var timeElapsed = new Date().valueOf() - timeStart;
+    console.log(name + ": " + timeElapsed + "ms");
+};
+
+//------------------------------------------------------------------------------
+console.timeStamp = noop;
+
+//------------------------------------------------------------------------------
+console.profile = noop;
+
+//------------------------------------------------------------------------------
+console.profileEnd = noop;
+
+//------------------------------------------------------------------------------
+console.count = noop;
+
+//------------------------------------------------------------------------------
+console.exception = console.log;
+
+//------------------------------------------------------------------------------
+console.table = function(data, columns) {
+    console.log("%o", data);
+};
+
+//------------------------------------------------------------------------------
+// return a new function that calls both functions passed as args
+//------------------------------------------------------------------------------
+function wrapperedOrigCall(orgFunc, newFunc) {
+    return function() {
+        var args = [].slice.call(arguments);
+        try { orgFunc.apply(WinConsole, args); } catch (e) {}
+        try { newFunc.apply(console,    args); } catch (e) {}
+    };
+}
+
+//------------------------------------------------------------------------------
+// For every function that exists in the original console object, that
+// also exists in the new console object, wrap the new console method
+// with one that calls both
+//------------------------------------------------------------------------------
+for (var key in console) {
+    if (typeof WinConsole[key] == "function") {
+        console[key] = wrapperedOrigCall(WinConsole[key], console[key]);
+    }
+}
+
+});
+
+// file: lib/common/plugin/contacts.js
+define("cordova/plugin/contacts", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+* Represents a group of Contacts.
+* @constructor
+*/
+var contacts = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     * @param fields that should be searched
+     * @param successCB success callback
+     * @param errorCB error callback
+     * @param {ContactFindOptions} options that can be applied to contact searching
+     * @return array of Contacts matching search criteria
+     */
+    find:function(fields, successCB, errorCB, options) {
+        if (!successCB) {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+        if (!fields || (utils.isArray(fields) && fields.length === 0)) {
+            if (typeof errorCB === "function") {
+                errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+        } else {
+            var win = function(result) {
+                var cs = [];
+                for (var i = 0, l = result.length; i < l; i++) {
+                    cs.push(contacts.create(result[i]));
+                }
+                successCB(cs);
+            };
+            exec(win, errorCB, "Contacts", "search", [fields, options]);
+        }
+    },
+
+    /**
+     * This function creates a new contact, but it does not persist the contact
+     * to device storage. To persist the contact to device storage, invoke
+     * contact.save().
+     * @param properties an object who's properties will be examined to create a new Contact
+     * @returns new Contact object
+     */
+    create:function(properties) {
+        var i;
+        var contact = new Contact();
+        for (i in properties) {
+            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
+                contact[i] = properties[i];
+            }
+        }
+        return contact;
+    }
+};
+
+module.exports = contacts;
+
+});
+
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+var channel = require('cordova/channel'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+/**
+ * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+    this.available = false;
+    this.platform = null;
+    this.version = null;
+    this.name = null;
+    this.uuid = null;
+    this.cordova = null;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function(info) {
+            me.available = true;
+            me.platform = info.platform;
+            me.version = info.version;
+            me.name = info.name;
+            me.uuid = info.uuid;
+            me.cordova = info.cordova;
+            channel.onCordovaInfoReady.fire();
+        },function(e) {
+            me.available = false;
+            utils.alert("[ERROR] Error initializing Cordova: " + e);
+        });
+    });
+}
+
+/**
+ * Get device info
+ *
+ * @param {Function} successCallback The function to call when the heading data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
+ */
+Device.prototype.getInfo = function(successCallback, errorCallback) {
+
+    // successCallback required
+    if (typeof successCallback !== "function") {
+        console.log("Device Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Device Error: errorCallback is not a function");
+        return;
+    }
+
+    // Get info
+    exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/common/plugin/geolocation.js
+define("cordova/plugin/geolocation", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    PositionError = require('cordova/plugin/PositionError'),
+    Position = require('cordova/plugin/Position');
+
+var timers = {};   // list of timers in use
+
+// Returns default params, overrides if provided with values
+function parseParameters(options) {
+    var opt = {
+        maximumAge: 0,
+        enableHighAccuracy: false,
+        timeout: Infinity
+    };
+
+    if (options) {
+        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
+            opt.maximumAge = options.maximumAge;
+        }
+        if (options.enableHighAccuracy !== undefined) {
+            opt.enableHighAccuracy = options.enableHighAccuracy;
+        }
+        if (options.timeout !== undefined && !isNaN(options.timeout)) {
+            if (options.timeout < 0) {
+                opt.timeout = 0;
+            } else {
+                opt.timeout = options.timeout;
+            }
+        }
+    }
+
+    return opt;
+}
+
+// Returns a timeout failure, closed over a specified timeout value and error callback.
+function createTimeout(errorCallback, timeout) {
+    var t = setTimeout(function() {
+        clearTimeout(t);
+        t = null;
+        errorCallback({
+            code:PositionError.TIMEOUT,
+            message:"Position retrieval timed out."
+        });
+    }, timeout);
+    return t;
+}
+
+var geolocation = {
+    lastPosition:null, // reference to last known (cached) position returned
+    /**
+   * Asynchronously aquires the current position.
+   *
+   * @param {Function} successCallback    The function to call when the position data is available
+   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)
+   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)
+   */
+    getCurrentPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("getCurrentPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        // Timer var that will fire an error callback if no position is retrieved from native
+        // before the "timeout" param provided expires
+        var timeoutTimer = null;
+
+        var win = function(p) {
+            clearTimeout(timeoutTimer);
+            if (!timeoutTimer) {
+                // Timeout already happened, or native fired error callback for
+                // this geo request.
+                // Don't continue with success callback.
+                return;
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+        var fail = function(e) {
+            clearTimeout(timeoutTimer);
+            timeoutTimer = null;
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
+        // fire the success callback with the cached position.
+        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
+            successCallback(geolocation.lastPosition);
+        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
+        } else if (options.timeout === 0) {
+            fail({
+                code:PositionError.TIMEOUT,
+                message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
+            });
+        // Otherwise we have to call into native to retrieve a position.
+        } else {
+            if (options.timeout !== Infinity) {
+                // If the timeout value was not set to Infinity (default), then
+                // set up a timeout function that will fire the error callback
+                // if no successful position was retrieved before timeout expired.
+                timeoutTimer = createTimeout(fail, options.timeout);
+            } else {
+                // This is here so the check in the win function doesn't mess stuff up
+                // may seem weird but this guarantees timeoutTimer is
+                // always truthy before we call into native
+                timeoutTimer = true;
+            }
+            exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
+        }
+        return timeoutTimer;
+    },
+    /**
+     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,
+     * the successCallback is called with the new location.
+     *
+     * @param {Function} successCallback    The function to call each time the location data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)
+     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("watchPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        var id = utils.createUUID();
+
+        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
+        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
+
+        var fail = function(e) {
+            clearTimeout(timers[id]);
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        var win = function(p) {
+            clearTimeout(timers[id]);
+            if (options.timeout !== Infinity) {
+                timers[id] = createTimeout(fail, options.timeout);
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+
+        exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
+
+        return id;
+    },
+    /**
+     * Clears the specified heading watch.
+     *
+     * @param {String} id       The ID of the watch returned from #watchPosition
+     */
+    clearWatch:function(id) {
+        if (id && timers[id] !== undefined) {
+            clearTimeout(timers[id]);
+            delete timers[id];
+            exec(null, null, "Geolocation", "clearWatch", [id]);
+        }
+    }
+};
+
+module.exports = geolocation;
+
+});
+
+// file: lib/common/plugin/logger.js
+define("cordova/plugin/logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+// The logger module exports the following properties/functions:
+//
+// LOG                          - constant for the level LOG
+// ERROR                        - constant for the level ERROR
+// WARN                         - constant for the level WARN
+// INFO                         - constant for the level INFO
+// DEBUG                        - constant for the level DEBUG
+// logLevel()                   - returns current log level
+// logLevel(value)              - sets and returns a new log level
+// useConsole()                 - returns whether logger is using console
+// useConsole(value)            - sets and returns whether logger is using console
+// log(message,...)             - logs a message at level LOG
+// error(message,...)           - logs a message at level ERROR
+// warn(message,...)            - logs a message at level WARN
+// info(message,...)            - logs a message at level INFO
+// debug(message,...)           - logs a message at level DEBUG
+// logLevel(level,message,...)  - logs a message specified level
+//
+//------------------------------------------------------------------------------
+
+var logger = exports;
+
+var exec    = require('cordova/exec');
+var utils   = require('cordova/utils');
+
+var UseConsole   = true;
+var Queued       = [];
+var DeviceReady  = false;
+var CurrentLevel;
+
+/**
+ * Logging levels
+ */
+
+var Levels = [
+    "LOG",
+    "ERROR",
+    "WARN",
+    "INFO",
+    "DEBUG"
+];
+
+/*
+ * add the logging levels to the logger object and
+ * to a separate levelsMap object for testing
+ */
+
+var LevelsMap = {};
+for (var i=0; i<Levels.length; i++) {
+    var level = Levels[i];
+    LevelsMap[level] = i;
+    logger[level]    = level;
+}
+
+CurrentLevel = LevelsMap.WARN;
+
+/**
+ * Getter/Setter for the logging level
+ *
+ * Returns the current logging level.
+ *
+ * When a value is passed, sets the logging level to that value.
+ * The values should be one of the following constants:
+ *    logger.LOG
+ *    logger.ERROR
+ *    logger.WARN
+ *    logger.INFO
+ *    logger.DEBUG
+ *
+ * The value used determines which messages get printed.  The logging
+ * values above are in order, and only messages logged at the logging
+ * level or above will actually be displayed to the user.  Eg, the
+ * default level is WARN, so only messages logged with LOG, ERROR, or
+ * WARN will be displayed; INFO and DEBUG messages will be ignored.
+ */
+logger.level = function (value) {
+    if (arguments.length) {
+        if (LevelsMap[value] === null) {
+            throw new Error("invalid logging level: " + value);
+        }
+        CurrentLevel = LevelsMap[value];
+    }
+
+    return Levels[CurrentLevel];
+};
+
+/**
+ * Getter/Setter for the useConsole functionality
+ *
+ * When useConsole is true, the logger will log via the
+ * browser 'console' object.  Otherwise, it will use the
+ * native Logger plugin.
+ */
+logger.useConsole = function (value) {
+    if (arguments.length) UseConsole = !!value;
+
+    if (UseConsole) {
+        if (typeof console == "undefined") {
+            throw new Error("global console object is not defined");
+        }
+
+        if (typeof console.log != "function") {
+            throw new Error("global console object does not have a log function");
+        }
+
+        if (typeof console.useLogger == "function") {
+            if (console.useLogger()) {
+                throw new Error("console and logger are too intertwingly");
+            }
+        }
+    }
+
+    return UseConsole;
+};
+
+/**
+ * Logs a message at the LOG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.log   = function(message) { logWithArgs("LOG",   arguments); };
+
+/**
+ * Logs a message at the ERROR level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.error = function(message) { logWithArgs("ERROR", arguments); };
+
+/**
+ * Logs a message at the WARN level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.warn  = function(message) { logWithArgs("WARN",  arguments); };
+
+/**
+ * Logs a message at the INFO level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.info  = function(message) { logWithArgs("INFO",  arguments); };
+
+/**
+ * Logs a message at the DEBUG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.debug = function(message) { logWithArgs("DEBUG", arguments); };
+
+// log at the specified level with args
+function logWithArgs(level, args) {
+    args = [level].concat([].slice.call(args));
+    logger.logLevel.apply(logger, args);
+}
+
+/**
+ * Logs a message at the specified level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.logLevel = function(level, message /* , ... */) {
+    // format the message with the parameters
+    var formatArgs = [].slice.call(arguments, 2);
+    message    = utils.vformat(message, formatArgs);
+
+    if (LevelsMap[level] === null) {
+        throw new Error("invalid logging level: " + level);
+    }
+
+    if (LevelsMap[level] > CurrentLevel) return;
+
+    // queue the message if not yet at deviceready
+    if (!DeviceReady && !UseConsole) {
+        Queued.push([level, message]);
+        return;
+    }
+
+    // if not using the console, use the native logger
+    if (!UseConsole) {
+        exec(null, null, "Logger", "logLevel", [level, message]);
+        return;
+    }
+
+    // make sure console is not using logger
+    if (console.__usingCordovaLogger) {
+        throw new Error("console and logger are too intertwingly");
+    }
+
+    // log to the console
+    switch (level) {
+        case logger.LOG:   console.log(message); break;
+        case logger.ERROR: console.log("ERROR: " + message); break;
+        case logger.WARN:  console.log("WARN: "  + message); break;
+        case logger.INFO:  console.log("INFO: "  + message); break;
+        case logger.DEBUG: console.log("DEBUG: " + message); break;
+    }
+};
+
+// when deviceready fires, log queued messages
+logger.__onDeviceReady = function() {
+    if (DeviceReady) return;
+
+    DeviceReady = true;
+
+    for (var i=0; i<Queued.length; i++) {
+        var messageArgs = Queued[i];
+        logger.logLevel(messageArgs[0], messageArgs[1]);
+    }
+
+    Queued = null;
+};
+
+// add a deviceready event to log queued messages
+document.addEventListener("deviceready", logger.__onDeviceReady, false);
+
+});
+
+// file: lib/common/plugin/network.js
+define("cordova/plugin/network", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    cordova = require('cordova'),
+    channel = require('cordova/channel');
+
+var NetworkConnection = function () {
+    this.type = null;
+    this._firstRun = true;
+    this._timer = null;
+    this.timeout = 500;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function (info) {
+            me.type = info;
+            if (info === "none") {
+                // set a timer if still offline at the end of timer send the offline event
+                me._timer = setTimeout(function(){
+                    cordova.fireDocumentEvent("offline");
+                    me._timer = null;
+                    }, me.timeout);
+            } else {
+                // If there is a current offline event pending clear it
+                if (me._timer !== null) {
+                    clearTimeout(me._timer);
+                    me._timer = null;
+                }
+                cordova.fireDocumentEvent("online");
+            }
+
+            // should only fire this once
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+        },
+        function (e) {
+            // If we can't get the network info we should still tell Cordova
+            // to fire the deviceready event.
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+            console.log("Error initializing Network Connection: " + e);
+        });
+    });
+};
+
+/**
+ * Get connection info
+ *
+ * @param {Function} successCallback The function to call when the Connection data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)
+ */
+NetworkConnection.prototype.getInfo = function (successCallback, errorCallback) {
+    // Get info
+    exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
+};
+
+module.exports = new NetworkConnection();
+});
+
+// file: lib/common/plugin/notification.js
+define("cordova/plugin/notification", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Provides access to notifications on the device.
+ */
+
+module.exports = {
+
+    /**
+     * Open a native alert dialog, with a customizable title and button text.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} completeCallback   The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Alert)
+     * @param {String} buttonLabel          Label of the close button (default: OK)
+     */
+    alert: function(message, completeCallback, title, buttonLabel) {
+        var _title = (title || "Alert");
+        var _buttonLabel = (buttonLabel || "OK");
+        exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]);
+    },
+
+    /**
+     * Open a native confirm dialog, with a customizable title and button text.
+     * The result that the user selects is returned to the result callback.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Confirm)
+     * @param {String} buttonLabels         Comma separated list of the labels of the buttons (default: 'OK,Cancel')
+     */
+    confirm: function(message, resultCallback, title, buttonLabels) {
+        var _title = (title || "Confirm");
+        var _buttonLabels = (buttonLabels || "OK,Cancel");
+        exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
+    },
+
+    /**
+     * Causes the device to vibrate.
+     *
+     * @param {Integer} mills       The number of milliseconds to vibrate for.
+     */
+    vibrate: function(mills) {
+        exec(null, null, "Notification", "vibrate", [mills]);
+    },
+
+    /**
+     * Causes the device to beep.
+     * On Android, the default notification ringtone is played "count" times.
+     *
+     * @param {Integer} count       The number of beeps.
+     */
+    beep: function(count) {
+        exec(null, null, "Notification", "beep", [count]);
+    }
+};
+});
+
+// file: lib/common/plugin/requestFileSystem.js
+define("cordova/plugin/requestFileSystem", function(require, exports, module) {
+var FileError = require('cordova/plugin/FileError'),
+    FileSystem = require('cordova/plugin/FileSystem'),
+    exec = require('cordova/exec');
+
+/**
+ * Request a file system in which to store application data.
+ * @param type  local file system type
+ * @param size  indicates how much storage space, in bytes, the application expects to need
+ * @param successCallback  invoked with a FileSystem object
+ * @param errorCallback  invoked if error occurs retrieving file system
+ */
+var requestFileSystem = function(type, size, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    if (type < 0 || type > 3) {
+        fail(FileError.SYNTAX_ERR);
+    } else {
+        // if successful, return a FileSystem object
+        var success = function(file_system) {
+            if (file_system) {
+                if (typeof successCallback === 'function') {
+                    // grab the name and root from the file system object
+                    var result = new FileSystem(file_system.name, file_system.root);
+                    successCallback(result);
+                }
+            }
+            else {
+                // no FileSystem object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+        exec(success, fail, "File", "requestFileSystem", [type, size]);
+    }
+};
+
+module.exports = requestFileSystem;
+});
+
+// file: lib/common/plugin/resolveLocalFileSystemURI.js
+define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    FileError = require('cordova/plugin/FileError'),
+    exec = require('cordova/exec');
+
+/**
+ * Look up file system Entry referred to by local URI.
+ * @param {DOMString} uri  URI referring to a local file or directory
+ * @param successCallback  invoked with Entry object corresponding to URI
+ * @param errorCallback    invoked if error occurs retrieving file system entry
+ */
+module.exports = function(uri, successCallback, errorCallback) {
+    // error callback
+    var fail = function(error) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(error));
+        }
+    };
+    // sanity check for 'not:valid:filename'
+    if(!uri || uri.split(":").length > 2) {
+        setTimeout( function() {
+            fail(FileError.ENCODING_ERR);
+        },0);
+        return;
+    }
+    // if successful, return either a file or directory entry
+    var success = function(entry) {
+        var result;
+        if (entry) {
+            if (typeof successCallback === 'function') {
+                // create appropriate Entry object
+                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
+                try {
+                    successCallback(result);
+                }
+                catch (e) {
+                    console.log('Error invoking callback: ' + e);
+                }
+            }
+        }
+        else {
+            // no Entry object returned
+            fail(FileError.NOT_FOUND_ERR);
+        }
+    };
+
+    exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
+};
+
+});
+
+// file: lib/common/plugin/splashscreen.js
+define("cordova/plugin/splashscreen", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+var splashscreen = {
+    show:function() {
+        exec(null, null, "SplashScreen", "show", []);
+    },
+    hide:function() {
+        exec(null, null, "SplashScreen", "hide", []);
+    }
+};
+
+module.exports = splashscreen;
+});
+
+// file: lib/tizen/plugin/tizen/Accelerometer.js
+define("cordova/plugin/tizen/Accelerometer", function(require, exports, module) {
+var callback = null;
+
+module.exports = {
+    start: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+        callback = function (motion) {
+            successCallback({
+                x: motion.accelerationIncludingGravity.x,
+                y: motion.accelerationIncludingGravity.y,
+                z: motion.accelerationIncludingGravity.z,
+                timestamp: motion.timeStamp
+            });
+        };
+        window.addEventListener("devicemotion", callback);
+    },
+    stop: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+    }
+};
+});
+
+// file: lib/tizen/plugin/tizen/Battery.js
+define("cordova/plugin/tizen/Battery", function(require, exports, module) {
+/*global tizen:false */
+var id = null;
+
+module.exports = {
+    start: function(successCallback, errorCallback) {
+        var tizenSuccessCallback = function(power) {
+            if (successCallback) {
+                successCallback({level: Math.round(power.level * 100), isPlugged: power.isCharging});
+            }
+        };
+
+        if (id === null) {
+            id = tizen.systeminfo.addPropertyValueChangeListener("Power", tizenSuccessCallback);
+        }
+        tizen.systeminfo.getPropertyValue("Power", tizenSuccessCallback, errorCallback);
+    },
+
+    stop: function(successCallback, errorCallback) {
+        tizen.systeminfo.removePropertyValueChangeListener(id);
+        id = null;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Camera.js
+define("cordova/plugin/tizen/Camera", function(require, exports, module) {
+/*global tizen:false */
+var Camera = require('cordova/plugin/CameraConstants');
+
+function makeReplyCallback(successCallback, errorCallback) {
+    return {
+        onsuccess: function(reply) {
+            if (reply.length > 0) {
+                successCallback(reply[0].value);
+            } else {
+                errorCallback('Picture selection aborted');
+            }
+        },
+        onfail: function() {
+           console.log('The service launch failed');
+        }
+    };
+}
+
+module.exports = {
+    takePicture: function(successCallback, errorCallback, args) {
+        var destinationType = args[1],
+            sourceType = args[2],
+            encodingType = args[5],
+            mediaType = args[6];
+            // Not supported
+            /*
+            quality = args[0]
+            targetWidth = args[3]
+            targetHeight = args[4]
+            allowEdit = args[7]
+            correctOrientation = args[8]
+            saveToPhotoAlbum = args[9]
+            */
+
+        if (destinationType !== Camera.DestinationType.FILE_URI) {
+            errorCallback('DestinationType not supported');
+            return;
+        }
+        if (mediaType !== Camera.MediaType.PICTURE) {
+            errorCallback('MediaType not supported');
+            return;
+        }
+
+        var mimeType;
+        if (encodingType === Camera.EncodingType.JPEG) {
+            mimeType = 'image/jpeg';
+        } else if (encodingType === Camera.EncodingType.PNG) {
+            mimeType = 'image/png';
+        } else {
+            mimeType = 'image/*';
+        }
+
+        var serviceId;
+        if (sourceType === Camera.PictureSourceType.CAMERA) {
+            serviceId = 'http://tizen.org/appsvc/operation/create_content';
+        } else {
+            serviceId = 'http://tizen.org/appsvc/operation/pick';
+        }
+
+        var service = new tizen.ApplicationService(serviceId, null, mimeType, null);
+        tizen.application.launchService(service, null, null,
+                function(error) { errorCallback(error.message); },
+                makeReplyCallback(successCallback, errorCallback));
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Compass.js
+define("cordova/plugin/tizen/Compass", function(require, exports, module) {
+var CompassError = require('cordova/plugin/CompassError'),
+    callback = null, ready = false;
+
+module.exports = {
+    getHeading: function(successCallback, errorCallback) {
+        if (window.DeviceOrientationEvent !== undefined) {
+            callback = function (orientation) {
+                var heading = 360 - orientation.alpha;
+                if (ready) {
+                    successCallback({
+                        magneticHeading: heading,
+                        trueHeading: heading,
+                        headingAccuracy: 0,
+                        timestamp: orientation.timeStamp
+                    });
+                    window.removeEventListener("deviceorientation", callback);
+                }
+                ready = true;
+            };
+            ready = false; // workaround invalid first event value returned by WRT
+            window.addEventListener("deviceorientation", callback);
+        }
+        else {
+            errorCallback(CompassError.COMPASS_NOT_SUPPORTED);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Contact.js
+define("cordova/plugin/tizen/Contact", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// ------------------
+// Utility functions
+// ------------------
+
+
+/**
+ * Retrieves a Tizen Contact object from the device by its unique id.
+ *
+ * @param uid
+ *            Unique id of the contact on the device
+ * @return {tizen.Contact} Tizen Contact object or null if contact with
+ *         specified id is not found
+ */
+var findByUniqueId = function(id) {
+
+    if (!id) {
+        return null;
+    }
+
+    var tizenContact = null;
+
+    tizen.contact.getDefaultAddressBook().find(
+        function _successCallback(contacts){
+            tizenContact = contacts[0];
+        },
+        function _errorCallback(error){
+            console.log("tizen find error " + error);
+        },
+        new tizen.AttributeFilter('id', 'CONTAINS', id),
+        new tizen.SortMode('id', 'ASC'));
+
+    return tizenContact || null;
+};
+
+
+var traceTizenContact = function (tizenContact) {
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.id " + tizenContact.id);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.lastUpdated " + tizenContact.lastUpdated);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.name " + tizenContact.name);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.account " + tizenContact.account);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.addresses " + tizenContact.addresses);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.photoURI " + tizenContact.photoURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.phoneNumbers " + tizenContact.phoneNumbers);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.emails " + tizenContact.emails);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.birthday " + tizenContact.birthday);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.organization " + tizenContact.organization);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.notes " + tizenContact.notes);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.urls " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.isFavorite " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.ringtonesURI " + tizenContact.ringtonesURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.categories " + tizenContact.categories);
+};
+
+
+/**
+ * Creates a Tizen contact object from the W3C Contact object and persists
+ * it to device storage.
+ *
+ * @param {Contact}
+ *            contact The contact to save
+ * @return a new contact object with all properties set
+ */
+var saveToDevice = function(contact) {
+
+    if (!contact) {
+        return;
+    }
+
+    var tizenContact = null;
+    var update = false;
+    var i = 0;
+
+    // if the underlying Tizen Contact object already exists, retrieve it for
+    // update
+    if (contact.id) {
+        // we must attempt to retrieve the BlackBerry contact from the device
+        // because this may be an update operation
+        tizenContact = findByUniqueId(contact.id);
+    }
+
+    // contact not found on device, create a new one
+    if (!tizenContact) {
+        tizenContact = new tizen.Contact();
+    }
+    // update the existing contact
+    else {
+        update = true;
+    }
+
+    // NOTE: The user may be working with a partial Contact object, because only
+    // user-specified Contact fields are returned from a find operation (blame
+    // the W3C spec). If this is an update to an existing Contact, we don't
+    // want to clear an attribute from the contact database simply because the
+    // Contact object that the user passed in contains a null value for that
+    // attribute. So we only copy the non-null Contact attributes to the
+    // Tizen Contact object before saving.
+    //
+    // This means that a user must explicitly set a Contact attribute to a
+    // non-null value in order to update it in the contact database.
+    //
+    traceTizenContact (tizenContact);
+
+    // display name
+    if (contact.displayName !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            tizenContact.name.displayName = contact.displayName;
+        }
+    }
+
+    // name
+    if (contact.name !== null) {
+        if (contact.name.givenName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.firstName = contact.name.givenName;
+            }
+        }
+
+        if  (contact.name.middleName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.middleName = contact.name.middleName;
+            }
+        }
+
+        if (contact.name.familyName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.lastName = contact.name.familyName;
+            }
+        }
+
+        if (contact.name.honorificPrefix) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.prefix = contact.name.honorificPrefix;
+            }
+        }
+    }
+
+    // nickname
+    if (contact.nickname !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            if (!utils.isArray(tizenContact.name.nicknames))
+            {
+                tizenContact.name.nicknames = [];
+            }
+            tizenContact.name.nicknames[0] = contact.nickname;
+        }
+    }
+    else {
+        tizenContact.name.nicknames = [];
+    }
+
+    // note
+    if (contact.note !== null) {
+        if (tizenContact.note === null) {
+            tizenContact.note = [];
+        }
+        if (tizenContact.note !== null) {
+            tizenContact.note[0] = contact.note;
+        }
+    }
+
+    // photos
+    if (contact.photos && utils.isArray(contact.emails) && contact.emails.length > 0) {
+        tizenContact.photoURI = contact.photos[0];
+    }
+
+    if (utils.isDate(contact.birthday)) {
+        if (!utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday = new Date();
+        }
+        if (utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday.setDate(contact.birthday.getDate());
+        }
+    }
+
+    // Tizen supports many addresses
+    if (utils.isArray(contact.emails)) {
+
+        // if this is an update, re initialize email addresses
+        if (update) {
+            // doit on effacer sur un update??????
+        }
+
+        // copy the first three email addresses found
+        var emails = [];
+        for (i = 0; i < contact.emails.length; i += 1) {
+            var emailTypes = [];
+
+            emailTypes.push (contact.emails[i].type);
+
+            if (contact.emails[i].pref) {
+                emailTypes.push ("PREF");
+            }
+
+            emails.push(
+                new tizen.ContactEmailAddress(
+                    contact.emails[i].value,
+                    emailTypes)
+            );
+        }
+        tizenContact.emails = emails.length > 0 ? emails : [];
+    }
+    else {
+        tizenContact.emails = [];
+    }
+
+    // Tizen supports many phone numbers
+    // copy into appropriate fields based on type
+    if (utils.isArray(contact.phoneNumbers)) {
+        // if this is an update, re-initialize phone numbers
+        if (update) {
+        }
+
+        var phoneNumbers = [];
+
+        for (i = 0; i < contact.phoneNumbers.length; i += 1) {
+
+            if (!contact.phoneNumbers[i] || !contact.phoneNumbers[i].value) {
+                continue;
+            }
+
+             var phoneTypes = [];
+             phoneTypes.push (contact.phoneNumbers[i].type);
+
+             if (contact.phoneNumbers[i].pref) {
+                 phoneTypes.push ("PREF");
+             }
+
+            phoneNumbers.push(
+                new tizen.ContactPhoneNumber(
+                    contact.phoneNumbers[i].value,
+                    phoneTypes)
+            );
+        }
+
+        tizenContact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : [];
+    } else {
+        tizenContact.phoneNumbers = [];
+    }
+
+    if (utils.isArray(contact.addresses)) {
+        // if this is an update, re-initialize addresses
+        if (update) {
+        }
+
+        var addresses = [],
+            address = null;
+
+        for ( i = 0; i < contact.addresses.length; i += 1) {
+            address = contact.addresses[i];
+
+            if (!address || address.id === undefined || address.pref === undefined || address.type === undefined || address.formatted === undefined) {
+                continue;
+            }
+
+            var addressTypes = [];
+            addressTypes.push (address.type);
+
+            if (address.pref) {
+                addressTypes.push ("PREF");
+            }
+
+            addresses.push(
+                new tizen.ContactAddress({
+                         country:                   address.country,
+                         region :                   address.region,
+                         city:                      address.locality,
+                         streetAddress:             address.streetAddress,
+                         additionalInformation:     "",
+                         postalCode:                address.postalCode,
+                         types :                    addressTypes
+                }));
+
+        }
+        tizenContact.addresses = addresses.length > 0 ? addresses : [];
+
+    } else{
+        tizenContact.addresses = [];
+    }
+
+    // copy first url found to BlackBerry 'webpage' field
+    if (utils.isArray(contact.urls)) {
+        // if this is an update, re-initialize web page
+        if (update) {
+        }
+
+        var url = null,
+            urls = [];
+
+        for ( i = 0; i< contact.urls.length; i+= 1) {
+            url = contact.urls[i];
+
+            if (!url || !url.value) {
+                continue;
+            }
+
+            urls.push( new tizen.ContactWebSite(url.value, url.type));
+        }
+        tizenContact.urls = urls.length > 0 ? urls : [];
+    } else{
+        tizenContact.urls = [];
+    }
+
+    if (utils.isArray(contact.organizations && contact.organizations.length > 0) ) {
+        // if this is an update, re-initialize org attributes
+        var organization = contact.organizations[0];
+
+         tizenContact.organization = new tizen.ContacOrganization({
+             name:          organization.name,
+             department:    organization.department,
+             office:        "",
+             title:         organization.title,
+             role:          "",
+             logoURI:       ""
+         });
+    }
+
+    // categories
+    if (utils.isArray(contact.categories)) {
+        tizenContact.categories = [];
+
+        var category = null;
+
+        for (i = 0; i < contact.categories.length; i += 1) {
+            category = contact.categories[i];
+
+            if (typeof category === "string") {
+                tizenContact.categories.push(category);
+            }
+        }
+    }
+    else {
+        tizenContact.categories = [];
+    }
+
+    // save to device
+    // in tizen contact mean update or add
+    // later we might use addBatch and updateBatch
+    if (update){
+        tizen.contact.getDefaultAddressBook().update(tizenContact);
+    }
+    else {
+        tizen.contact.getDefaultAddressBook().add(tizenContact);
+    }
+
+    // Use the fully populated Tizen contact object to create a
+    // corresponding W3C contact object.
+    return ContactUtils.createContact(tizenContact, [ "*" ]);
+};
+
+
+/**
+ * Creates a Tizen ContactAddress object from a W3C ContactAddress.
+ *
+ * @return {tizen.ContactAddress} a Tizen ContactAddress object
+ */
+var createTizenAddress = function(address) {
+
+    var type = null,
+        pref = null,
+        typesAr = [];
+
+    if (address === null) {
+        return null;
+    }
+
+
+    var tizenAddress = new tizen.ContactAddress();
+
+    if (tizenAddress === null) {
+        return null;
+    }
+
+    typesAr.push(address.type);
+
+    if (address.pref) {
+        typesAr.push("PREF");
+    }
+
+    tizenAddress.country = address.country || "";
+    tizenAddress.region = address.region || "";
+    tizenAddress.city = address.locality || "";
+    tizenAddress.streetAddress = address.streetAddress || "";
+    tizenAddress.postalCode = address.postalCode || "";
+    tizenAddress.types = typesAr || "";
+
+    return tizenAddress;
+};
+
+module.exports = {
+    /**
+     * Persists contact to device storage.
+     */
+
+    save : function(successCB, failCB) {
+
+        try {
+            // save the contact and store it's unique id
+            var fullContact = saveToDevice(this);
+
+            this.id = fullContact.id;
+
+            // This contact object may only have a subset of properties
+            // if the save was an update of an existing contact. This is
+            // because the existing contact was likely retrieved using a
+            // subset of properties, so only those properties were set in the
+            // object. For this reason, invoke success with the contact object
+            // returned by saveToDevice since it is fully populated.
+
+            if (typeof successCB === 'function') {
+                successCB(fullContact);
+            }
+        }
+        catch (error) {
+            console.log('Error saving contact: ' +  error);
+
+            if (typeof failCB === 'function') {
+                failCB (new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    },
+
+    /**
+     * Removes contact from device storage.
+     *
+     * @param successCB
+     *            successCB callback
+     * @param failCB
+     *            error callback
+     */
+    remove : function (successCB, failCB) {
+
+        try {
+            // retrieve contact from device by id
+            var tizenContact = null;
+
+            if (this.id) {
+                tizenContact = findByUniqueId(this.id);
+            }
+
+
+            // if contact was found, remove it
+            if (tizenContact) {
+
+                tizen.contact.getDefaultAddressBook().remove(tizenContact.id);
+
+                if (typeof success === 'function') {
+                    successCB(this);
+                }
+            }
+            // attempting to remove a contact that hasn't been saved
+            else if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+        catch (error) {
+            console.log('Error removing contact ' + this.id + ": " + error);
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/ContactUtils.js
+define("cordova/plugin/tizen/ContactUtils", function(require, exports, module) {
+/*global tizen:false */
+var ContactAddress = require('cordova/plugin/ContactAddress'),
+    ContactName = require('cordova/plugin/ContactName'),
+    ContactField = require('cordova/plugin/ContactField'),
+    ContactOrganization = require('cordova/plugin/ContactOrganization'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+ * Mappings for each Contact field that may be used in a find operation. Maps
+ * W3C Contact fields to one or more fields in a Tizen contact object.
+ *
+ * Example: user searches with a filter on the Contact 'name' field:
+ *
+ * <code>Contacts.find(['name'], onSuccess, onFail, {filter:'Bob'});</code>
+ *
+ * The 'name' field does not exist in a Tizen contact. Instead, a filter
+ * expression will be built to search the Tizen contacts using the
+ * Tizen 'title', 'firstName' and 'lastName' fields.
+ */
+var fieldMappings = {
+    "id" : ["id"],
+    "displayName" : ["name.displayName"],
+    "nickname": ["name.nicknames"],
+    "name" : [ "name.prefix", "name.firstName", "name.lastName" ],
+    "phoneNumbers" : ["phoneNumbers.number","phoneNumbers.types"],
+    "emails" : ["emails.types", "emails.email"],
+    "addresses" : ["addresses.country","addresses.region","addresses.city","addresses.streetAddress","addresses.postalCode","addresses.country","addresses.types"],
+    "organizations" : ["organization.name","organization.department","organization.office", "organization.title"],
+    "birthday" : ["birthday"],
+    "note" : ["notes"],
+    "photos" : ["photoURI"],
+    "categories" : ["categories"],
+    "urls" : ["urls.url", "urls.type"]
+};
+
+/*
+ * Build an array of all of the valid W3C Contact fields. This is used to
+ * substitute all the fields when ["*"] is specified.
+ */
+var allFields = [];
+
+(function initializeAllFieldsMapping() {
+
+    for ( var key in fieldMappings) {
+        allFields.push(key);
+    }
+    // as we want it to be executed once
+    function initializeAllFieldsMapping() {
+    }
+
+})();
+
+/**
+ * Create a W3C ContactAddress object from a Tizen Address object
+ *
+ * @param {String}
+ *            type the type of address (e.g. work, home)
+ * @param {tizen.ContactAddress}
+ *            tizenAddress a Tizen Address object
+ * @return {ContactAddress} a contact address object or null if the specified
+ *         address is null
+ */
+var createContactAddress = function(type, tizenAddress) {
+    if (!tizenAddress) {
+        return null;
+    }
+
+    var streetAddress = tizenAddress.streetAddress;
+    var locality = tizenAddress.city || "";
+    var region = tizenAddress.region || "";
+    var postalCode = tizenAddress.postalCode || "";
+    var country = tizenAddress.country || "";
+    var formatted = streetAddress + ", " + locality + ", " + region + ", " + postalCode + ", " + country;
+
+    var contact = new ContactAddress(null, type, formatted, streetAddress, locality, region, postalCode, country);
+
+    return contact;
+};
+
+module.exports = {
+    /**
+     * Builds Tizen filter expressions for contact search using the
+     * contact fields and search filter provided.
+     *
+     * @param {String[]}
+     *            fields Array of Contact fields to search
+     * @param {String}
+     *            filter Filter, or search string
+     * @param {Boolean}
+     *                 multiple, one contacts or more wanted as result
+     * @return filter expression or null if fields is empty or filter is null or
+     *         empty
+     */
+
+    buildFilterExpression: function(fields, filter) {
+        // ensure filter exists
+        if (!filter || filter === "") {
+            return null;
+        }
+
+        if ((fields.length === 1) && (fields[0] === "*")) {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // build a filter expression using all Contact fields provided
+        var compositeFilter = null,
+            attributeFilter = null,
+            filterExpression = null,
+            matchFlag = "CONTAINS",
+            matchValue = filter,
+            attributesArray = [];
+
+        if (fields && utils.isArray(fields)) {
+
+            for ( var field in fields) {
+
+                if (!fields[field]) {
+                    continue;
+                }
+
+                // retrieve Tizen contact fields that map Cordova fields specified
+                // (tizenFields is a string or an array of strings)
+                var tizenFields = fieldMappings[fields[field]];
+
+                if (!tizenFields) {
+                    // does something maps
+                    continue;
+                }
+
+                // construct the filter expression using the Tizen fields
+                for ( var index in tizenFields) {
+                    attributeFilter = new tizen.AttributeFilter(tizenFields[index], matchFlag, matchValue);
+                    if (attributeFilter !== null) {
+                        attributesArray.push(attributeFilter);
+                    }
+                }
+            }
+        }
+
+        // fullfil tizen find attribute as a single or a composite attribute
+        if (attributesArray.length == 1 ) {
+            filterExpression = attributeFilter[0];
+        } else if (attributesArray.length > 1) {
+            // combine the filters as a Union
+            filterExpression = new tizen.CompositeFilter("UNION", attributesArray);
+        } else {
+            filterExpression = null;
+        }
+
+        return filterExpression;
+    },
+
+
+
+    /**
+     * Creates a Contact object from a Tizen Contact object, copying only
+     * the fields specified.
+     *
+     * This is intended as a privately used function but it is made globally
+     * available so that a Contact.save can convert a BlackBerry contact object
+     * into its W3C equivalent.
+     *
+     * @param {tizen.Contact}
+     *            tizenContact Tizen Contact object
+     * @param {String[]}
+     *            fields array of contact fields that should be copied
+     * @return {Contact} a contact object containing the specified fields or
+     *         null if the specified contact is null
+     */
+    createContact: function(tizenContact, fields) {
+
+        if (!tizenContact) {
+            return null;
+        }
+
+        // construct a new contact object
+        // always copy the contact id and displayName fields
+        var contact = new Contact(tizenContact.id, tizenContact.name.displayName);
+
+
+        // nothing to do
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            return contact;
+        } else if (fields.length === 1 && fields[0] === "*") {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // add the fields specified
+        for ( var key in fields) {
+
+            var field = fields[key],
+                index = 0;
+
+            if (!field) {
+                continue;
+            }
+
+            // name
+            if (field.indexOf('name') === 0) {
+
+                var formattedName = (tizenContact.name.prefix || "");
+
+                if (tizenContact.name.firstName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.firstName || "");
+                }
+
+                if (tizenContact.name.middleName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.middleName || "");
+                }
+
+                if (tizenContact.name.lastName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.lastName || "");
+                }
+
+                contact.name = new ContactName(
+                        formattedName,
+                        tizenContact.name.lastName,
+                        tizenContact.name.firstName,
+                        tizenContact.name.middleName,
+                        tizenContact.name.prefix,
+                        null);
+            }
+
+            // phoneNumbers
+            else if (field.indexOf('phoneNumbers') === 0) {
+
+                var phoneNumbers = [];
+
+                for (index = 0 ; index < tizenContact.phoneNumbers.length ; ++index) {
+
+                    phoneNumbers.push(
+                            new ContactField(
+                                    'PHONE',
+                                    tizenContact.phoneNumbers[index].number,
+                                    ((tizenContact.phoneNumbers[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+
+
+                contact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : null;
+            }
+
+            // emails
+            else if (field.indexOf('emails') === 0) {
+
+                var emails = [];
+
+                for (index = 0 ; index < tizenContact.emails.length ; ++index) {
+
+                    emails.push(
+                        new ContactField(
+                            'EMAILS',
+                            tizenContact.emails[index].email,
+                            ((tizenContact.emails[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+                contact.emails = emails.length > 0 ? emails : null;
+            }
+
+            // addresses
+            else if (field.indexOf('addresses') === 0) {
+
+                var addresses = [];
+                for (index = 0 ; index < tizenContact.addresses.length ; ++index) {
+
+                    addresses.push(
+                            new ContactAddress(
+                                    ((tizenContact.addresses[index].types[1] &&  tizenContact.addresses[index].types[1] === "PREF") ? true : false),
+                                    tizenContact.addresses[index].types[0] ? tizenContact.addresses[index].types[0] : "HOME",
+                                    null,
+                                    tizenContact.addresses[index].streetAddress,
+                                    tizenContact.addresses[index].city,
+                                    tizenContact.addresses[index].region,
+                                    tizenContact.addresses[index].postalCode,
+                                    tizenContact.addresses[index].country ));
+                }
+
+                contact.addresses = addresses.length > 0 ? addresses : null;
+            }
+
+            // birthday
+            else if (field.indexOf('birthday') === 0) {
+                if (utils.isDate(tizenContact.birthday)) {
+                    contact.birthday = tizenContact.birthday;
+                }
+            }
+
+            // note only one in Tizen Contact
+            else if (field.indexOf('note') === 0) {
+                if (tizenContact.note) {
+                    contact.note = tizenContact.note[0];
+                }
+            }
+
+            // organizations
+            else if (field.indexOf('organizations') === 0) {
+
+                var organizations = [];
+
+                // there's only one organization in a Tizen Address
+
+                if (tizenContact.organization) {
+                    organizations.push(
+                            new ContactOrganization(
+                                    true,
+                                    'WORK',
+                                    tizenContact.organization.name,
+                                    tizenContact.organization.department,
+                                    tizenContact.organization.jobTitle));
+                }
+
+                contact.organizations = organizations.length > 0 ? organizations : null;
+            }
+
+            // categories
+            else if (field.indexOf('categories') === 0) {
+
+                var categories = [];
+
+                if (tizenContact.categories) {
+
+                    for (index = 0 ; index < tizenContact.categories.length ; ++index) {
+                        categories.push(
+                                new ContactField(
+                                        'MAIN',
+                                        tizenContact.categories,
+                                        (index === 0) ));
+                    }
+
+                    contact.categories = categories.length > 0 ? categories : null;
+                }
+            }
+
+            // urls
+            else if (field.indexOf('urls') === 0) {
+                var urls = [];
+
+                if (tizenContact.urls) {
+                    for (index = 0 ; index <tizenContact.urls.length ; ++index) {
+                        urls.push(
+                                new ContactField(
+                                        tizenContact.urls[index].type,
+                                        tizenContact.urls[index].url,
+                                        (index === 0)));
+                    }
+                }
+
+                contact.urls = urls.length > 0 ? urls : null;
+            }
+
+            // photos
+            else if (field.indexOf('photos') === 0) {
+                var photos = [];
+
+                if (tizenContact.photoURI) {
+                    photos.push(new ContactField('URI', tizenContact.photoURI, true));
+                }
+
+                contact.photos = photos.length > 0 ? photos : null;
+            }
+        }
+
+        return contact;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Device.js
+define("cordova/plugin/tizen/Device", function(require, exports, module) {
+/*global tizen:false */
+var channel = require('cordova/channel');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+function Device() {
+    this.version = null;
+    this.uuid = null;
+    this.name = null;
+    this.cordova =  "2.0.0";
+    this.platform = "Tizen";
+
+    var me = this;
+
+    function onSuccessCallback(sysInfoProp) {
+        me.name = sysInfoProp.model;
+        me.uuid = sysInfoProp.imei;
+        me.version = sysInfoProp.version;
+        channel.onCordovaInfoReady.fire();
+    }
+
+    function onErrorCallback(error) {
+        console.log("error initializing cordova: " + error);
+    }
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getDeviceInfo(onSuccessCallback, onErrorCallback);
+    });
+}
+
+Device.prototype.getDeviceInfo = function(success, fail, args) {
+    tizen.systeminfo.getPropertyValue("Device", success, fail);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/tizen/plugin/tizen/File.js
+define("cordova/plugin/tizen/File", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileError = require('cordova/plugin/FileError'),
+    DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    File = require('cordova/plugin/File'),
+    FileSystem = require('cordova/plugin/FileSystem');
+
+var nativeRequestFileSystem = window.webkitRequestFileSystem,
+    nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL,
+    NativeFileReader = window.FileReader;
+
+function getFileSystemName(nativeFs) {
+    return (nativeFs.name.indexOf("Persistent") != -1) ? "persistent" : "temporary";
+}
+
+function makeEntry(entry) {
+    if (entry.isDirectory) {
+        return new DirectoryEntry(entry.name, decodeURI(entry.toURL()));
+    }
+    else {
+        return new FileEntry(entry.name, decodeURI(entry.toURL()));
+    }
+}
+
+module.exports = {
+    /* requestFileSystem */
+    requestFileSystem: function(successCallback, errorCallback, args) {
+        var type = args[0],
+            size = args[1];
+
+        nativeRequestFileSystem(type, size, function(nativeFs) {
+            successCallback(new FileSystem(getFileSystemName(nativeFs), makeEntry(nativeFs.root)));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* resolveLocalFileSystemURI */
+    resolveLocalFileSystemURI: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            successCallback(makeEntry(entry));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryReader */
+    readEntries: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(dirEntry) {
+            var reader = dirEntry.createReader();
+            reader.readEntries(function(entries) {
+                var retVal = [];
+                for (var i = 0; i < entries.length; i++) {
+                    retVal.push(makeEntry(entries[i]));
+                }
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* Entry */
+    getMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getMetadata(function(metaData) {
+                successCallback(metaData.modificationTime);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    moveTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.moveTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    copyTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.copyTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    remove: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.remove(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getParent: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getParent(function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileEntry */
+    getFileMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.file(function(file) {
+                var retVal = new File(file.name, decodeURI(entry.toURL()), file.type, file.lastModifiedDate, file.size);
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryEntry */
+    getDirectory: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getDirectory(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    removeRecursively: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.removeRecursively(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getFile: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getFile(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileReader */
+    readAsText: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            encoding = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsText(file, encoding);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    readAsDataURL: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsDataURL(file);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileWriter */
+    write: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            text = args[1],
+            position = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.position - position);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                var blob = new WebKitBlobBuilder();
+                blob.append(text);
+
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.seek(position);
+                writer.write(blob.getBlob('text/plain'));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    truncate: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            size = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.length);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.truncate(size);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/FileTransfer.js
+define("cordova/plugin/tizen/FileTransfer", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileEntry = require('cordova/plugin/FileEntry'),
+    FileTransferError = require('cordova/plugin/FileTransferError'),
+    FileUploadResult = require('cordova/plugin/FileUploadResult');
+
+var nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL;
+
+function getParentPath(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(0, pos + 1);
+}
+
+function getFileName(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(pos + 1);
+}
+
+module.exports = {
+    upload: function(successCallback, errorCallback, args) {
+        var filePath = args[0],
+            server = args[1],
+            fileKey = args[2],
+            fileName = args[3],
+            mimeType = args[4],
+            params = args[5],
+            /*trustAllHosts = args[6],*/
+            chunkedMode = args[7];
+
+        nativeResolveLocalFileSystemURI(filePath, function(entry) {
+            entry.file(function(file) {
+                function uploadFile(blobFile) {
+                    var fd = new FormData();
+
+                    fd.append(fileKey, blobFile, fileName);
+                    for (var prop in params) {
+                        if(params.hasOwnProperty(prop)) {
+                            fd.append(prop, params[prop]);
+                        }
+                    }
+
+                    var xhr = new XMLHttpRequest();
+                    xhr.open("POST", server);
+                    xhr.onload = function(evt) {
+                        if (xhr.status == 200) {
+                            var result = new FileUploadResult();
+                            result.bytesSent = file.size;
+                            result.responseCode = xhr.status;
+                            result.response = xhr.response;
+                            successCallback(result);
+                        } else if (xhr.status == 404) {
+                            errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                        } else {
+                            errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                        }
+                    };
+                    xhr.ontimeout = function(evt) {
+                        errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                    };
+
+                    xhr.send(fd);
+                }
+
+                var bytesPerChunk;
+                if (chunkedMode === true) {
+                    bytesPerChunk = 1024 * 1024; // 1MB chunk sizes.
+                } else {
+                    bytesPerChunk = file.size;
+                }
+                var start = 0;
+                var end = bytesPerChunk;
+                while (start < file.size) {
+                    var chunk = file.webkitSlice(start, end, mimeType);
+                    uploadFile(chunk);
+                    start = end;
+                    end = start + bytesPerChunk;
+                }
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            }
+            );
+        },
+        function(error) {
+            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+        }
+        );
+    },
+
+    download: function(successCallback, errorCallback, args) {
+        var url = args[0],
+            filePath = args[1];
+
+        var xhr = new XMLHttpRequest();
+
+        function writeFile(fileEntry) {
+            fileEntry.createWriter(function(writer) {
+                writer.onwriteend = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(new FileEntry(fileEntry.name, fileEntry.toURL()));
+                    } else {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    }
+                };
+
+                writer.onerror = function(evt) {
+                    errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                };
+
+                var builder = new WebKitBlobBuilder();
+                builder.append(xhr.response);
+                var blob = builder.getBlob();
+                writer.write(blob);
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            });
+        }
+
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState == xhr.DONE) {
+                if (xhr.status == 200 && xhr.response) {
+                    nativeResolveLocalFileSystemURI(getParentPath(filePath), function(dir) {
+                        dir.getFile(getFileName(filePath), {create: true}, writeFile, function(error) {
+                            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                        });
+                    }, function(error) {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    });
+                } else if (xhr.status == 404) {
+                    errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                } else {
+                    errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                }
+            }
+        };
+
+        xhr.open("GET", url, true);
+        xhr.responseType = "arraybuffer";
+        xhr.send();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Media.js
+define("cordova/plugin/tizen/Media", function(require, exports, module) {
+/*global Media:false, webkitURL:false */
+var MediaError = require('cordova/plugin/MediaError'),
+    audioObjects = {};
+
+module.exports = {
+    create: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::create() - id =" + id + ", src =" + src);
+        audioObjects[id] = new Audio(src);
+        audioObjects[id].onStalledCB = function () {
+            console.log("media::onStalled()");
+             audioObjects[id].timer = window.setTimeout(function () {
+                    audioObjects[id].pause();
+                    if (audioObjects[id].currentTime !== 0)
+                        audioObjects[id].currentTime = 0;
+                    console.log("media::onStalled() - MEDIA_ERROR -> " + MediaError.MEDIA_ERR_ABORTED);
+                    var err = new MediaError(MediaError.MEDIA_ERR_ABORTED, "Stalled");
+                    Media.onStatus(id, Media.MEDIA_ERROR, err);
+                }, 2000);
+        };
+        audioObjects[id].onEndedCB = function () {
+            console.log("media::onEndedCB() - MEDIA_STATE -> MEDIA_STOPPED");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        };
+        audioObjects[id].onErrorCB = function () {
+            console.log("media::onErrorCB() - MEDIA_ERROR -> " + event.srcElement.error);
+            Media.onStatus(id, Media.MEDIA_ERROR, event.srcElement.error);
+        };
+        audioObjects[id].onPlayCB = function () {
+            console.log("media::onPlayCB() - MEDIA_STATE -> MEDIA_STARTING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING);
+        };
+        audioObjects[id].onPlayingCB = function () {
+            console.log("media::onPlayingCB() - MEDIA_STATE -> MEDIA_RUNNING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING);
+        };
+        audioObjects[id].onDurationChangeCB = function () {
+            console.log("media::onDurationChangeCB() - MEDIA_DURATION -> " +  audioObjects[id].duration);
+            Media.onStatus(id, Media.MEDIA_DURATION, audioObjects[id].duration);
+        };
+        audioObjects[id].onTimeUpdateCB = function () {
+            console.log("media::onTimeUpdateCB() - MEDIA_POSITION -> " +  audioObjects[id].currentTime);
+            Media.onStatus(id, Media.MEDIA_POSITION, audioObjects[id].currentTime);
+        };
+        audioObjects[id].onCanPlayCB = function () {
+            console.log("media::onCanPlayCB()");
+            window.clearTimeout(audioObjects[id].timer);
+            audioObjects[id].play();
+        };
+      },
+    startPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1], options = args[2];
+        console.log("media::startPlayingAudio() - id =" + id + ", src =" + src + ", options =" + options);
+        audioObjects[id].addEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].addEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].addEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].addEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].addEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].addEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].addEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].addEventListener('stalled', audioObjects[id].onStalledCB);
+        audioObjects[id].play();
+    },
+    stopPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        audioObjects[id].pause();
+        if (audioObjects[id].currentTime !== 0)
+            audioObjects[id].currentTime = 0;
+        console.log("media::stopPlayingAudio() - MEDIA_STATE -> MEDIA_STOPPED");
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        audioObjects[id].removeEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].removeEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].removeEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].removeEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].removeEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].removeEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onStalledCB);
+    },
+    seekToAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], milliseconds = args[1];
+        console.log("media::seekToAudio()");
+         audioObjects[id].currentTime = milliseconds;
+        successCallback( audioObjects[id].currentTime);
+    },
+    pausePlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::pausePlayingAudio() - MEDIA_STATE -> MEDIA_PAUSED");
+        audioObjects[id].pause();
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED);
+    },
+    getCurrentPositionAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::getCurrentPositionAudio()");
+        successCallback(audioObjects[id].currentTime);
+    },
+    release: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        console.log("media::release()");
+    },
+    setVolume: function (successCallback, errorCallback, args) {
+        var id = args[0], volume = args[1];
+        console.log("media::setVolume()");
+        audioObjects[id].volume = volume;
+    },
+    startRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::startRecordingAudio() - id =" + id + ", src =" + src);
+
+        function gotStreamCB(stream) {
+            audioObjects[id].src = webkitURL.createObjectURL(stream);
+            console.log("media::startRecordingAudio() - stream CB");
+        }
+
+        function gotStreamFailedCB(error) {
+            console.log("media::startRecordingAudio() - error CB:" + error.toString());
+        }
+
+        if (navigator.webkitGetUserMedia) {
+            audioObjects[id] = new Audio();
+            navigator.webkitGetUserMedia('audio', gotStreamCB, gotStreamFailedCB);
+        } else {
+            console.log("webkitGetUserMedia not supported");
+        }
+        successCallback();
+    },
+    stopRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::stopRecordingAudio() - id =" + id);
+        audioObjects[id].pause();
+        successCallback();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/MediaError.js
+define("cordova/plugin/tizen/MediaError", function(require, exports, module) {
+
+// The MediaError object already exists on Tizen. This prevents the Cordova
+// version from being defined. This object is used to merge in differences
+// between Tizen and Cordova MediaError objects.
+module.exports = {
+        MEDIA_ERR_NONE_ACTIVE : 0,
+        MEDIA_ERR_NONE_SUPPORTED : 4
+};
+});
+
+// file: lib/tizen/plugin/tizen/NetworkStatus.js
+define("cordova/plugin/tizen/NetworkStatus", function(require, exports, module) {
+/*global tizen:false */
+var Connection = require('cordova/plugin/Connection');
+
+module.exports = {
+    getConnectionInfo: function (successCallback, errorCallback) {
+        var cncType = Connection.NONE;
+        var infoCount = 0;
+
+        function infoCB() {
+            infoCount++;
+            if (infoCount > 1)
+               successCallback(cncType);
+        }
+
+        function errorCB(error) {
+           console.log("Error: " + error.code + "," + error.name + "," + error.message);
+           infoCB();
+        }
+
+        function wifiSuccessCB(wifi) {
+            if ((wifi.status === "ON")  && (wifi.ipAddress.length !== 0))
+                cncType = Connection.WIFI;
+            infoCB();
+        }
+
+        function cellularSuccessCB(cell) {
+            if ((cncType === Connection.NONE) && (cell.status === "ON") && (cell.ipAddress.length !== 0))
+                cncType = Connection.CELL_2G;
+            infoCB();
+        }
+
+        if (tizen.systeminfo.isSupported('WifiNetwork')) {
+            tizen.systeminfo.getPropertyValue('WifiNetwork', wifiSuccessCB, errorCB);
+        }
+
+        if (tizen.systeminfo.isSupported('CellularNetwork')) {
+            tizen.systeminfo.getPropertyValue('CellularNetwork', cellularSuccessCB, errorCB);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Notification.js
+define("cordova/plugin/tizen/Notification", function(require, exports, module) {
+module.exports = {
+
+    alert: function(message, alertCallback, title, buttonName) {
+        return this.confirm(message, alertCallback, title, buttonName);
+    },
+
+    confirm: function(message, confirmCallback, title, buttonLabels) {
+        var index = null,
+            overlayElement = null,
+            popup = null,
+            element = null,
+            titleString = null,
+            messageString = null,
+            buttonString = null,
+            buttonsArray = null;
+
+        function initCss() {
+            var id = 'tizen-cordova-css';
+            if (document.getElementById(id))
+                return;
+
+            var rules = {
+                '.ui-popupwindow-screen' :  'background: #000000; opacity: 0.4;',
+                '.ui-popupwindow' : 'background: #828282; padding: 1px 1px; color: white; width: 80%; margin-left: 10%;',
+                '.popup-title' : 'background: #018ccc; padding: 5px 5px;',
+                '.popup-title p' : 'padding: 0px; margin: 0px; text-align: center;',
+                '.popup-text' : 'background: #2d2d2d; padding: 5px 5px;',
+                '.popup-text p' : 'padding: 0px; margin: 0px; text-align: center; vertical-align: middle; line-height:100px;',
+                '.popup-button-bg' : 'background: #424242; padding: 5px 5px;',
+                '.popup-button-bg ul' : 'list-style-type: none; width: 80%; margin-left: 10%; text-align: center; padding: 0px;',
+                '.popup-button-bg li' : 'display: inline;',
+                '.popup-button-bg li input' : 'border-radius: 4px 4px 4px 4px; border: 0px; background: #545454; padding: 5px 15px; color: white; min-width: 80px; margin: 0px 5px;'
+            };
+
+            var css = document.createElement('style');
+            css.type = 'text/css';
+            css.id = id;
+
+            var selector = null;
+            for (selector in rules) {
+                css.appendChild(document.createTextNode(selector + "{ " + rules[selector] + " }"));
+            }
+
+            document.getElementsByTagName("head")[0].appendChild(css);
+        }
+
+        initCss();
+
+        console.log ("message" , message);
+        console.log ("confirmCallback" , confirmCallback);
+        console.log ("title" , title);
+        console.log ("buttonLabels" , buttonLabels);
+
+        titleString = '<div class="popup-title"><p>' + title + '</p></div>';
+        messageString = '<div class="popup-text"><p>' + message + '</p></div>';
+        buttonString = '<div class="popup-button-bg"><ul>';
+
+        switch(typeof(buttonLabels))
+        {
+        case "string":
+            buttonsArray = buttonLabels.split(",");
+
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+
+        case "array":
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+        default:
+            console.log ("cordova/plugin/tizen/Notification, default, buttonLabels: ", buttonLabels);
+            break;
+        }
+
+        buttonString += '</ul></div>';
+
+        overlayElement = document.createElement("div");
+        overlayElement.className = 'ui-popupwindow-screen';
+
+        overlayElement.style.zIndex = 1001;
+        overlayElement.style.width = "100%";
+        overlayElement.style.height = "100%";
+        overlayElement.style.top = 0;
+        overlayElement.style.left = 0;
+        overlayElement.style.margin = 0;
+        overlayElement.style.padding = 0;
+        overlayElement.style.position = "absolute";
+
+        popup = document.createElement("div");
+        popup.className = "ui-popupwindow";
+        popup.style.position = "fixed";
+        popup.style.zIndex = 1002;
+        popup.innerHTML = titleString + messageString + buttonString;
+
+        document.body.appendChild(overlayElement);
+        document.body.appendChild(popup);
+
+        function createListener(button) {
+            return function() {
+                document.body.removeChild(overlayElement);
+                document.body.removeChild(popup);
+                confirmCallback(button.value);
+            };
+        }
+
+       for (index in buttonsArray) {
+           console.log ("index: ", index);
+
+           element = document.getElementById("popup-button-" + buttonsArray[index]);
+           element.addEventListener("click", createListener(element), false);
+       }
+    },
+
+    vibrate: function(milliseconds) {
+        console.log ("milliseconds" , milliseconds);
+
+        if (navigator.vibrate) {
+            navigator.vibrate(milliseconds);
+        }
+        else {
+            console.log ("cordova/plugin/tizen/Notification, vibrate API does not exists");
+        }
+    },
+
+    beep: function(count) {
+            console.log("notification:beep() - count = " + count);
+
+            var beepSound = new Audio("/sounds/beep.wav");
+            beepSound.cpt = 0;
+
+            beepSound.addEventListener('canplay', function () {
+                console.log("notification:beepSound() - canpay CB");
+                this.play();
+            });
+
+            beepSound.addEventListener('ended', function () {
+                console.log("notification:beepSound() - ended CB: cpt = " + this.cpt);
+                if (this.cpt !== 0) {
+                    if (this.currentTime !== 0)
+                        this.currentTime = 0;
+                    this.play();
+                    this.cpt--;
+                }
+            });
+
+            beepSound.addEventListener('error',  function () {
+                    console.log("notification:beepSound() - error CB");
+            });
+
+            beepSound.load();
+            beepSound.pause();
+            if (beepSound.currentTime !== 0)
+                beepSound.currentTime = 0;
+            beepSound.cpt = count - 1;
+            beepSound.play();
+    }
+};
+
+
+
+});
+
+// file: lib/tizen/plugin/tizen/contacts.js
+define("cordova/plugin/tizen/contacts", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils');
+
+module.exports = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     *
+     * @return array of Contacts matching search criteria
+     */
+    find : function(fields, successCB, failCB, options) {
+
+        // Success callback is required. Throw exception if not specified.
+        if (typeof successCB !== 'function') {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+
+        // Search qualifier is required and cannot be empty.
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+            return;
+        }
+
+        // options are optional
+        var filter ="",
+            multiple = false,
+            contacts = [],
+            tizenFilter = null;
+
+        if (options) {
+            filter = options.filter || "";
+            multiple =  options.multiple || false;
+        }
+
+        if (filter){
+            tizenFilter = ContactUtils.buildFilterExpression(fields, filter);
+        }
+
+        tizen.contact.getDefaultAddressBook().find(
+            function(tizenContacts) {
+                if (multiple) {
+                    for (var index in tizenContacts) {
+                        contacts.push(ContactUtils.createContact(tizenContacts[index], fields));
+                    }
+                }
+                else {
+                    contacts.push(ContactUtils.createContact(tizenContacts[0], fields));
+                }
+
+                // return results
+                successCB(contacts);
+            },
+            function(error) {
+                if (typeof failCB === 'function') {
+                    failCB(ContactError.UNKNOWN_ERROR);
+                }
+            },
+            tizenFilter,
+            null);
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/manager.js
+define("cordova/plugin/tizen/manager", function(require, exports, module) {
+var cordova = require('cordova');
+
+module.exports = {
+    exec: function (successCallback, errorCallback, clazz, action, args) {
+        var plugin = require('cordova/plugin/tizen/' + clazz);
+
+        if (plugin && typeof plugin[action] === 'function') {
+            var result = plugin[action](successCallback, errorCallback, args);
+            return result || {status: cordova.callbackStatus.NO_RESULT};
+        }
+
+        return {"status" : cordova.callbackStatus.CLASS_NOT_FOUND_EXCEPTION, "message" : "Function " + clazz + "::" + action + " cannot be found"};
+    },
+    resume: function () {},
+    pause: function () {},
+    destroy: function () {}
+};
+
+});
+
+// file: lib/common/utils.js
+define("cordova/utils", function(require, exports, module) {
+var utils = exports;
+
+/**
+ * Returns an indication of whether the argument is an array or not
+ */
+utils.isArray = function(a) {
+    return Object.prototype.toString.call(a) == '[object Array]';
+};
+
+/**
+ * Returns an indication of whether the argument is a Date or not
+ */
+utils.isDate = function(d) {
+    return Object.prototype.toString.call(d) == '[object Date]';
+};
+
+/**
+ * Does a deep clone of the object.
+ */
+utils.clone = function(obj) {
+    if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
+        return obj;
+    }
+
+    var retVal, i;
+
+    if(utils.isArray(obj)){
+        retVal = [];
+        for(i = 0; i < obj.length; ++i){
+            retVal.push(utils.clone(obj[i]));
+        }
+        return retVal;
+    }
+
+    retVal = {};
+    for(i in obj){
+        if(!(i in retVal) || retVal[i] != obj[i]) {
+            retVal[i] = utils.clone(obj[i]);
+        }
+    }
+    return retVal;
+};
+
+/**
+ * Returns a wrappered version of the function
+ */
+utils.close = function(context, func, params) {
+    if (typeof params == 'undefined') {
+        return function() {
+            return func.apply(context, arguments);
+        };
+    } else {
+        return function() {
+            return func.apply(context, params);
+        };
+    }
+};
+
+/**
+ * Create a UUID
+ */
+utils.createUUID = function() {
+    return UUIDcreatePart(4) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(6);
+};
+
+/**
+ * Extends a child object from a parent object using classical inheritance
+ * pattern.
+ */
+utils.extend = (function() {
+    // proxy used to establish prototype chain
+    var F = function() {};
+    // extend Child from Parent
+    return function(Child, Parent) {
+        F.prototype = Parent.prototype;
+        Child.prototype = new F();
+        Child.__super__ = Parent.prototype;
+        Child.prototype.constructor = Child;
+    };
+}());
+
+/**
+ * Alerts a message in any available way: alert or console.log.
+ */
+utils.alert = function(msg) {
+    if (alert) {
+        alert(msg);
+    } else if (console && console.log) {
+        console.log(msg);
+    }
+};
+
+/**
+ * Formats a string and arguments following it ala sprintf()
+ *
+ * see utils.vformat() for more information
+ */
+utils.format = function(formatString /* ,... */) {
+    var args = [].slice.call(arguments, 1);
+    return utils.vformat(formatString, args);
+};
+
+/**
+ * Formats a string and arguments following it ala vsprintf()
+ *
+ * format chars:
+ *   %j - format arg as JSON
+ *   %o - format arg as JSON
+ *   %c - format arg as ''
+ *   %% - replace with '%'
+ * any other char following % will format it's
+ * arg via toString().
+ *
+ * for rationale, see FireBug's Console API:
+ *    http://getfirebug.com/wiki/index.php/Console_API
+ */
+utils.vformat = function(formatString, args) {
+    if (formatString === null || formatString === undefined) return "";
+    if (arguments.length == 1) return formatString.toString();
+    if (typeof formatString != "string") return formatString.toString();
+
+    var pattern = /(.*?)%(.)(.*)/;
+    var rest    = formatString;
+    var result  = [];
+
+    while (args.length) {
+        var arg   = args.shift();
+        var match = pattern.exec(rest);
+
+        if (!match) break;
+
+        rest = match[3];
+
+        result.push(match[1]);
+
+        if (match[2] == '%') {
+            result.push('%');
+            args.unshift(arg);
+            continue;
+        }
+
+        result.push(formatted(arg, match[2]));
+    }
+
+    result.push(rest);
+
+    return result.join('');
+};
+
+//------------------------------------------------------------------------------
+function UUIDcreatePart(length) {
+    var uuidpart = "";
+    for (var i=0; i<length; i++) {
+        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
+        if (uuidchar.length == 1) {
+            uuidchar = "0" + uuidchar;
+        }
+        uuidpart += uuidchar;
+    }
+    return uuidpart;
+}
+
+//------------------------------------------------------------------------------
+function formatted(object, formatChar) {
+
+    try {
+        switch(formatChar) {
+            case 'j':
+            case 'o': return JSON.stringify(object);
+            case 'c': return '';
+        }
+    }
+    catch (e) {
+        return "error JSON.stringify()ing argument: " + e;
+    }
+
+    if ((object === null) || (object === undefined)) {
+        return Object.prototype.toString.call(object);
+    }
+
+    return object.toString();
+}
+
+});
+
+
+window.cordova = require('cordova');
+
+// file: lib/scripts/bootstrap.js
+(function (context) {
+    var channel = require("cordova/channel"),
+        _self = {
+            boot: function () {
+                /**
+                 * Create all cordova objects once page has fully loaded and native side is ready.
+                 */
+                channel.join(function() {
+                    var builder = require('cordova/builder'),
+                        base = require('cordova/common'),
+                        platform = require('cordova/platform');
+
+                    // Drop the common globals into the window object, but be nice and don't overwrite anything.
+                    builder.build(base.objects).intoButDontClobber(window);
+
+                    // Drop the platform-specific globals into the window object
+                    // and clobber any existing object.
+                    builder.build(platform.objects).intoAndClobber(window);
+
+                    // Merge the platform-specific overrides/enhancements into
+                    // the window object.
+                    if (typeof platform.merges !== 'undefined') {
+                        builder.build(platform.merges).intoAndMerge(window);
+                    }
+
+                    // Call the platform-specific initialization
+                    platform.initialize();
+
+                    // Fire event to notify that all objects are created
+                    channel.onCordovaReady.fire();
+
+                    // Fire onDeviceReady event once all constructors have run and
+                    // cordova info has been received from native side.
+                    channel.join(function() {
+                        require('cordova').fireDocumentEvent('deviceready');
+                    }, channel.deviceReadyChannelsArray);
+
+                }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);
+            }
+        };
+
+    // boot up once native side is ready
+    channel.onNativeReady.subscribeOnce(_self.boot);
+
+    // _nativeReady is global variable that the native side can set
+    // to signify that the native code is ready. It is a global since
+    // it may be called before any cordova JS is ready.
+    if (window._nativeReady) {
+        channel.onNativeReady.fire();
+    }
+
+}(window));
+
+// file: lib/scripts/bootstrap-tizen.js
+require('cordova/channel').onNativeReady.fire();
+
+
+})();
\ No newline at end of file
diff --git a/templates/CordovaBasicTemplate/project/css/style.css b/templates/CordovaBasicTemplate/project/css/style.css
new file mode 100644
index 0000000..3f12cd3
--- /dev/null
+++ b/templates/CordovaBasicTemplate/project/css/style.css
@@ -0,0 +1,120 @@
+* {
+    font-family: Lucida Sans, Arial, Helvetica, sans-serif;
+}
+
+body {
+    margin: 0px auto;
+}
+
+header h1 {
+    font-size: 36px;
+    margin: 0px;
+}
+
+header h2 {
+    font-size: 18px;
+    margin: 0px;
+    color: #888;
+    font-style: italic;
+}
+
+nav ul {
+    list-style: none;
+    padding: 0px;
+    display: block;
+    clear: right;
+    background-color: #666;
+    padding-left: 4px;
+    height: 24px;
+}
+
+nav ul li {
+    display: inline;
+    padding: 0px 20px 5px 10px;
+    height: 24px;
+    border-right: 1px solid #ccc;
+}
+
+nav ul li a {
+    color: #EFD3D3;
+    text-decoration: none;
+    font-size: 13px;
+    font-weight: bold;
+}
+
+nav ul li a:hover {
+    color: #fff;
+}
+
+article > header h1 {
+    font-size: 20px;
+    margin-left: 14px;
+}
+
+article > header h1 a {
+    color: #993333;
+}
+
+article > header h1 img {
+    vertical-align:middle;
+}
+
+article > section header h1 {
+    font-size: 16px;
+}
+
+article p {
+    clear: both;
+}
+
+article > section video {
+    width: 480px;
+    height: 200px;
+}
+
+article > section div.no-html5-video,
+article > section div#no-canvas {
+    width: 480px;
+    height: 40px;
+    border: 1px solid #993333;
+    text-align: center;
+    color: #993333;
+    font-size: 13px;
+    font-style: italic;
+    background-color: #F7E9E9;
+}
+
+article > section div#no-canvas {
+    display: none;
+}
+
+article > section form {
+    border: 1px solid #888;
+    -moz-border-radius: 10px;
+    -webkit-border-radius: 10px;
+    border-radius: 10px;    
+    -moz-box-shadow: 10px 10px 5px #888;
+    -webkit-box-shadow: 10px 10px 5px #888;
+    box-shadow: 10px 10px 5px #888;
+    background-color: #eee;
+    padding: 10px;
+    margin-bottom: 30px;
+}
+
+article > section label {
+    font-weight: bold;
+    font-size: 13px;
+}
+
+article > section input {
+    margin-bottom: 3px;
+    font-size: 13px;
+}
+
+footer p {
+    text-align: center;
+    font-size: 12px;
+    color: #888;
+    margin-top: 24px;
+}
+
diff --git a/templates/CordovaBasicTemplate/project/icon.png b/templates/CordovaBasicTemplate/project/icon.png
new file mode 100755
index 0000000..eef3cd9
--- /dev/null
+++ b/templates/CordovaBasicTemplate/project/icon.png
Binary files differ
diff --git a/templates/CordovaBasicTemplate/project/images/ic_cordova_32.png b/templates/CordovaBasicTemplate/project/images/ic_cordova_32.png
new file mode 100755
index 0000000..b6fbeb8
--- /dev/null
+++ b/templates/CordovaBasicTemplate/project/images/ic_cordova_32.png
Binary files differ
diff --git a/templates/CordovaBasicTemplate/project/index.html b/templates/CordovaBasicTemplate/project/index.html
new file mode 100644
index 0000000..4f47a15
--- /dev/null
+++ b/templates/CordovaBasicTemplate/project/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, target-densityDpi=device-dpi">
+    <meta name="description" content="Cordova Tizen basic template generated by Tizen Web IDE"/>
+
+    <title>Tizen Web IDE - Tizen - Tizen basic Application</title>
+
+    <script type="text/javascript" src="cordova-2.0.0.js"></script>
+
+    <link rel="stylesheet" type="text/css" href="css/style.css"/>
+    <script src="js/main.js"></script>
+</head>
+
+<body>
+  <header>
+    <hgroup>
+      <h1>Tizen Cordova Application</h1>
+      <h2>An empty template of a Cordova Tizen application</h2>
+    </hgroup>
+  </header>
+
+  <nav>
+    <ul>
+       <li><a href="#">Home</a></li>
+       <li><a href="#">About Us</a></li>
+       <li><a href="#">Contact Us</a></li>
+    </ul>
+  </nav>
+
+  <article>
+    <header>
+      <h1>
+        <img src="images/ic_cordova_32.png" /> Application Name
+      </h1>
+    </header>
+    <p>This is an empty template of a Cordova Tizen Web Application. Tizen will support multiple device categories:
+      <ul>
+        <li>smartphones, tablets and smart TVs
+        <li>netbooks, in-vehicle infotainment devices
+      </ul>
+    </p>
+    <section>
+      <p>This is a basic section of a document.</p>
+      <p>The following button displays live battery info by using the Cordova JavaScript API.</p>
+      <div id="divbutton1">
+        <button onclick="startBatteryInfoMonitoring();">Battery Info</button>
+      </div>
+    </section>
+  </article>
+
+  <footer>
+    <p>&copy; 2012 Company Name. All rights reserved.</p>
+  </footer>    
+</body>
+</html>
diff --git a/templates/CordovaBasicTemplate/project/js/main.js b/templates/CordovaBasicTemplate/project/js/main.js
new file mode 100644
index 0000000..eccea34
--- /dev/null
+++ b/templates/CordovaBasicTemplate/project/js/main.js
@@ -0,0 +1,25 @@
+var deviceReady = false;
+
+function startBatteryInfoMonitoring() {
+	window.addEventListener("batterystatus", function (info) {
+		var batteryInfoStr = "Level = " + info.level + "%, Status: " + ((info.isPlugged) ? "Plugged" : "Unplugged");
+		document.getElementById('divbutton1').innerHTML = batteryInfoStr;
+	}, false);
+}
+
+// Initialize function called when page loading is finished
+var init = function () {
+    console.log("init() called");
+    document.addEventListener("deviceready", function() {
+        deviceReady = true;
+        console.log("Device = " + device.platform + ", Version = " + device.version);
+    }, false);
+
+    window.setTimeout(function() {
+        if (!deviceReady) {
+            alert("Cordova initialization failed !!!");
+        }
+    }, 1000);
+};
+
+window.onload = init;
diff --git a/templates/CordovaBasicTemplate/project/sounds/beep.wav b/templates/CordovaBasicTemplate/project/sounds/beep.wav
new file mode 100644
index 0000000..1e9797c
--- /dev/null
+++ b/templates/CordovaBasicTemplate/project/sounds/beep.wav
Binary files differ
diff --git a/templates/CordovaBasicTemplate/snapshot.png b/templates/CordovaBasicTemplate/snapshot.png
new file mode 100644
index 0000000..cdaa756
--- /dev/null
+++ b/templates/CordovaBasicTemplate/snapshot.png
Binary files differ
diff --git a/templates/CordovaBasicTemplate/tizen-app-template.xml b/templates/CordovaBasicTemplate/tizen-app-template.xml
new file mode 100644
index 0000000..8400029
--- /dev/null
+++ b/templates/CordovaBasicTemplate/tizen-app-template.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tizen-app-template  xmlns="http://www.s-core.com/tizen-app-template" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.s-core.com/tizen-app-template tizen-app-template.xsd "
+sdk-version="1.0 beta" template-version="0.2" 
+icon64="ic_cordova_64.png" icon32="ic_cordova_32.png">
+    <template-name>CordovaBasicTemplate</template-name>
+    <widget-type>TIZEN</widget-type>
+    <description-file-name>description.xml</description-file-name>
+</tizen-app-template>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/description.xml b/templates/CordovaTizenWebUIFrameworkTemplate/description.xml
new file mode 100644
index 0000000..d165a84
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/description.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet type="text/xsl" href="../description.xsl"?>
+<Overview version="0.2">
+  <SampleName>Cordova Tizen Web UI Framework Application</SampleName>
+  <SampleVersion></SampleVersion>
+  <Preview>snapshot.png</Preview>
+  <Description>
+    Cordova Single-Page Application based on Tizen Web UI Framework.
+  </Description>
+</Overview>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/ic_cordova_32.png b/templates/CordovaTizenWebUIFrameworkTemplate/ic_cordova_32.png
new file mode 100755
index 0000000..b6fbeb8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/ic_cordova_32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/ic_cordova_64.png b/templates/CordovaTizenWebUIFrameworkTemplate/ic_cordova_64.png
new file mode 100755
index 0000000..eef3cd9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/ic_cordova_64.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/config.xml b/templates/CordovaTizenWebUIFrameworkTemplate/project/config.xml
new file mode 100644
index 0000000..ea5b13f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/config.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" version="2.0 Beta" viewmodes="fullscreen" id="http://YourDomain.com/cordova-web-ui-template">  
+	<icon src="icon.png"/>  
+	<content src="index.html"/>  
+	<feature name="http://tizen.org/api/application" required="true"/>  
+	<feature name="http://tizen.org/api/application.kill" required="true"/>  
+	<feature name="http://tizen.org/api/application.launch" required="true"/>  
+	<feature name="http://tizen.org/api/application.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact" required="true"/>  
+	<feature name="http://tizen.org/api/contact.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact.write" required="true"/>  
+	<feature name="http://tizen.org/api/systeminfo" required="true"/>  
+	<feature name="http://tizen.org/api/time" required="true"/>  
+	<feature name="http://tizen.org/api/time.read" required="true"/>  
+	<feature name="http://tizen.org/api/time.write" required="true"/>  
+	<feature name="http://tizen.org/api/tizen" required="true"/>  
+	<name>cordova-web-ui-template</name>
+</widget>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/cordova-2.0.0.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/cordova-2.0.0.js
new file mode 100644
index 0000000..ee17d0d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/cordova-2.0.0.js
@@ -0,0 +1,6957 @@
+// commit 870218e03979cb7fb6fcae8cd8532008d163d6cc
+
+// File generated at :: Thu Aug 02 2012 17:18:02 GMT+0200 (CEST)
+
+/*
+ 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.
+*/
+
+;(function() {
+
+// file: lib/scripts/require.js
+var require,
+    define;
+
+(function () {
+    var modules = {};
+
+    function build(module) {
+        var factory = module.factory;
+        module.exports = {};
+        delete module.factory;
+        factory(require, module.exports, module);
+        return module.exports;
+    }
+
+    require = function (id) {
+        if (!modules[id]) {
+            throw "module " + id + " not found";
+        }
+        return modules[id].factory ? build(modules[id]) : modules[id].exports;
+    };
+
+    define = function (id, factory) {
+        if (modules[id]) {
+            throw "module " + id + " already defined";
+        }
+
+        modules[id] = {
+            id: id,
+            factory: factory
+        };
+    };
+
+    define.remove = function (id) {
+        delete modules[id];
+    };
+
+})();
+
+//Export for use in node
+if (typeof module === "object" && typeof require === "function") {
+    module.exports.require = require;
+    module.exports.define = define;
+}
+// file: lib/cordova.js
+define("cordova", function(require, exports, module) {
+var channel = require('cordova/channel');
+
+/**
+ * Listen for DOMContentLoaded and notify our channel subscribers.
+ */
+document.addEventListener('DOMContentLoaded', function() {
+    channel.onDOMContentLoaded.fire();
+}, false);
+if (document.readyState == 'complete' || document.readyState == 'interactive') {
+    channel.onDOMContentLoaded.fire();
+}
+
+/**
+ * Intercept calls to addEventListener + removeEventListener and handle deviceready,
+ * resume, and pause events.
+ */
+var m_document_addEventListener = document.addEventListener;
+var m_document_removeEventListener = document.removeEventListener;
+var m_window_addEventListener = window.addEventListener;
+var m_window_removeEventListener = window.removeEventListener;
+
+/**
+ * Houses custom event handlers to intercept on document + window event listeners.
+ */
+var documentEventHandlers = {},
+    windowEventHandlers = {};
+
+document.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof documentEventHandlers[e] != 'undefined') {
+        if (evt === 'deviceready') {
+            documentEventHandlers[e].subscribeOnce(handler);
+        } else {
+            documentEventHandlers[e].subscribe(handler);
+        }
+    } else {
+        m_document_addEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof windowEventHandlers[e] != 'undefined') {
+        windowEventHandlers[e].subscribe(handler);
+    } else {
+        m_window_addEventListener.call(window, evt, handler, capture);
+    }
+};
+
+document.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof documentEventHandlers[e] != "undefined") {
+        documentEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_document_removeEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof windowEventHandlers[e] != "undefined") {
+        windowEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_window_removeEventListener.call(window, evt, handler, capture);
+    }
+};
+
+function createEvent(type, data) {
+    var event = document.createEvent('Events');
+    event.initEvent(type, false, false);
+    if (data) {
+        for (var i in data) {
+            if (data.hasOwnProperty(i)) {
+                event[i] = data[i];
+            }
+        }
+    }
+    return event;
+}
+
+if(typeof window.console === "undefined") {
+    window.console = {
+        log:function(){}
+    };
+}
+
+var cordova = {
+    define:define,
+    require:require,
+    /**
+     * Methods to add/remove your own addEventListener hijacking on document + window.
+     */
+    addWindowEventHandler:function(event, opts) {
+        return (windowEventHandlers[event] = channel.create(event, opts));
+    },
+    addDocumentEventHandler:function(event, opts) {
+        return (documentEventHandlers[event] = channel.create(event, opts));
+    },
+    removeWindowEventHandler:function(event) {
+        delete windowEventHandlers[event];
+    },
+    removeDocumentEventHandler:function(event) {
+        delete documentEventHandlers[event];
+    },
+    /**
+     * Retreive original event handlers that were replaced by Cordova
+     *
+     * @return object
+     */
+    getOriginalHandlers: function() {
+        return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
+        'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
+    },
+    /**
+     * Method to fire event from native code
+     */
+    fireDocumentEvent: function(type, data) {
+        var evt = createEvent(type, data);
+        if (typeof documentEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                documentEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            document.dispatchEvent(evt);
+        }
+    },
+    fireWindowEvent: function(type, data) {
+        var evt = createEvent(type,data);
+        if (typeof windowEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                windowEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            window.dispatchEvent(evt);
+        }
+    },
+    // TODO: this is Android only; think about how to do this better
+    shuttingDown:false,
+    UsePolling:false,
+    // END TODO
+
+    // TODO: iOS only
+    // This queue holds the currently executing command and all pending
+    // commands executed with cordova.exec().
+    commandQueue:[],
+    // Indicates if we're currently in the middle of flushing the command
+    // queue on the native side.
+    commandQueueFlushing:false,
+    // END TODO
+    /**
+     * Plugin callback mechanism.
+     */
+    callbackId: 0,
+    callbacks:  {},
+    callbackStatus: {
+        NO_RESULT: 0,
+        OK: 1,
+        CLASS_NOT_FOUND_EXCEPTION: 2,
+        ILLEGAL_ACCESS_EXCEPTION: 3,
+        INSTANTIATION_EXCEPTION: 4,
+        MALFORMED_URL_EXCEPTION: 5,
+        IO_EXCEPTION: 6,
+        INVALID_ACTION: 7,
+        JSON_EXCEPTION: 8,
+        ERROR: 9
+    },
+
+    /**
+     * Called by native code when returning successful result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackSuccess: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+
+            // If result is to be sent to callback
+            if (args.status == cordova.callbackStatus.OK) {
+                try {
+                    if (cordova.callbacks[callbackId].success) {
+                        cordova.callbacks[callbackId].success(args.message);
+                    }
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+callbackId+" = "+e);
+                }
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+
+    /**
+     * Called by native code when returning error result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackError: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+            try {
+                if (cordova.callbacks[callbackId].fail) {
+                    cordova.callbacks[callbackId].fail(args.message);
+                }
+            }
+            catch (e) {
+                console.log("Error in error callback: "+callbackId+" = "+e);
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+    addConstructor: function(func) {
+        channel.onCordovaReady.subscribeOnce(function() {
+            try {
+                func();
+            } catch(e) {
+                console.log("Failed to run constructor: " + e);
+            }
+        });
+    }
+};
+
+// Register pause, resume and deviceready channels as events on document.
+channel.onPause = cordova.addDocumentEventHandler('pause');
+channel.onResume = cordova.addDocumentEventHandler('resume');
+channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
+
+module.exports = cordova;
+
+});
+
+// file: lib/common/builder.js
+define("cordova/builder", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+function each(objects, func, context) {
+    for (var prop in objects) {
+        if (objects.hasOwnProperty(prop)) {
+            func.apply(context, [objects[prop], prop]);
+        }
+    }
+}
+
+function include(parent, objects, clobber, merge) {
+    each(objects, function (obj, key) {
+        try {
+          var result = obj.path ? require(obj.path) : {};
+
+          if (clobber) {
+              // Clobber if it doesn't exist.
+              if (typeof parent[key] === 'undefined') {
+                  parent[key] = result;
+              } else if (typeof obj.path !== 'undefined') {
+                  // If merging, merge properties onto parent, otherwise, clobber.
+                  if (merge) {
+                      recursiveMerge(parent[key], result);
+                  } else {
+                      parent[key] = result;
+                  }
+              }
+              result = parent[key];
+          } else {
+            // Overwrite if not currently defined.
+            if (typeof parent[key] == 'undefined') {
+              parent[key] = result;
+            } else if (merge && typeof obj.path !== 'undefined') {
+              // If merging, merge parent onto result
+              recursiveMerge(result, parent[key]);
+              parent[key] = result;
+            } 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);
+          }
+        } catch(e) {
+          utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');
+        }
+    });
+}
+
+/**
+ * Merge properties from one object onto another recursively.  Properties from
+ * the src object will overwrite existing target property.
+ *
+ * @param target Object to merge properties into.
+ * @param src Object to merge properties from.
+ */
+function recursiveMerge(target, src) {
+    for (var prop in src) {
+        if (src.hasOwnProperty(prop)) {
+            if (typeof target.prototype !== 'undefined' && target.prototype.constructor === target) {
+                // If the target object is a constructor override off prototype.
+                target.prototype[prop] = src[prop];
+            } else {
+                target[prop] = typeof src[prop] === 'object' ? recursiveMerge(
+                        target[prop], src[prop]) : src[prop];
+            }
+        }
+    }
+    return target;
+}
+
+module.exports = {
+    build: function (objects) {
+        return {
+            intoButDontClobber: function (target) {
+                include(target, objects, false, false);
+            },
+            intoAndClobber: function(target) {
+                include(target, objects, true, false);
+            },
+            intoAndMerge: function(target) {
+                include(target, objects, true, true);
+            }
+        };
+    }
+};
+
+});
+
+// file: lib/common/channel.js
+define("cordova/channel", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+/**
+ * Custom pub-sub "channel" that can have functions subscribed to it
+ * This object is used to define and control firing of events for
+ * cordova initialization.
+ *
+ * The order of events during page load and Cordova startup is as follows:
+ *
+ * onDOMContentLoaded         Internal event that is received when the web page is loaded and parsed.
+ * onNativeReady              Internal event that indicates the Cordova native side is ready.
+ * onCordovaReady             Internal event fired when all Cordova JavaScript objects have been created.
+ * onCordovaInfoReady         Internal event fired when device properties are available.
+ * onCordovaConnectionReady   Internal event fired when the connection property has been set.
+ * onDeviceReady              User event fired to indicate that Cordova is ready
+ * onResume                   User event fired to indicate a start/resume lifecycle event
+ * onPause                    User event fired to indicate a pause lifecycle event
+ * onDestroy                  Internal event fired when app is being destroyed (User should use window.onunload event, not this one).
+ *
+ * The only Cordova events that user code should register for are:
+ *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
+ *      pause                 App has moved to background
+ *      resume                App has returned to foreground
+ *
+ * Listeners can be registered as:
+ *      document.addEventListener("deviceready", myDeviceReadyListener, false);
+ *      document.addEventListener("resume", myResumeListener, false);
+ *      document.addEventListener("pause", myPauseListener, false);
+ *
+ * The DOM lifecycle events should be used for saving and restoring state
+ *      window.onload
+ *      window.onunload
+ *
+ */
+
+/**
+ * Channel
+ * @constructor
+ * @param type  String the channel name
+ * @param opts  Object options to pass into the channel, currently
+ *                     supports:
+ *                     onSubscribe: callback that fires when
+ *                       something subscribes to the Channel. Sets
+ *                       context to the Channel.
+ *                     onUnsubscribe: callback that fires when
+ *                       something unsubscribes to the Channel. Sets
+ *                       context to the Channel.
+ */
+var Channel = function(type, opts) {
+    this.type = type;
+    this.handlers = {};
+    this.numHandlers = 0;
+    this.guid = 1;
+    this.fired = false;
+    this.enabled = true;
+    this.events = {
+        onSubscribe:null,
+        onUnsubscribe:null
+    };
+    if (opts) {
+        if (opts.onSubscribe) this.events.onSubscribe = opts.onSubscribe;
+        if (opts.onUnsubscribe) this.events.onUnsubscribe = opts.onUnsubscribe;
+    }
+},
+    channel = {
+        /**
+         * Calls the provided function only after all of the channels specified
+         * have been fired.
+         */
+        join: function (h, c) {
+            var i = c.length;
+            var len = i;
+            var f = function() {
+                if (!(--i)) h();
+            };
+            for (var j=0; j<len; j++) {
+                !c[j].fired?c[j].subscribeOnce(f):i--;
+            }
+            if (!i) h();
+        },
+        create: function (type, opts) {
+            channel[type] = new Channel(type, opts);
+            return channel[type];
+        },
+
+        /**
+         * cordova Channels that must fire before "deviceready" is fired.
+         */
+        deviceReadyChannelsArray: [],
+        deviceReadyChannelsMap: {},
+
+        /**
+         * Indicate that a feature needs to be initialized before it is ready to be used.
+         * This holds up Cordova's "deviceready" event until the feature has been initialized
+         * and Cordova.initComplete(feature) is called.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        waitForInitialization: function(feature) {
+            if (feature) {
+                var c = null;
+                if (this[feature]) {
+                    c = this[feature];
+                }
+                else {
+                    c = this.create(feature);
+                }
+                this.deviceReadyChannelsMap[feature] = c;
+                this.deviceReadyChannelsArray.push(c);
+            }
+        },
+
+        /**
+         * Indicate that initialization code has completed and the feature is ready to be used.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        initializationComplete: function(feature) {
+            var c = this.deviceReadyChannelsMap[feature];
+            if (c) {
+                c.fire();
+            }
+        }
+    };
+
+function forceFunction(f) {
+    if (f === null || f === undefined || typeof f != 'function') throw "Function required as first argument!";
+}
+
+/**
+ * Subscribes the given function to the channel. Any time that
+ * Channel.fire is called so too will the function.
+ * Optionally specify an execution context for the function
+ * and a guid that can be used to stop subscribing to the channel.
+ * Returns the guid.
+ */
+Channel.prototype.subscribe = function(f, c, g) {
+    // need a function to call
+    forceFunction(f);
+
+    var func = f;
+    if (typeof c == "object") { func = utils.close(c, f); }
+
+    g = g || func.observer_guid || f.observer_guid;
+    if (!g) {
+        // first time we've seen this subscriber
+        g = this.guid++;
+    }
+    else {
+        // subscriber already handled; dont set it twice
+        return g;
+    }
+    func.observer_guid = g;
+    f.observer_guid = g;
+    this.handlers[g] = func;
+    this.numHandlers++;
+    if (this.events.onSubscribe) this.events.onSubscribe.call(this);
+    if (this.fired) func.call(this);
+    return g;
+};
+
+/**
+ * Like subscribe but the function is only called once and then it
+ * auto-unsubscribes itself.
+ */
+Channel.prototype.subscribeOnce = function(f, c) {
+    // need a function to call
+    forceFunction(f);
+
+    var g = null;
+    var _this = this;
+    var m = function() {
+        f.apply(c || null, arguments);
+        _this.unsubscribe(g);
+    };
+    if (this.fired) {
+        if (typeof c == "object") { f = utils.close(c, f); }
+        f.apply(this, this.fireArgs);
+    } else {
+        g = this.subscribe(m);
+    }
+    return g;
+};
+
+/**
+ * Unsubscribes the function with the given guid from the channel.
+ */
+Channel.prototype.unsubscribe = function(g) {
+    // need a function to unsubscribe
+    if (g === null || g === undefined) { throw "You must pass _something_ into Channel.unsubscribe"; }
+
+    if (typeof g == 'function') { g = g.observer_guid; }
+    var handler = this.handlers[g];
+    if (handler) {
+        if (handler.observer_guid) handler.observer_guid=null;
+        this.handlers[g] = null;
+        delete this.handlers[g];
+        this.numHandlers--;
+        if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
+    }
+};
+
+/**
+ * Calls all functions subscribed to this channel.
+ */
+Channel.prototype.fire = function(e) {
+    if (this.enabled) {
+        var fail = false;
+        this.fired = true;
+        for (var item in this.handlers) {
+            var handler = this.handlers[item];
+            if (typeof handler == 'function') {
+                var rv = (handler.apply(this, arguments)===false);
+                fail = fail || rv;
+            }
+        }
+        this.fireArgs = arguments;
+        return !fail;
+    }
+    return true;
+};
+
+// defining them here so they are ready super fast!
+// DOM event that is received when the web page is loaded and parsed.
+channel.create('onDOMContentLoaded');
+
+// Event to indicate the Cordova native side is ready.
+channel.create('onNativeReady');
+
+// Event to indicate that all Cordova JavaScript objects have been created
+// and it's time to run plugin constructors.
+channel.create('onCordovaReady');
+
+// Event to indicate that device properties are available
+channel.create('onCordovaInfoReady');
+
+// Event to indicate that the connection property has been set.
+channel.create('onCordovaConnectionReady');
+
+// Event to indicate that Cordova is ready
+channel.create('onDeviceReady');
+
+// Event to indicate a resume lifecycle event
+channel.create('onResume');
+
+// Event to indicate a pause lifecycle event
+channel.create('onPause');
+
+// Event to indicate a destroy lifecycle event
+channel.create('onDestroy');
+
+// Channels that must fire before "deviceready" is fired.
+channel.waitForInitialization('onCordovaReady');
+channel.waitForInitialization('onCordovaConnectionReady');
+
+module.exports = channel;
+
+});
+
+// file: lib/common/common.js
+define("cordova/common", function(require, exports, module) {
+module.exports = {
+    objects: {
+        cordova: {
+            path: 'cordova',
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                },
+                logger: {
+                    path: 'cordova/plugin/logger'
+                }
+            }
+        },
+        Cordova: {
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        PhoneGap:{
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        navigator: {
+            children: {
+                notification: {
+                    path: 'cordova/plugin/notification'
+                },
+                accelerometer: {
+                    path: 'cordova/plugin/accelerometer'
+                },
+                battery: {
+                    path: 'cordova/plugin/battery'
+                },
+                camera:{
+                    path: 'cordova/plugin/Camera'
+                },
+                compass:{
+                    path: 'cordova/plugin/compass'
+                },
+                contacts: {
+                    path: 'cordova/plugin/contacts'
+                },
+                device:{
+                    children:{
+                        capture: {
+                            path: 'cordova/plugin/capture'
+                        }
+                    }
+                },
+                geolocation: {
+                    path: 'cordova/plugin/geolocation'
+                },
+                network: {
+                    children: {
+                        connection: {
+                            path: 'cordova/plugin/network'
+                        }
+                    }
+                },
+                splashscreen: {
+                    path: 'cordova/plugin/splashscreen'
+                }
+            }
+        },
+        Acceleration: {
+            path: 'cordova/plugin/Acceleration'
+        },
+        Camera:{
+            path: 'cordova/plugin/CameraConstants'
+        },
+        CameraPopoverOptions: {
+            path: 'cordova/plugin/CameraPopoverOptions'
+        },
+        CaptureError: {
+            path: 'cordova/plugin/CaptureError'
+        },
+        CaptureAudioOptions:{
+            path: 'cordova/plugin/CaptureAudioOptions'
+        },
+        CaptureImageOptions: {
+            path: 'cordova/plugin/CaptureImageOptions'
+        },
+        CaptureVideoOptions: {
+            path: 'cordova/plugin/CaptureVideoOptions'
+        },
+        CompassHeading:{
+            path: 'cordova/plugin/CompassHeading'
+        },
+        CompassError:{
+            path: 'cordova/plugin/CompassError'
+        },
+        ConfigurationData: {
+            path: 'cordova/plugin/ConfigurationData'
+        },
+        Connection: {
+            path: 'cordova/plugin/Connection'
+        },
+        Contact: {
+            path: 'cordova/plugin/Contact'
+        },
+        ContactAddress: {
+            path: 'cordova/plugin/ContactAddress'
+        },
+        ContactError: {
+            path: 'cordova/plugin/ContactError'
+        },
+        ContactField: {
+            path: 'cordova/plugin/ContactField'
+        },
+        ContactFindOptions: {
+            path: 'cordova/plugin/ContactFindOptions'
+        },
+        ContactName: {
+            path: 'cordova/plugin/ContactName'
+        },
+        ContactOrganization: {
+            path: 'cordova/plugin/ContactOrganization'
+        },
+        Coordinates: {
+            path: 'cordova/plugin/Coordinates'
+        },
+        device: {
+            path: 'cordova/plugin/device'
+        },
+        DirectoryEntry: {
+            path: 'cordova/plugin/DirectoryEntry'
+        },
+        DirectoryReader: {
+            path: 'cordova/plugin/DirectoryReader'
+        },
+        Entry: {
+            path: 'cordova/plugin/Entry'
+        },
+        File: {
+            path: 'cordova/plugin/File'
+        },
+        FileEntry: {
+            path: 'cordova/plugin/FileEntry'
+        },
+        FileError: {
+            path: 'cordova/plugin/FileError'
+        },
+        FileReader: {
+            path: 'cordova/plugin/FileReader'
+        },
+        FileSystem: {
+            path: 'cordova/plugin/FileSystem'
+        },
+        FileTransfer: {
+            path: 'cordova/plugin/FileTransfer'
+        },
+        FileTransferError: {
+            path: 'cordova/plugin/FileTransferError'
+        },
+        FileUploadOptions: {
+            path: 'cordova/plugin/FileUploadOptions'
+        },
+        FileUploadResult: {
+            path: 'cordova/plugin/FileUploadResult'
+        },
+        FileWriter: {
+            path: 'cordova/plugin/FileWriter'
+        },
+        Flags: {
+            path: 'cordova/plugin/Flags'
+        },
+        LocalFileSystem: {
+            path: 'cordova/plugin/LocalFileSystem'
+        },
+        Media: {
+            path: 'cordova/plugin/Media'
+        },
+        MediaError: {
+            path: 'cordova/plugin/MediaError'
+        },
+        MediaFile: {
+            path: 'cordova/plugin/MediaFile'
+        },
+        MediaFileData:{
+            path: 'cordova/plugin/MediaFileData'
+        },
+        Metadata:{
+            path: 'cordova/plugin/Metadata'
+        },
+        Position: {
+            path: 'cordova/plugin/Position'
+        },
+        PositionError: {
+            path: 'cordova/plugin/PositionError'
+        },
+        ProgressEvent: {
+            path: 'cordova/plugin/ProgressEvent'
+        },
+        requestFileSystem:{
+            path: 'cordova/plugin/requestFileSystem'
+        },
+        resolveLocalFileSystemURI:{
+            path: 'cordova/plugin/resolveLocalFileSystemURI'
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/exec.js
+define("cordova/exec", function(require, exports, module) {
+/**
+ * Execute a cordova command.  It is up to the native side whether this action
+ * is synchronous or asynchronous.  The native side can return:
+ *      Synchronous: PluginResult object as a JSON string
+ *      Asynchrounous: Empty string ""
+ * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
+ * depending upon the result of the action.
+ *
+ * @param {Function} successCB  The success callback
+ * @param {Function} failCB     The fail callback
+ * @param {String} service      The name of the service to use
+ * @param {String} action       Action to be run in cordova
+ * @param {String[]} [args]     Zero or more arguments to pass to the method
+ */
+
+var tizen = require('cordova/plugin/tizen/manager'),
+    cordova = require('cordova'),
+    utils = require('cordova/utils');
+
+module.exports = function(successCB, failCB, service, action, args) {
+
+    try {
+        var v = tizen.exec(successCB, failCB, service, action, args);
+
+        // If status is OK, then return value back to caller
+        if (v.status == cordova.callbackStatus.OK) {
+
+            // If there is a success callback, then call it now with returned value
+            if (successCB) {
+                try {
+                    successCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+ service + "." + action + " = " + e);
+                }
+
+            }
+            return v.message;
+        } else if (v.status == cordova.callbackStatus.NO_RESULT) {
+            // Nothing to do here
+        } else {
+            // If error, then display error
+            console.log("Error: " + service + "." + action + " Status=" + v.status + " Message=" + v.message);
+
+            // If there is a fail callback, then call it now with returned value
+            if (failCB) {
+                try {
+                    failCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in error callback: " + service + "." + action + " = "+e);
+                }
+            }
+            return null;
+        }
+    } catch (e) {
+        utils.alert("Error: " + e);
+    }
+};
+
+});
+
+// file: lib/tizen/platform.js
+define("cordova/platform", function(require, exports, module) {
+module.exports = {
+    id: "tizen",
+    initialize: function() {},
+    objects: {
+        device: {
+            path: "cordova/plugin/tizen/Device"
+        },
+        File: { // exists natively, override
+            path: "cordova/plugin/File"
+        },
+        FileReader: { // exists natively, override
+            path: "cordova/plugin/FileReader"
+        },
+        FileError: { //exists natively, override
+            path: "cordova/plugin/FileError"
+        }
+    },
+    merges: {
+        MediaError: { // exists natively
+            path: "cordova/plugin/tizen/MediaError"
+        },
+        navigator: {
+            children: {
+                device: {
+                    path: "cordova/plugin/tizen/Device"
+                },
+                contacts: {
+                    path: "cordova/plugin/tizen/contacts"
+                },
+               notification: {
+                   path: "cordova/plugin/tizen/Notification"
+               }
+            }
+        },
+        Contact: {
+            path: "cordova/plugin/tizen/Contact"
+        }
+    }
+};
+
+});
+
+// file: lib/common/plugin/Acceleration.js
+define("cordova/plugin/Acceleration", function(require, exports, module) {
+var Acceleration = function(x, y, z, timestamp) {
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.timestamp = timestamp || (new Date()).getTime();
+};
+
+module.exports = Acceleration;
+
+});
+
+// file: lib/common/plugin/Camera.js
+define("cordova/plugin/Camera", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    Camera = require('cordova/plugin/CameraConstants');
+
+var cameraExport = {};
+
+// Tack on the Camera Constants to the base camera plugin.
+for (var key in Camera) {
+    cameraExport[key] = Camera[key];
+}
+
+/**
+ * Gets a picture from source defined by "options.sourceType", and returns the
+ * image as defined by the "options.destinationType" option.
+
+ * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
+ *
+ * @param {Function} successCallback
+ * @param {Function} errorCallback
+ * @param {Object} options
+ */
+cameraExport.getPicture = function(successCallback, errorCallback, options) {
+    // successCallback required
+    if (typeof successCallback != "function") {
+        console.log("Camera Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback != "function")) {
+        console.log("Camera Error: errorCallback is not a function");
+        return;
+    }
+
+    var quality = 50;
+    if (options && typeof options.quality == "number") {
+        quality = options.quality;
+    } else if (options && typeof options.quality == "string") {
+        var qlity = parseInt(options.quality, 10);
+        if (isNaN(qlity) === false) {
+            quality = qlity.valueOf();
+        }
+    }
+
+    var destinationType = Camera.DestinationType.FILE_URI;
+    if (typeof options.destinationType == "number") {
+        destinationType = options.destinationType;
+    }
+
+    var sourceType = Camera.PictureSourceType.CAMERA;
+    if (typeof options.sourceType == "number") {
+        sourceType = options.sourceType;
+    }
+
+    var targetWidth = -1;
+    if (typeof options.targetWidth == "number") {
+        targetWidth = options.targetWidth;
+    } else if (typeof options.targetWidth == "string") {
+        var width = parseInt(options.targetWidth, 10);
+        if (isNaN(width) === false) {
+            targetWidth = width.valueOf();
+        }
+    }
+
+    var targetHeight = -1;
+    if (typeof options.targetHeight == "number") {
+        targetHeight = options.targetHeight;
+    } else if (typeof options.targetHeight == "string") {
+        var height = parseInt(options.targetHeight, 10);
+        if (isNaN(height) === false) {
+            targetHeight = height.valueOf();
+        }
+    }
+
+    var encodingType = Camera.EncodingType.JPEG;
+    if (typeof options.encodingType == "number") {
+        encodingType = options.encodingType;
+    }
+
+    var mediaType = Camera.MediaType.PICTURE;
+    if (typeof options.mediaType == "number") {
+        mediaType = options.mediaType;
+    }
+    var allowEdit = false;
+    if (typeof options.allowEdit == "boolean") {
+        allowEdit = options.allowEdit;
+    } else if (typeof options.allowEdit == "number") {
+        allowEdit = options.allowEdit <= 0 ? false : true;
+    }
+    var correctOrientation = false;
+    if (typeof options.correctOrientation == "boolean") {
+        correctOrientation = options.correctOrientation;
+    } else if (typeof options.correctOrientation == "number") {
+        correctOrientation = options.correctOrientation <=0 ? false : true;
+    }
+    var saveToPhotoAlbum = false;
+    if (typeof options.saveToPhotoAlbum == "boolean") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum;
+    } else if (typeof options.saveToPhotoAlbum == "number") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum <=0 ? false : true;
+    }
+    var popoverOptions = null;
+    if (typeof options.popoverOptions == "object") {
+        popoverOptions = options.popoverOptions;
+    }
+
+    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
+
+    exec(successCallback, errorCallback, "Camera", "takePicture", args);
+};
+
+cameraExport.cleanup = function(successCallback, errorCallback) {
+    exec(successCallback, errorCallback, "Camera", "cleanup", []);
+};
+
+module.exports = cameraExport;
+});
+
+// file: lib/common/plugin/CameraConstants.js
+define("cordova/plugin/CameraConstants", function(require, exports, module) {
+module.exports = {
+  DestinationType:{
+    DATA_URL: 0,         // Return base64 encoded string
+    FILE_URI: 1          // Return file uri (content://media/external/images/media/2 for Android)
+  },
+  EncodingType:{
+    JPEG: 0,             // Return JPEG encoded image
+    PNG: 1               // Return PNG encoded image
+  },
+  MediaType:{
+    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
+    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
+    ALLMEDIA : 2         // allow selection from all media types
+  },
+  PictureSourceType:{
+    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
+    CAMERA : 1,          // Take picture from camera
+    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
+  },
+  PopoverArrowDirection:{
+      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
+      ARROW_DOWN : 2,
+      ARROW_LEFT : 4,
+      ARROW_RIGHT : 8,
+      ARROW_ANY : 15
+  }
+};
+});
+
+// file: lib/common/plugin/CameraPopoverOptions.js
+define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
+var Camera = require('cordova/plugin/CameraConstants');
+
+/**
+ * Encapsulates options for iOS Popover image picker
+ */
+var CameraPopoverOptions = function(x,y,width,height,arrowDir){
+    // information of rectangle that popover should be anchored to
+    this.x = x || 0;
+    this.y = y || 32;
+    this.width = width || 320;
+    this.height = height || 480;
+    // The direction of the popover arrow
+    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
+};
+
+module.exports = CameraPopoverOptions;
+});
+
+// file: lib/common/plugin/CaptureAudioOptions.js
+define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
+/**
+ * Encapsulates all audio capture operation configuration options.
+ */
+var CaptureAudioOptions = function(){
+    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single sound clip in seconds.
+    this.duration = 0;
+    // The selected audio mode. Must match with one of the elements in supportedAudioModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureAudioOptions;
+});
+
+// file: lib/common/plugin/CaptureError.js
+define("cordova/plugin/CaptureError", function(require, exports, module) {
+/**
+ * The CaptureError interface encapsulates all errors in the Capture API.
+ */
+var CaptureError = function(c) {
+   this.code = c || null;
+};
+
+// Camera or microphone failed to capture image or sound.
+CaptureError.CAPTURE_INTERNAL_ERR = 0;
+// Camera application or audio capture application is currently serving other capture request.
+CaptureError.CAPTURE_APPLICATION_BUSY = 1;
+// Invalid use of the API (e.g. limit parameter has value less than one).
+CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
+// User exited camera application or audio capture application before capturing anything.
+CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
+// The requested capture operation is not supported.
+CaptureError.CAPTURE_NOT_SUPPORTED = 20;
+
+module.exports = CaptureError;
+});
+
+// file: lib/common/plugin/CaptureImageOptions.js
+define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
+/**
+ * Encapsulates all image capture operation configuration options.
+ */
+var CaptureImageOptions = function(){
+    // Upper limit of images user can take. Value must be equal or greater than 1.
+    this.limit = 1;
+    // The selected image mode. Must match with one of the elements in supportedImageModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureImageOptions;
+});
+
+// file: lib/common/plugin/CaptureVideoOptions.js
+define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
+/**
+ * Encapsulates all video capture operation configuration options.
+ */
+var CaptureVideoOptions = function(){
+    // Upper limit of videos user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single video clip in seconds.
+    this.duration = 0;
+    // The selected video mode. Must match with one of the elements in supportedVideoModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureVideoOptions;
+});
+
+// file: lib/common/plugin/CompassError.js
+define("cordova/plugin/CompassError", function(require, exports, module) {
+/**
+ *  CompassError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var CompassError = function(err) {
+    this.code = (err !== undefined ? err : null);
+};
+
+CompassError.COMPASS_INTERNAL_ERR = 0;
+CompassError.COMPASS_NOT_SUPPORTED = 20;
+
+module.exports = CompassError;
+});
+
+// file: lib/common/plugin/CompassHeading.js
+define("cordova/plugin/CompassHeading", function(require, exports, module) {
+var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
+  this.magneticHeading = (magneticHeading !== undefined ? magneticHeading : null);
+  this.trueHeading = (trueHeading !== undefined ? trueHeading : null);
+  this.headingAccuracy = (headingAccuracy !== undefined ? headingAccuracy : null);
+  this.timestamp = (timestamp !== undefined ? timestamp : new Date().getTime());
+};
+
+module.exports = CompassHeading;
+});
+
+// file: lib/common/plugin/ConfigurationData.js
+define("cordova/plugin/ConfigurationData", function(require, exports, module) {
+/**
+ * Encapsulates a set of parameters that the capture device supports.
+ */
+function ConfigurationData() {
+    // The ASCII-encoded string in lower case representing the media type.
+    this.type = null;
+    // The height attribute represents height of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0.
+    this.height = 0;
+    // The width attribute represents width of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0
+    this.width = 0;
+}
+
+module.exports = ConfigurationData;
+});
+
+// file: lib/common/plugin/Connection.js
+define("cordova/plugin/Connection", function(require, exports, module) {
+/**
+ * Network status
+ */
+module.exports = {
+        UNKNOWN: "unknown",
+        ETHERNET: "ethernet",
+        WIFI: "wifi",
+        CELL_2G: "2g",
+        CELL_3G: "3g",
+        CELL_4G: "4g",
+        NONE: "none"
+};
+});
+
+// file: lib/common/plugin/Contact.js
+define("cordova/plugin/Contact", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils');
+
+/**
+* Converts primitives into Complex Object
+* Currently only used for Date fields
+*/
+function convertIn(contact) {
+    var value = contact.birthday;
+    try {
+      contact.birthday = new Date(parseFloat(value));
+    } catch (exception){
+      console.log("Cordova Contact convertIn error: exception creating date.");
+    }
+    return contact;
+}
+
+/**
+* Converts Complex objects into primitives
+* Only conversion at present is for Dates.
+**/
+
+function convertOut(contact) {
+    var value = contact.birthday;
+    if (value !== null) {
+        // try to make it a Date object if it is not already
+        if (!utils.isDate(value)){
+            try {
+                value = new Date(value);
+            } catch(exception){
+                value = null;
+            }
+        }
+        if (utils.isDate(value)){
+            value = value.valueOf(); // convert to milliseconds
+        }
+        contact.birthday = value;
+    }
+    return contact;
+}
+
+/**
+* Contains information about a single contact.
+* @constructor
+* @param {DOMString} id unique identifier
+* @param {DOMString} displayName
+* @param {ContactName} name
+* @param {DOMString} nickname
+* @param {Array.<ContactField>} phoneNumbers array of phone numbers
+* @param {Array.<ContactField>} emails array of email addresses
+* @param {Array.<ContactAddress>} addresses array of addresses
+* @param {Array.<ContactField>} ims instant messaging user ids
+* @param {Array.<ContactOrganization>} organizations
+* @param {DOMString} birthday contact's birthday
+* @param {DOMString} note user notes about contact
+* @param {Array.<ContactField>} photos
+* @param {Array.<ContactField>} categories
+* @param {Array.<ContactField>} urls contact's web sites
+*/
+var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
+    ims, organizations, birthday, note, photos, categories, urls) {
+    this.id = id || null;
+    this.rawId = null;
+    this.displayName = displayName || null;
+    this.name = name || null; // ContactName
+    this.nickname = nickname || null;
+    this.phoneNumbers = phoneNumbers || null; // ContactField[]
+    this.emails = emails || null; // ContactField[]
+    this.addresses = addresses || null; // ContactAddress[]
+    this.ims = ims || null; // ContactField[]
+    this.organizations = organizations || null; // ContactOrganization[]
+    this.birthday = birthday || null;
+    this.note = note || null;
+    this.photos = photos || null; // ContactField[]
+    this.categories = categories || null; // ContactField[]
+    this.urls = urls || null; // ContactField[]
+};
+
+/**
+* Removes contact from device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.remove = function(successCB, errorCB) {
+    var fail = function(code) {
+        errorCB(new ContactError(code));
+    };
+    if (this.id === null) {
+        fail(ContactError.UNKNOWN_ERROR);
+    }
+    else {
+        exec(successCB, fail, "Contacts", "remove", [this.id]);
+    }
+};
+
+/**
+* Creates a deep copy of this Contact.
+* With the contact ID set to null.
+* @return copy of this Contact
+*/
+Contact.prototype.clone = function() {
+    var clonedContact = utils.clone(this);
+    var i;
+    clonedContact.id = null;
+    clonedContact.rawId = null;
+    // Loop through and clear out any id's in phones, emails, etc.
+    if (clonedContact.phoneNumbers) {
+        for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
+            clonedContact.phoneNumbers[i].id = null;
+        }
+    }
+    if (clonedContact.emails) {
+        for (i = 0; i < clonedContact.emails.length; i++) {
+            clonedContact.emails[i].id = null;
+        }
+    }
+    if (clonedContact.addresses) {
+        for (i = 0; i < clonedContact.addresses.length; i++) {
+            clonedContact.addresses[i].id = null;
+        }
+    }
+    if (clonedContact.ims) {
+        for (i = 0; i < clonedContact.ims.length; i++) {
+            clonedContact.ims[i].id = null;
+        }
+    }
+    if (clonedContact.organizations) {
+        for (i = 0; i < clonedContact.organizations.length; i++) {
+            clonedContact.organizations[i].id = null;
+        }
+    }
+    if (clonedContact.categories) {
+        for (i = 0; i < clonedContact.categories.length; i++) {
+            clonedContact.categories[i].id = null;
+        }
+    }
+    if (clonedContact.photos) {
+        for (i = 0; i < clonedContact.photos.length; i++) {
+            clonedContact.photos[i].id = null;
+        }
+    }
+    if (clonedContact.urls) {
+        for (i = 0; i < clonedContact.urls.length; i++) {
+            clonedContact.urls[i].id = null;
+        }
+    }
+    return clonedContact;
+};
+
+/**
+* Persists contact to device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.save = function(successCB, errorCB) {
+  var fail = function(code) {
+      errorCB(new ContactError(code));
+  };
+    var success = function(result) {
+      if (result) {
+          if (typeof successCB === 'function') {
+              var fullContact = require('cordova/plugin/contacts').create(result);
+              successCB(convertIn(fullContact));
+          }
+      }
+      else {
+          // no Entry object returned
+          fail(ContactError.UNKNOWN_ERROR);
+      }
+  };
+    var dupContact = convertOut(utils.clone(this));
+    exec(success, fail, "Contacts", "save", [dupContact]);
+};
+
+
+module.exports = Contact;
+
+});
+
+// file: lib/common/plugin/ContactAddress.js
+define("cordova/plugin/ContactAddress", function(require, exports, module) {
+/**
+* Contact address.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code
+* @param formatted // NOTE: not a W3C standard
+* @param streetAddress
+* @param locality
+* @param region
+* @param postalCode
+* @param country
+*/
+
+var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.formatted = formatted || null;
+    this.streetAddress = streetAddress || null;
+    this.locality = locality || null;
+    this.region = region || null;
+    this.postalCode = postalCode || null;
+    this.country = country || null;
+};
+
+module.exports = ContactAddress;
+});
+
+// file: lib/common/plugin/ContactError.js
+define("cordova/plugin/ContactError", function(require, exports, module) {
+/**
+ *  ContactError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var ContactError = function(err) {
+    this.code = (typeof err != 'undefined' ? err : null);
+};
+
+/**
+ * Error codes
+ */
+ContactError.UNKNOWN_ERROR = 0;
+ContactError.INVALID_ARGUMENT_ERROR = 1;
+ContactError.TIMEOUT_ERROR = 2;
+ContactError.PENDING_OPERATION_ERROR = 3;
+ContactError.IO_ERROR = 4;
+ContactError.NOT_SUPPORTED_ERROR = 5;
+ContactError.PERMISSION_DENIED_ERROR = 20;
+
+module.exports = ContactError;
+});
+
+// file: lib/common/plugin/ContactField.js
+define("cordova/plugin/ContactField", function(require, exports, module) {
+/**
+* Generic contact field.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param type
+* @param value
+* @param pref
+*/
+var ContactField = function(type, value, pref) {
+    this.id = null;
+    this.type = (type && type.toString()) || null;
+    this.value = (value && value.toString()) || null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+};
+
+module.exports = ContactField;
+});
+
+// file: lib/common/plugin/ContactFindOptions.js
+define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
+/**
+ * ContactFindOptions.
+ * @constructor
+ * @param filter used to match contacts against
+ * @param multiple boolean used to determine if more than one contact should be returned
+ */
+
+var ContactFindOptions = function(filter, multiple) {
+    this.filter = filter || '';
+    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
+};
+
+module.exports = ContactFindOptions;
+});
+
+// file: lib/common/plugin/ContactName.js
+define("cordova/plugin/ContactName", function(require, exports, module) {
+/**
+* Contact name.
+* @constructor
+* @param formatted // NOTE: not part of W3C standard
+* @param familyName
+* @param givenName
+* @param middle
+* @param prefix
+* @param suffix
+*/
+var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
+    this.formatted = formatted || null;
+    this.familyName = familyName || null;
+    this.givenName = givenName || null;
+    this.middleName = middle || null;
+    this.honorificPrefix = prefix || null;
+    this.honorificSuffix = suffix || null;
+};
+
+module.exports = ContactName;
+});
+
+// file: lib/common/plugin/ContactOrganization.js
+define("cordova/plugin/ContactOrganization", function(require, exports, module) {
+/**
+* Contact organization.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param name
+* @param dept
+* @param title
+* @param startDate
+* @param endDate
+* @param location
+* @param desc
+*/
+
+var ContactOrganization = function(pref, type, name, dept, title) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.name = name || null;
+    this.department = dept || null;
+    this.title = title || null;
+};
+
+module.exports = ContactOrganization;
+});
+
+// file: lib/common/plugin/Coordinates.js
+define("cordova/plugin/Coordinates", function(require, exports, module) {
+/**
+ * This class contains position information.
+ * @param {Object} lat
+ * @param {Object} lng
+ * @param {Object} alt
+ * @param {Object} acc
+ * @param {Object} head
+ * @param {Object} vel
+ * @param {Object} altacc
+ * @constructor
+ */
+var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
+    /**
+     * The latitude of the position.
+     */
+    this.latitude = lat;
+    /**
+     * The longitude of the position,
+     */
+    this.longitude = lng;
+    /**
+     * The accuracy of the position.
+     */
+    this.accuracy = acc;
+    /**
+     * The altitude of the position.
+     */
+    this.altitude = (alt !== undefined ? alt : null);
+    /**
+     * The direction the device is moving at the position.
+     */
+    this.heading = (head !== undefined ? head : null);
+    /**
+     * The velocity with which the device is moving at the position.
+     */
+    this.speed = (vel !== undefined ? vel : null);
+
+    if (this.speed === 0 || this.speed === null) {
+        this.heading = NaN;
+    }
+
+    /**
+     * The altitude accuracy of the position.
+     */
+    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
+};
+
+module.exports = Coordinates;
+
+});
+
+// file: lib/common/plugin/DirectoryEntry.js
+define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileError = require('cordova/plugin/FileError'),
+    DirectoryReader = require('cordova/plugin/DirectoryReader');
+
+/**
+ * An interface representing a directory on the file system.
+ *
+ * {boolean} isFile always false (readonly)
+ * {boolean} isDirectory always true (readonly)
+ * {DOMString} name of the directory, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the directory (readonly)
+ * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
+ */
+var DirectoryEntry = function(name, fullPath) {
+     DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
+};
+
+utils.extend(DirectoryEntry, Entry);
+
+/**
+ * Creates a new DirectoryReader to read entries from this directory
+ */
+DirectoryEntry.prototype.createReader = function() {
+    return new DirectoryReader(this.fullPath);
+};
+
+/**
+ * Creates or looks up a directory
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
+ * @param {Flags} options to create or excluively create the directory
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
+};
+
+/**
+ * Deletes a directory and all of it's contents
+ *
+ * @param {Function} successCallback is called with no parameters
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
+};
+
+/**
+ * Creates or looks up a file
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
+ * @param {Flags} options to create or excluively create the file
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var FileEntry = require('cordova/plugin/FileEntry');
+        var entry = new FileEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
+};
+
+module.exports = DirectoryEntry;
+
+});
+
+// file: lib/common/plugin/DirectoryReader.js
+define("cordova/plugin/DirectoryReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError') ;
+
+/**
+ * An interface that lists the files and directories in a directory.
+ */
+function DirectoryReader(path) {
+    this.path = path || null;
+}
+
+/**
+ * Returns a list of entries from a directory.
+ *
+ * @param {Function} successCallback is called with a list of entries
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var retVal = [];
+        for (var i=0; i<result.length; i++) {
+            var entry = null;
+            if (result[i].isDirectory) {
+                entry = new (require('cordova/plugin/DirectoryEntry'))();
+            }
+            else if (result[i].isFile) {
+                entry = new (require('cordova/plugin/FileEntry'))();
+            }
+            entry.isDirectory = result[i].isDirectory;
+            entry.isFile = result[i].isFile;
+            entry.name = result[i].name;
+            entry.fullPath = result[i].fullPath;
+            retVal.push(entry);
+        }
+        successCallback(retVal);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "readEntries", [this.path]);
+};
+
+module.exports = DirectoryReader;
+
+});
+
+// file: lib/common/plugin/Entry.js
+define("cordova/plugin/Entry", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    Metadata = require('cordova/plugin/Metadata');
+
+/**
+ * Represents a file or directory on the local file system.
+ *
+ * @param isFile
+ *            {boolean} true if Entry is a file (readonly)
+ * @param isDirectory
+ *            {boolean} true if Entry is a directory (readonly)
+ * @param name
+ *            {DOMString} name of the file or directory, excluding the path
+ *            leading to it (readonly)
+ * @param fullPath
+ *            {DOMString} the absolute full path to the file or directory
+ *            (readonly)
+ */
+function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
+    this.isFile = (typeof isFile != 'undefined'?isFile:false);
+    this.isDirectory = (typeof isDirectory != 'undefined'?isDirectory:false);
+    this.name = name || '';
+    this.fullPath = fullPath || '';
+    this.filesystem = fileSystem || null;
+}
+
+/**
+ * Look up the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ */
+Entry.prototype.getMetadata = function(successCallback, errorCallback) {
+  var success = typeof successCallback !== 'function' ? null : function(lastModified) {
+      var metadata = new Metadata(lastModified);
+      successCallback(metadata);
+  };
+  var fail = typeof errorCallback !== 'function' ? null : function(code) {
+      errorCallback(new FileError(code));
+  };
+
+  exec(success, fail, "File", "getMetadata", [this.fullPath]);
+};
+
+/**
+ * Set the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ * @param metadataObject
+ *            {Object} keys and values to set
+ */
+Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
+
+  exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
+};
+
+/**
+ * Move a file or directory to a new location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to move this entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new DirectoryEntry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+    // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Copy a directory to a different location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to copy the entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new Entry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+
+        // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        // success callback
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Return a URL that can be used to identify this entry.
+ */
+Entry.prototype.toURL = function() {
+    // fullPath attribute contains the full URL
+    return this.fullPath;
+};
+
+/**
+ * Returns a URI that can be used to identify this entry.
+ *
+ * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
+ * @return uri
+ */
+Entry.prototype.toURI = function(mimeType) {
+    console.log("DEPRECATED: Update your code to use 'toURL'");
+    // fullPath attribute contains the full URI
+    return this.toURL();
+};
+
+/**
+ * Remove a file or directory. It is an error to attempt to delete a
+ * directory that is not empty. It is an error to attempt to delete a
+ * root directory of a file system.
+ *
+ * @param successCallback {Function} called with no parameters
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.remove = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "remove", [this.fullPath]);
+};
+
+/**
+ * Look up the parent DirectoryEntry of this entry.
+ *
+ * @param successCallback {Function} called with the parent DirectoryEntry object
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.getParent = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getParent", [this.fullPath]);
+};
+
+module.exports = Entry;
+});
+
+// file: lib/common/plugin/File.js
+define("cordova/plugin/File", function(require, exports, module) {
+/**
+ * Constructor.
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+
+var File = function(name, fullPath, type, lastModifiedDate, size){
+    this.name = name || '';
+    this.fullPath = fullPath || null;
+    this.type = type || null;
+    this.lastModifiedDate = lastModifiedDate || null;
+    this.size = size || 0;
+};
+
+module.exports = File;
+});
+
+// file: lib/common/plugin/FileEntry.js
+define("cordova/plugin/FileEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileWriter = require('cordova/plugin/FileWriter'),
+    File = require('cordova/plugin/File'),
+    FileError = require('cordova/plugin/FileError');
+
+/**
+ * An interface representing a file on the file system.
+ *
+ * {boolean} isFile always true (readonly)
+ * {boolean} isDirectory always false (readonly)
+ * {DOMString} name of the file, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the file (readonly)
+ * {FileSystem} filesystem on which the file resides (readonly)
+ */
+var FileEntry = function(name, fullPath) {
+     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
+};
+
+utils.extend(FileEntry, Entry);
+
+/**
+ * Creates a new FileWriter associated with the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new FileWriter
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
+    this.file(function(filePointer) {
+        var writer = new FileWriter(filePointer);
+
+        if (writer.fileName === null || writer.fileName === "") {
+            if (typeof errorCallback === "function") {
+                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
+            }
+        } else {
+            if (typeof successCallback === "function") {
+                successCallback(writer);
+            }
+        }
+    }, errorCallback);
+};
+
+/**
+ * Returns a File that represents the current state of the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new File object
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.file = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(f) {
+        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
+        successCallback(file);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
+};
+
+
+module.exports = FileEntry;
+});
+
+// file: lib/common/plugin/FileError.js
+define("cordova/plugin/FileError", function(require, exports, module) {
+/**
+ * FileError
+ */
+function FileError(error) {
+  this.code = error || null;
+}
+
+// File error codes
+// Found in DOMException
+FileError.NOT_FOUND_ERR = 1;
+FileError.SECURITY_ERR = 2;
+FileError.ABORT_ERR = 3;
+
+// Added by File API specification
+FileError.NOT_READABLE_ERR = 4;
+FileError.ENCODING_ERR = 5;
+FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
+FileError.INVALID_STATE_ERR = 7;
+FileError.SYNTAX_ERR = 8;
+FileError.INVALID_MODIFICATION_ERR = 9;
+FileError.QUOTA_EXCEEDED_ERR = 10;
+FileError.TYPE_MISMATCH_ERR = 11;
+FileError.PATH_EXISTS_ERR = 12;
+
+module.exports = FileError;
+});
+
+// file: lib/common/plugin/FileReader.js
+define("cordova/plugin/FileReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class reads the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To read from the SD card, the file name is "sdcard/my_file.txt"
+ * @constructor
+ */
+var FileReader = function() {
+    this.fileName = "";
+
+    this.readyState = 0; // FileReader.EMPTY
+
+    // File data
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onloadstart = null;    // When the read starts.
+    this.onprogress = null;     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)
+    this.onload = null;         // When the read has successfully completed.
+    this.onerror = null;        // When the read has failed (see errors).
+    this.onloadend = null;      // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the read has been aborted. For instance, by invoking the abort() method.
+};
+
+// States
+FileReader.EMPTY = 0;
+FileReader.LOADING = 1;
+FileReader.DONE = 2;
+
+/**
+ * Abort reading file.
+ */
+FileReader.prototype.abort = function() {
+    this.result = null;
+
+    if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
+      return;
+    }
+
+    this.readyState = FileReader.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === 'function') {
+        this.onabort(new ProgressEvent('abort', {target:this}));
+    }
+    // If load end callback
+    if (typeof this.onloadend === 'function') {
+        this.onloadend(new ProgressEvent('loadend', {target:this}));
+    }
+};
+
+/**
+ * Read text file.
+ *
+ * @param file          {File} File object containing file properties
+ * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
+ */
+FileReader.prototype.readAsText = function(file, encoding) {
+    // Figure out pathing
+    this.fileName = '';
+    if (typeof file.fullPath === 'undefined') {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    // Default encoding is UTF-8
+    var enc = encoding ? encoding : "UTF-8";
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // null result
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsText", [this.fileName, enc]);
+};
+
+
+/**
+ * Read file and return data as a base64 encoded data url.
+ * A data url is of the form:
+ *      data:[<mediatype>][;base64],<data>
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsDataURL = function(file) {
+    this.fileName = "";
+    if (typeof file.fullPath === "undefined") {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsDataURL", [this.fileName]);
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsBinaryString = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('method "readAsBinaryString" is not supported at this time.');
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsArrayBuffer = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('This method is not supported at this time.');
+};
+
+module.exports = FileReader;
+});
+
+// file: lib/common/plugin/FileSystem.js
+define("cordova/plugin/FileSystem", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+
+/**
+ * An interface representing a file system
+ *
+ * @constructor
+ * {DOMString} name the unique name of the file system (readonly)
+ * {DirectoryEntry} root directory of the file system (readonly)
+ */
+var FileSystem = function(name, root) {
+    this.name = name || null;
+    if (root) {
+        this.root = new DirectoryEntry(root.name, root.fullPath);
+    }
+};
+
+module.exports = FileSystem;
+
+});
+
+// file: lib/common/plugin/FileTransfer.js
+define("cordova/plugin/FileTransfer", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileTransferError = require('cordova/plugin/FileTransferError');
+
+/**
+ * FileTransfer uploads a file to a remote server.
+ * @constructor
+ */
+var FileTransfer = function() {};
+
+/**
+* Given an absolute file path, uploads a file on the device to a remote server
+* using a multipart HTTP request.
+* @param filePath {String}           Full path of the file on the device
+* @param server {String}             URL of the server to receive the file
+* @param successCallback (Function}  Callback to be invoked when upload has completed
+* @param errorCallback {Function}    Callback to be invoked upon error
+* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
+* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
+*/
+FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
+    // sanity parameter checking
+    if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
+    // check for options
+    var fileKey = null;
+    var fileName = null;
+    var mimeType = null;
+    var params = null;
+    var chunkedMode = true;
+    var headers = null;
+    if (options) {
+        fileKey = options.fileKey;
+        fileName = options.fileName;
+        mimeType = options.mimeType;
+        headers = options.headers;
+        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
+            chunkedMode = options.chunkedMode;
+        }
+        if (options.params) {
+            params = options.params;
+        }
+        else {
+            params = {};
+        }
+    }
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers]);
+};
+
+/**
+ * Downloads a file form a given URL and saves it to the specified directory.
+ * @param source {String}          URL of the server to receive the file
+ * @param target {String}         Full path of the file on the device
+ * @param successCallback (Function}  Callback to be invoked when upload has completed
+ * @param errorCallback {Function}    Callback to be invoked upon error
+ */
+FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
+    // sanity parameter checking
+    if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
+    var win = function(result) {
+        var entry = null;
+        if (result.isDirectory) {
+            entry = new (require('cordova/plugin/DirectoryEntry'))();
+        }
+        else if (result.isFile) {
+            entry = new (require('cordova/plugin/FileEntry'))();
+        }
+        entry.isDirectory = result.isDirectory;
+        entry.isFile = result.isFile;
+        entry.name = result.name;
+        entry.fullPath = result.fullPath;
+        successCallback(entry);
+    };
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
+};
+
+module.exports = FileTransfer;
+
+});
+
+// file: lib/common/plugin/FileTransferError.js
+define("cordova/plugin/FileTransferError", function(require, exports, module) {
+/**
+ * FileTransferError
+ * @constructor
+ */
+var FileTransferError = function(code, source, target, status) {
+    this.code = code || null;
+    this.source = source || null;
+    this.target = target || null;
+    this.http_status = status || null;
+};
+
+FileTransferError.FILE_NOT_FOUND_ERR = 1;
+FileTransferError.INVALID_URL_ERR = 2;
+FileTransferError.CONNECTION_ERR = 3;
+
+module.exports = FileTransferError;
+
+});
+
+// file: lib/common/plugin/FileUploadOptions.js
+define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
+/**
+ * Options to customize the HTTP request used to upload files.
+ * @constructor
+ * @param fileKey {String}   Name of file request parameter.
+ * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
+ * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
+ * @param params {Object}    Object with key: value params to send to the server.
+ * @param headers {Object}   Keys are header names, values are header values. Multiple
+ *                           headers of the same name are not supported.
+ */
+var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {
+    this.fileKey = fileKey || null;
+    this.fileName = fileName || null;
+    this.mimeType = mimeType || null;
+    this.params = params || null;
+    this.headers = headers || null;
+};
+
+module.exports = FileUploadOptions;
+
+});
+
+// file: lib/common/plugin/FileUploadResult.js
+define("cordova/plugin/FileUploadResult", function(require, exports, module) {
+/**
+ * FileUploadResult
+ * @constructor
+ */
+var FileUploadResult = function() {
+    this.bytesSent = 0;
+    this.responseCode = null;
+    this.response = null;
+};
+
+module.exports = FileUploadResult;
+});
+
+// file: lib/common/plugin/FileWriter.js
+define("cordova/plugin/FileWriter", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class writes to the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To write to the SD card, the file name is "sdcard/my_file.txt"
+ *
+ * @constructor
+ * @param file {File} File object containing file properties
+ * @param append if true write to the end of the file, otherwise overwrite the file
+ */
+var FileWriter = function(file) {
+    this.fileName = "";
+    this.length = 0;
+    if (file) {
+        this.fileName = file.fullPath || file;
+        this.length = file.size || 0;
+    }
+    // default is to write at the beginning of the file
+    this.position = 0;
+
+    this.readyState = 0; // EMPTY
+
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onwritestart = null;   // When writing starts
+    this.onprogress = null;     // While writing the file, and reporting partial file data
+    this.onwrite = null;        // When the write has successfully completed.
+    this.onwriteend = null;     // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
+    this.onerror = null;        // When the write has failed (see errors).
+};
+
+// States
+FileWriter.INIT = 0;
+FileWriter.WRITING = 1;
+FileWriter.DONE = 2;
+
+/**
+ * Abort writing file.
+ */
+FileWriter.prototype.abort = function() {
+    // check for invalid state
+    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // set error
+    this.error = new FileError(FileError.ABORT_ERR);
+
+    this.readyState = FileWriter.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === "function") {
+        this.onabort(new ProgressEvent("abort", {"target":this}));
+    }
+
+    // If write end callback
+    if (typeof this.onwriteend === "function") {
+        this.onwriteend(new ProgressEvent("writeend", {"target":this}));
+    }
+};
+
+/**
+ * Writes data to the file
+ *
+ * @param text to be written
+ */
+FileWriter.prototype.write = function(text) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":me}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // position always increases by bytes written because file would be extended
+            me.position += r;
+            // The length of the file is now where we are done writing.
+
+            me.length = me.position;
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "write", [this.fileName, text, this.position]);
+};
+
+/**
+ * Moves the file pointer to the location specified.
+ *
+ * If the offset is a negative number the position of the file
+ * pointer is rewound.  If the offset is greater than the file
+ * size the position is set to the end of the file.
+ *
+ * @param offset is the location to move the file pointer to.
+ */
+FileWriter.prototype.seek = function(offset) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    if (!offset && offset !== 0) {
+        return;
+    }
+
+    // See back from end of file.
+    if (offset < 0) {
+        this.position = Math.max(offset + this.length, 0);
+    }
+    // Offset is bigger then file size so set position
+    // to the end of the file.
+    else if (offset > this.length) {
+        this.position = this.length;
+    }
+    // Offset is between 0 and file size so set the position
+    // to start writing.
+    else {
+        this.position = offset;
+    }
+};
+
+/**
+ * Truncates the file to the size specified.
+ *
+ * @param size to chop the file at.
+ */
+FileWriter.prototype.truncate = function(size) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":this}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Update the length of the file
+            me.length = r;
+            me.position = Math.min(me.position, r);
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "truncate", [this.fileName, size]);
+};
+
+module.exports = FileWriter;
+
+});
+
+// file: lib/common/plugin/Flags.js
+define("cordova/plugin/Flags", function(require, exports, module) {
+/**
+ * Supplies arguments to methods that lookup or create files and directories.
+ *
+ * @param create
+ *            {boolean} file or directory if it doesn't exist
+ * @param exclusive
+ *            {boolean} used with create; if true the command will fail if
+ *            target path exists
+ */
+function Flags(create, exclusive) {
+    this.create = create || false;
+    this.exclusive = exclusive || false;
+}
+
+module.exports = Flags;
+});
+
+// file: lib/common/plugin/LocalFileSystem.js
+define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Represents a local file system.
+ */
+var LocalFileSystem = function() {
+
+};
+
+LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
+LocalFileSystem.PERSISTENT = 1; //persistent
+
+module.exports = LocalFileSystem;
+});
+
+// file: lib/common/plugin/Media.js
+define("cordova/plugin/Media", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+var mediaObjects = {};
+
+/**
+ * This class provides access to the device media, interfaces to both sound and video
+ *
+ * @constructor
+ * @param src                   The file name or url to play
+ * @param successCallback       The callback to be called when the file is done playing or recording.
+ *                                  successCallback()
+ * @param errorCallback         The callback to be called if there is an error.
+ *                                  errorCallback(int errorCode) - OPTIONAL
+ * @param statusCallback        The callback to be called when media status has changed.
+ *                                  statusCallback(int statusCode) - OPTIONAL
+ */
+var Media = function(src, successCallback, errorCallback, statusCallback) {
+
+    // successCallback optional
+    if (successCallback && (typeof successCallback !== "function")) {
+        console.log("Media Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Media Error: errorCallback is not a function");
+        return;
+    }
+
+    // statusCallback optional
+    if (statusCallback && (typeof statusCallback !== "function")) {
+        console.log("Media Error: statusCallback is not a function");
+        return;
+    }
+
+    this.id = utils.createUUID();
+    mediaObjects[this.id] = this;
+    this.src = src;
+    this.successCallback = successCallback;
+    this.errorCallback = errorCallback;
+    this.statusCallback = statusCallback;
+    this._duration = -1;
+    this._position = -1;
+    exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
+};
+
+// Media messages
+Media.MEDIA_STATE = 1;
+Media.MEDIA_DURATION = 2;
+Media.MEDIA_POSITION = 3;
+Media.MEDIA_ERROR = 9;
+
+// Media states
+Media.MEDIA_NONE = 0;
+Media.MEDIA_STARTING = 1;
+Media.MEDIA_RUNNING = 2;
+Media.MEDIA_PAUSED = 3;
+Media.MEDIA_STOPPED = 4;
+Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"];
+
+// "static" function to return existing objs.
+Media.get = function(id) {
+    return mediaObjects[id];
+};
+
+/**
+ * Start or resume playing audio file.
+ */
+Media.prototype.play = function(options) {
+    exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]);
+};
+
+/**
+ * Stop playing audio file.
+ */
+Media.prototype.stop = function() {
+    var me = this;
+    exec(function() {
+        me._position = 0;
+        me.successCallback();
+    }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
+};
+
+/**
+ * Seek or jump to a new time in the track..
+ */
+Media.prototype.seekTo = function(milliseconds) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+    }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]);
+};
+
+/**
+ * Pause playing audio file.
+ */
+Media.prototype.pause = function() {
+    exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]);
+};
+
+/**
+ * Get duration of an audio file.
+ * The duration is only set for audio that is playing, paused or stopped.
+ *
+ * @return      duration or -1 if not known.
+ */
+Media.prototype.getDuration = function() {
+    return this._duration;
+};
+
+/**
+ * Get position of audio.
+ */
+Media.prototype.getCurrentPosition = function(success, fail) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+        success(p);
+    }, fail, "Media", "getCurrentPositionAudio", [this.id]);
+};
+
+/**
+ * Start recording audio file.
+ */
+Media.prototype.startRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+};
+
+/**
+ * Stop recording audio file.
+ */
+Media.prototype.stopRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
+};
+
+/**
+ * Release the resources.
+ */
+Media.prototype.release = function() {
+    exec(null, this.errorCallback, "Media", "release", [this.id]);
+};
+
+/**
+ * Adjust the volume.
+ */
+Media.prototype.setVolume = function(volume) {
+    exec(null, null, "Media", "setVolume", [this.id, volume]);
+};
+
+/**
+ * Audio has status update.
+ * PRIVATE
+ *
+ * @param id            The media object id (string)
+ * @param status        The status code (int)
+ * @param msg           The status message (string)
+ */
+Media.onStatus = function(id, msg, value) {
+    var media = mediaObjects[id];
+    // If state update
+    if (msg === Media.MEDIA_STATE) {
+        if (value === Media.MEDIA_STOPPED) {
+            if (media.successCallback) {
+                media.successCallback();
+            }
+        }
+        if (media.statusCallback) {
+            media.statusCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_DURATION) {
+        media._duration = value;
+    }
+    else if (msg === Media.MEDIA_ERROR) {
+        if (media.errorCallback) {
+            // value should be a MediaError object when msg == MEDIA_ERROR
+            media.errorCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_POSITION) {
+        media._position = value;
+    }
+};
+
+module.exports = Media;
+});
+
+// file: lib/common/plugin/MediaError.js
+define("cordova/plugin/MediaError", function(require, exports, module) {
+/**
+ * This class contains information about any Media errors.
+ * @constructor
+ */
+var MediaError = function(code, msg) {
+    this.code = (code !== undefined ? code : null);
+    this.message = msg || "";
+};
+
+MediaError.MEDIA_ERR_NONE_ACTIVE    = 0;
+MediaError.MEDIA_ERR_ABORTED        = 1;
+MediaError.MEDIA_ERR_NETWORK        = 2;
+MediaError.MEDIA_ERR_DECODE         = 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+
+module.exports = MediaError;
+});
+
+// file: lib/common/plugin/MediaFile.js
+define("cordova/plugin/MediaFile", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    File = require('cordova/plugin/File'),
+    CaptureError = require('cordova/plugin/CaptureError');
+/**
+ * Represents a single file.
+ *
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+var MediaFile = function(name, fullPath, type, lastModifiedDate, size){
+    MediaFile.__super__.constructor.apply(this, arguments);
+};
+
+utils.extend(MediaFile, File);
+
+/**
+ * Request capture format data for a specific file and type
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ */
+MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
+    if (typeof this.fullPath === "undefined" || this.fullPath === null) {
+        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
+    } else {
+        exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]);
+    }
+};
+
+// TODO: can we axe this?
+/**
+ * Casts a PluginResult message property  (array of objects) to an array of MediaFile objects
+ * (used in Objective-C and Android)
+ *
+ * @param {PluginResult} pluginResult
+ */
+MediaFile.cast = function(pluginResult) {
+    var mediaFiles = [];
+    for (var i=0; i<pluginResult.message.length; i++) {
+        var mediaFile = new MediaFile();
+        mediaFile.name = pluginResult.message[i].name;
+        mediaFile.fullPath = pluginResult.message[i].fullPath;
+        mediaFile.type = pluginResult.message[i].type;
+        mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
+        mediaFile.size = pluginResult.message[i].size;
+        mediaFiles.push(mediaFile);
+    }
+    pluginResult.message = mediaFiles;
+    return pluginResult;
+};
+
+module.exports = MediaFile;
+
+});
+
+// file: lib/common/plugin/MediaFileData.js
+define("cordova/plugin/MediaFileData", function(require, exports, module) {
+/**
+ * MediaFileData encapsulates format information of a media file.
+ *
+ * @param {DOMString} codecs
+ * @param {long} bitrate
+ * @param {long} height
+ * @param {long} width
+ * @param {float} duration
+ */
+var MediaFileData = function(codecs, bitrate, height, width, duration){
+    this.codecs = codecs || null;
+    this.bitrate = bitrate || 0;
+    this.height = height || 0;
+    this.width = width || 0;
+    this.duration = duration || 0;
+};
+
+module.exports = MediaFileData;
+});
+
+// file: lib/common/plugin/Metadata.js
+define("cordova/plugin/Metadata", function(require, exports, module) {
+/**
+ * Information about the state of the file or directory
+ *
+ * {Date} modificationTime (readonly)
+ */
+var Metadata = function(time) {
+    this.modificationTime = (typeof time != 'undefined'?new Date(time):null);
+};
+
+module.exports = Metadata;
+});
+
+// file: lib/common/plugin/Position.js
+define("cordova/plugin/Position", function(require, exports, module) {
+var Coordinates = require('cordova/plugin/Coordinates');
+
+var Position = function(coords, timestamp) {
+    if (coords) {
+        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
+    } else {
+        this.coords = new Coordinates();
+    }
+    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
+};
+
+module.exports = Position;
+
+});
+
+// file: lib/common/plugin/PositionError.js
+define("cordova/plugin/PositionError", function(require, exports, module) {
+/**
+ * Position error object
+ *
+ * @constructor
+ * @param code
+ * @param message
+ */
+var PositionError = function(code, message) {
+    this.code = code || null;
+    this.message = message || '';
+};
+
+PositionError.PERMISSION_DENIED = 1;
+PositionError.POSITION_UNAVAILABLE = 2;
+PositionError.TIMEOUT = 3;
+
+module.exports = PositionError;
+});
+
+// file: lib/common/plugin/ProgressEvent.js
+define("cordova/plugin/ProgressEvent", function(require, exports, module) {
+// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
+// Feature test: See if we can instantiate a native ProgressEvent;
+// if so, use that approach,
+// otherwise fill-in with our own implementation.
+//
+// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
+var ProgressEvent = (function() {
+    /*
+    var createEvent = function(data) {
+        var event = document.createEvent('Events');
+        event.initEvent('ProgressEvent', false, false);
+        if (data) {
+            for (var i in data) {
+                if (data.hasOwnProperty(i)) {
+                    event[i] = data[i];
+                }
+            }
+            if (data.target) {
+                // TODO: cannot call <some_custom_object>.dispatchEvent
+                // need to first figure out how to implement EventTarget
+            }
+        }
+        return event;
+    };
+    try {
+        var ev = createEvent({type:"abort",target:document});
+        return function ProgressEvent(type, data) {
+            data.type = type;
+            return createEvent(data);
+        };
+    } catch(e){
+    */
+        return function ProgressEvent(type, dict) {
+            this.type = type;
+            this.bubbles = false;
+            this.cancelBubble = false;
+            this.cancelable = false;
+            this.lengthComputable = false;
+            this.loaded = dict && dict.loaded ? dict.loaded : 0;
+            this.total = dict && dict.total ? dict.total : 0;
+            this.target = dict && dict.target ? dict.target : null;
+        };
+    //}
+})();
+
+module.exports = ProgressEvent;
+});
+
+// file: lib/common/plugin/accelerometer.js
+define("cordova/plugin/accelerometer", function(require, exports, module) {
+/**
+ * This class provides access to device accelerometer data.
+ * @constructor
+ */
+var utils = require("cordova/utils"),
+    exec = require("cordova/exec"),
+    Acceleration = require('cordova/plugin/Acceleration');
+
+// Is the accel sensor running?
+var running = false;
+
+// Keeps reference to watchAcceleration calls.
+var timers = {};
+
+// Array of listeners; used to keep track of when we should call start and stop.
+var listeners = [];
+
+// Last returned acceleration object from native
+var accel = null;
+
+// Tells native to start.
+function start() {
+    exec(function(a) {
+        var tempListeners = listeners.slice(0);
+        accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].win(accel);
+        }
+    }, function(e) {
+        var tempListeners = listeners.slice(0);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].fail(e);
+        }
+    }, "Accelerometer", "start", []);
+    running = true;
+}
+
+// Tells native to stop.
+function stop() {
+    exec(null, null, "Accelerometer", "stop", []);
+    running = false;
+}
+
+// Adds a callback pair to the listeners array
+function createCallbackPair(win, fail) {
+    return {win:win, fail:fail};
+}
+
+// Removes a win/fail listener pair from the listeners array
+function removeListeners(l) {
+    var idx = listeners.indexOf(l);
+    if (idx > -1) {
+        listeners.splice(idx, 1);
+        if (listeners.length === 0) {
+            stop();
+        }
+    }
+}
+
+var accelerometer = {
+    /**
+     * Asynchronously aquires the current acceleration.
+     *
+     * @param {Function} successCallback    The function to call when the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     */
+    getCurrentAcceleration: function(successCallback, errorCallback, options) {
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "getCurrentAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        var p;
+        var win = function(a) {
+            removeListeners(p);
+            successCallback(a);
+        };
+        var fail = function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        };
+
+        p = createCallbackPair(win, fail);
+        listeners.push(p);
+
+        if (!running) {
+            start();
+        }
+    },
+
+    /**
+     * Asynchronously aquires the acceleration repeatedly at a given interval.
+     *
+     * @param {Function} successCallback    The function to call each time the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchAcceleration: function(successCallback, errorCallback, options) {
+        // Default interval (10 sec)
+        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
+
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "watchAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        // Keep reference to watch id, and report accel readings as often as defined in frequency
+        var id = utils.createUUID();
+
+        var p = createCallbackPair(function(){}, function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        });
+        listeners.push(p);
+
+        timers[id] = {
+            timer:window.setInterval(function() {
+                if (accel) {
+                    successCallback(accel);
+                }
+            }, frequency),
+            listeners:p
+        };
+
+        if (running) {
+            // If we're already running then immediately invoke the success callback
+            // but only if we have retreived a value, sample code does not check for null ...
+            if(accel) {
+                successCallback(accel);
+            }
+        } else {
+            start();
+        }
+
+        return id;
+    },
+
+    /**
+     * Clears the specified accelerometer watch.
+     *
+     * @param {String} id       The id of the watch returned from #watchAcceleration.
+     */
+    clearWatch: function(id) {
+        // Stop javascript timer & remove from timer list
+        if (id && timers[id]) {
+            window.clearInterval(timers[id].timer);
+            removeListeners(timers[id].listeners);
+            delete timers[id];
+        }
+    }
+};
+
+module.exports = accelerometer;
+
+});
+
+// file: lib/common/plugin/battery.js
+define("cordova/plugin/battery", function(require, exports, module) {
+/**
+ * This class contains information about the current battery status.
+ * @constructor
+ */
+var cordova = require('cordova'),
+    exec = require('cordova/exec');
+
+function handlers() {
+  return battery.channels.batterystatus.numHandlers +
+         battery.channels.batterylow.numHandlers +
+         battery.channels.batterycritical.numHandlers;
+}
+
+var Battery = function() {
+    this._level = null;
+    this._isPlugged = null;
+    // Create new event handlers on the window (returns a channel instance)
+    var subscriptionEvents = {
+      onSubscribe:this.onSubscribe,
+      onUnsubscribe:this.onUnsubscribe
+    };
+    this.channels = {
+      batterystatus:cordova.addWindowEventHandler("batterystatus", subscriptionEvents),
+      batterylow:cordova.addWindowEventHandler("batterylow", subscriptionEvents),
+      batterycritical:cordova.addWindowEventHandler("batterycritical", subscriptionEvents)
+    };
+};
+/**
+ * Event handlers for when callbacks get registered for the battery.
+ * Keep track of how many handlers we have so we can start and stop the native battery listener
+ * appropriately (and hopefully save on battery life!).
+ */
+Battery.prototype.onSubscribe = function() {
+  var me = battery;
+  // If we just registered the first handler, make sure native listener is started.
+  if (handlers() === 1) {
+    exec(me._status, me._error, "Battery", "start", []);
+  }
+};
+
+Battery.prototype.onUnsubscribe = function() {
+  var me = battery;
+
+  // If we just unregistered the last handler, make sure native listener is stopped.
+  if (handlers() === 0) {
+      exec(null, null, "Battery", "stop", []);
+  }
+};
+
+/**
+ * Callback for battery status
+ *
+ * @param {Object} info            keys: level, isPlugged
+ */
+Battery.prototype._status = function(info) {
+    if (info) {
+        var me = battery;
+    var level = info.level;
+        if (me._level !== level || me._isPlugged !== info.isPlugged) {
+            // Fire batterystatus event
+            cordova.fireWindowEvent("batterystatus", info);
+
+            // Fire low battery event
+            if (level === 20 || level === 5) {
+                if (level === 20) {
+                    cordova.fireWindowEvent("batterylow", info);
+                }
+                else {
+                    cordova.fireWindowEvent("batterycritical", info);
+                }
+            }
+        }
+        me._level = level;
+        me._isPlugged = info.isPlugged;
+    }
+};
+
+/**
+ * Error callback for battery start
+ */
+Battery.prototype._error = function(e) {
+    console.log("Error initializing Battery: " + e);
+};
+
+var battery = new Battery();
+
+module.exports = battery;
+});
+
+// file: lib/common/plugin/capture.js
+define("cordova/plugin/capture", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    MediaFile = require('cordova/plugin/MediaFile');
+
+/**
+ * Launches a capture of different types.
+ *
+ * @param (DOMString} type
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+function _capture(type, successCallback, errorCallback, options) {
+    var win = function(pluginResult) {
+        var mediaFiles = [];
+        var i;
+        for (i = 0; i < pluginResult.length; i++) {
+            var mediaFile = new MediaFile();
+            mediaFile.name = pluginResult[i].name;
+            mediaFile.fullPath = pluginResult[i].fullPath;
+            mediaFile.type = pluginResult[i].type;
+            mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
+            mediaFile.size = pluginResult[i].size;
+            mediaFiles.push(mediaFile);
+        }
+        successCallback(mediaFiles);
+    };
+    exec(win, errorCallback, "Capture", type, [options]);
+}
+/**
+ * The Capture interface exposes an interface to the camera and microphone of the hosting device.
+ */
+function Capture() {
+    this.supportedAudioModes = [];
+    this.supportedImageModes = [];
+    this.supportedVideoModes = [];
+}
+
+/**
+ * Launch audio recorder application for recording audio clip(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureAudioOptions} options
+ */
+Capture.prototype.captureAudio = function(successCallback, errorCallback, options){
+    _capture("captureAudio", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch camera application for taking image(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureImageOptions} options
+ */
+Capture.prototype.captureImage = function(successCallback, errorCallback, options){
+    _capture("captureImage", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch device camera application for recording video(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+Capture.prototype.captureVideo = function(successCallback, errorCallback, options){
+    _capture("captureVideo", successCallback, errorCallback, options);
+};
+
+
+module.exports = new Capture();
+
+});
+
+// file: lib/common/plugin/compass.js
+define("cordova/plugin/compass", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    utils = require('cordova/utils'),
+    CompassHeading = require('cordova/plugin/CompassHeading'),
+    CompassError = require('cordova/plugin/CompassError'),
+    timers = {},
+    compass = {
+        /**
+         * Asynchronously acquires the current heading.
+         * @param {Function} successCallback The function to call when the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {CompassOptions} options The options for getting the heading data (not used).
+         */
+        getCurrentHeading:function(successCallback, errorCallback, options) {
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var win = function(result) {
+                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
+                successCallback(ch);
+            };
+            var fail = function(code) {
+                var ce = new CompassError(code);
+                errorCallback(ce);
+            };
+
+            // Get heading
+            exec(win, fail, "Compass", "getHeading", [options]);
+        },
+
+        /**
+         * Asynchronously acquires the heading repeatedly at a given interval.
+         * @param {Function} successCallback The function to call each time the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {HeadingOptions} options The options for getting the heading data
+         * such as timeout and the frequency of the watch. For iOS, filter parameter
+         * specifies to watch via a distance filter rather than time.
+         */
+        watchHeading:function(successCallback, errorCallback, options) {
+            // Default interval (100 msec)
+            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
+            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
+
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var id = utils.createUUID();
+            if (filter > 0) {
+                // is an iOS request for watch by filter, no timer needed
+                timers[id] = "iOS";
+                compass.getCurrentHeading(successCallback, errorCallback, options);
+            } else {
+                // Start watch timer to get headings
+                timers[id] = window.setInterval(function() {
+                    compass.getCurrentHeading(successCallback, errorCallback);
+                }, frequency);
+            }
+
+            return id;
+        },
+
+        /**
+         * Clears the specified heading watch.
+         * @param {String} watchId The ID of the watch returned from #watchHeading.
+         */
+        clearWatch:function(id) {
+            // Stop javascript timer & remove from timer list
+            if (id && timers[id]) {
+                if (timers[id] != "iOS") {
+                      clearInterval(timers[id]);
+                  } else {
+                    // is iOS watch by filter so call into device to stop
+                    exec(null, null, "Compass", "stopHeading", []);
+                }
+                delete timers[id];
+            }
+        }
+    };
+
+module.exports = compass;
+});
+
+// file: lib/common/plugin/console-via-logger.js
+define("cordova/plugin/console-via-logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+
+var logger = require("cordova/plugin/logger");
+var utils  = require("cordova/utils");
+
+//------------------------------------------------------------------------------
+// object that we're exporting
+//------------------------------------------------------------------------------
+var console = module.exports;
+
+//------------------------------------------------------------------------------
+// copy of the original console object
+//------------------------------------------------------------------------------
+var WinConsole = window.console;
+
+//------------------------------------------------------------------------------
+// whether to use the logger
+//------------------------------------------------------------------------------
+var UseLogger = false;
+
+//------------------------------------------------------------------------------
+// Timers
+//------------------------------------------------------------------------------
+var Timers = {};
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+function noop() {}
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+console.useLogger = function (value) {
+    if (arguments.length) UseLogger = !!value;
+
+    if (UseLogger) {
+        if (logger.useConsole()) {
+            throw new Error("console and logger are too intertwingly");
+        }
+    }
+
+    return UseLogger;
+};
+
+//------------------------------------------------------------------------------
+console.log = function() {
+    if (logger.useConsole()) return;
+    logger.log.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.error = function() {
+    if (logger.useConsole()) return;
+    logger.error.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.warn = function() {
+    if (logger.useConsole()) return;
+    logger.warn.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.info = function() {
+    if (logger.useConsole()) return;
+    logger.info.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.debug = function() {
+    if (logger.useConsole()) return;
+    logger.debug.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.assert = function(expression) {
+    if (expression) return;
+
+    var message = utils.vformat(arguments[1], [].slice.call(arguments, 2));
+    console.log("ASSERT: " + message);
+};
+
+//------------------------------------------------------------------------------
+console.clear = function() {};
+
+//------------------------------------------------------------------------------
+console.dir = function(object) {
+    console.log("%o", object);
+};
+
+//------------------------------------------------------------------------------
+console.dirxml = function(node) {
+    console.log(node.innerHTML);
+};
+
+//------------------------------------------------------------------------------
+console.trace = noop;
+
+//------------------------------------------------------------------------------
+console.group = console.log;
+
+//------------------------------------------------------------------------------
+console.groupCollapsed = console.log;
+
+//------------------------------------------------------------------------------
+console.groupEnd = noop;
+
+//------------------------------------------------------------------------------
+console.time = function(name) {
+    Timers[name] = new Date().valueOf();
+};
+
+//------------------------------------------------------------------------------
+console.timeEnd = function(name) {
+    var timeStart = Timers[name];
+    if (!timeStart) {
+        console.warn("unknown timer: " + name);
+        return;
+    }
+
+    var timeElapsed = new Date().valueOf() - timeStart;
+    console.log(name + ": " + timeElapsed + "ms");
+};
+
+//------------------------------------------------------------------------------
+console.timeStamp = noop;
+
+//------------------------------------------------------------------------------
+console.profile = noop;
+
+//------------------------------------------------------------------------------
+console.profileEnd = noop;
+
+//------------------------------------------------------------------------------
+console.count = noop;
+
+//------------------------------------------------------------------------------
+console.exception = console.log;
+
+//------------------------------------------------------------------------------
+console.table = function(data, columns) {
+    console.log("%o", data);
+};
+
+//------------------------------------------------------------------------------
+// return a new function that calls both functions passed as args
+//------------------------------------------------------------------------------
+function wrapperedOrigCall(orgFunc, newFunc) {
+    return function() {
+        var args = [].slice.call(arguments);
+        try { orgFunc.apply(WinConsole, args); } catch (e) {}
+        try { newFunc.apply(console,    args); } catch (e) {}
+    };
+}
+
+//------------------------------------------------------------------------------
+// For every function that exists in the original console object, that
+// also exists in the new console object, wrap the new console method
+// with one that calls both
+//------------------------------------------------------------------------------
+for (var key in console) {
+    if (typeof WinConsole[key] == "function") {
+        console[key] = wrapperedOrigCall(WinConsole[key], console[key]);
+    }
+}
+
+});
+
+// file: lib/common/plugin/contacts.js
+define("cordova/plugin/contacts", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+* Represents a group of Contacts.
+* @constructor
+*/
+var contacts = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     * @param fields that should be searched
+     * @param successCB success callback
+     * @param errorCB error callback
+     * @param {ContactFindOptions} options that can be applied to contact searching
+     * @return array of Contacts matching search criteria
+     */
+    find:function(fields, successCB, errorCB, options) {
+        if (!successCB) {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+        if (!fields || (utils.isArray(fields) && fields.length === 0)) {
+            if (typeof errorCB === "function") {
+                errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+        } else {
+            var win = function(result) {
+                var cs = [];
+                for (var i = 0, l = result.length; i < l; i++) {
+                    cs.push(contacts.create(result[i]));
+                }
+                successCB(cs);
+            };
+            exec(win, errorCB, "Contacts", "search", [fields, options]);
+        }
+    },
+
+    /**
+     * This function creates a new contact, but it does not persist the contact
+     * to device storage. To persist the contact to device storage, invoke
+     * contact.save().
+     * @param properties an object who's properties will be examined to create a new Contact
+     * @returns new Contact object
+     */
+    create:function(properties) {
+        var i;
+        var contact = new Contact();
+        for (i in properties) {
+            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
+                contact[i] = properties[i];
+            }
+        }
+        return contact;
+    }
+};
+
+module.exports = contacts;
+
+});
+
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+var channel = require('cordova/channel'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+/**
+ * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+    this.available = false;
+    this.platform = null;
+    this.version = null;
+    this.name = null;
+    this.uuid = null;
+    this.cordova = null;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function(info) {
+            me.available = true;
+            me.platform = info.platform;
+            me.version = info.version;
+            me.name = info.name;
+            me.uuid = info.uuid;
+            me.cordova = info.cordova;
+            channel.onCordovaInfoReady.fire();
+        },function(e) {
+            me.available = false;
+            utils.alert("[ERROR] Error initializing Cordova: " + e);
+        });
+    });
+}
+
+/**
+ * Get device info
+ *
+ * @param {Function} successCallback The function to call when the heading data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
+ */
+Device.prototype.getInfo = function(successCallback, errorCallback) {
+
+    // successCallback required
+    if (typeof successCallback !== "function") {
+        console.log("Device Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Device Error: errorCallback is not a function");
+        return;
+    }
+
+    // Get info
+    exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/common/plugin/geolocation.js
+define("cordova/plugin/geolocation", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    PositionError = require('cordova/plugin/PositionError'),
+    Position = require('cordova/plugin/Position');
+
+var timers = {};   // list of timers in use
+
+// Returns default params, overrides if provided with values
+function parseParameters(options) {
+    var opt = {
+        maximumAge: 0,
+        enableHighAccuracy: false,
+        timeout: Infinity
+    };
+
+    if (options) {
+        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
+            opt.maximumAge = options.maximumAge;
+        }
+        if (options.enableHighAccuracy !== undefined) {
+            opt.enableHighAccuracy = options.enableHighAccuracy;
+        }
+        if (options.timeout !== undefined && !isNaN(options.timeout)) {
+            if (options.timeout < 0) {
+                opt.timeout = 0;
+            } else {
+                opt.timeout = options.timeout;
+            }
+        }
+    }
+
+    return opt;
+}
+
+// Returns a timeout failure, closed over a specified timeout value and error callback.
+function createTimeout(errorCallback, timeout) {
+    var t = setTimeout(function() {
+        clearTimeout(t);
+        t = null;
+        errorCallback({
+            code:PositionError.TIMEOUT,
+            message:"Position retrieval timed out."
+        });
+    }, timeout);
+    return t;
+}
+
+var geolocation = {
+    lastPosition:null, // reference to last known (cached) position returned
+    /**
+   * Asynchronously aquires the current position.
+   *
+   * @param {Function} successCallback    The function to call when the position data is available
+   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)
+   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)
+   */
+    getCurrentPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("getCurrentPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        // Timer var that will fire an error callback if no position is retrieved from native
+        // before the "timeout" param provided expires
+        var timeoutTimer = null;
+
+        var win = function(p) {
+            clearTimeout(timeoutTimer);
+            if (!timeoutTimer) {
+                // Timeout already happened, or native fired error callback for
+                // this geo request.
+                // Don't continue with success callback.
+                return;
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+        var fail = function(e) {
+            clearTimeout(timeoutTimer);
+            timeoutTimer = null;
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
+        // fire the success callback with the cached position.
+        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
+            successCallback(geolocation.lastPosition);
+        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
+        } else if (options.timeout === 0) {
+            fail({
+                code:PositionError.TIMEOUT,
+                message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
+            });
+        // Otherwise we have to call into native to retrieve a position.
+        } else {
+            if (options.timeout !== Infinity) {
+                // If the timeout value was not set to Infinity (default), then
+                // set up a timeout function that will fire the error callback
+                // if no successful position was retrieved before timeout expired.
+                timeoutTimer = createTimeout(fail, options.timeout);
+            } else {
+                // This is here so the check in the win function doesn't mess stuff up
+                // may seem weird but this guarantees timeoutTimer is
+                // always truthy before we call into native
+                timeoutTimer = true;
+            }
+            exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
+        }
+        return timeoutTimer;
+    },
+    /**
+     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,
+     * the successCallback is called with the new location.
+     *
+     * @param {Function} successCallback    The function to call each time the location data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)
+     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("watchPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        var id = utils.createUUID();
+
+        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
+        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
+
+        var fail = function(e) {
+            clearTimeout(timers[id]);
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        var win = function(p) {
+            clearTimeout(timers[id]);
+            if (options.timeout !== Infinity) {
+                timers[id] = createTimeout(fail, options.timeout);
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+
+        exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
+
+        return id;
+    },
+    /**
+     * Clears the specified heading watch.
+     *
+     * @param {String} id       The ID of the watch returned from #watchPosition
+     */
+    clearWatch:function(id) {
+        if (id && timers[id] !== undefined) {
+            clearTimeout(timers[id]);
+            delete timers[id];
+            exec(null, null, "Geolocation", "clearWatch", [id]);
+        }
+    }
+};
+
+module.exports = geolocation;
+
+});
+
+// file: lib/common/plugin/logger.js
+define("cordova/plugin/logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+// The logger module exports the following properties/functions:
+//
+// LOG                          - constant for the level LOG
+// ERROR                        - constant for the level ERROR
+// WARN                         - constant for the level WARN
+// INFO                         - constant for the level INFO
+// DEBUG                        - constant for the level DEBUG
+// logLevel()                   - returns current log level
+// logLevel(value)              - sets and returns a new log level
+// useConsole()                 - returns whether logger is using console
+// useConsole(value)            - sets and returns whether logger is using console
+// log(message,...)             - logs a message at level LOG
+// error(message,...)           - logs a message at level ERROR
+// warn(message,...)            - logs a message at level WARN
+// info(message,...)            - logs a message at level INFO
+// debug(message,...)           - logs a message at level DEBUG
+// logLevel(level,message,...)  - logs a message specified level
+//
+//------------------------------------------------------------------------------
+
+var logger = exports;
+
+var exec    = require('cordova/exec');
+var utils   = require('cordova/utils');
+
+var UseConsole   = true;
+var Queued       = [];
+var DeviceReady  = false;
+var CurrentLevel;
+
+/**
+ * Logging levels
+ */
+
+var Levels = [
+    "LOG",
+    "ERROR",
+    "WARN",
+    "INFO",
+    "DEBUG"
+];
+
+/*
+ * add the logging levels to the logger object and
+ * to a separate levelsMap object for testing
+ */
+
+var LevelsMap = {};
+for (var i=0; i<Levels.length; i++) {
+    var level = Levels[i];
+    LevelsMap[level] = i;
+    logger[level]    = level;
+}
+
+CurrentLevel = LevelsMap.WARN;
+
+/**
+ * Getter/Setter for the logging level
+ *
+ * Returns the current logging level.
+ *
+ * When a value is passed, sets the logging level to that value.
+ * The values should be one of the following constants:
+ *    logger.LOG
+ *    logger.ERROR
+ *    logger.WARN
+ *    logger.INFO
+ *    logger.DEBUG
+ *
+ * The value used determines which messages get printed.  The logging
+ * values above are in order, and only messages logged at the logging
+ * level or above will actually be displayed to the user.  Eg, the
+ * default level is WARN, so only messages logged with LOG, ERROR, or
+ * WARN will be displayed; INFO and DEBUG messages will be ignored.
+ */
+logger.level = function (value) {
+    if (arguments.length) {
+        if (LevelsMap[value] === null) {
+            throw new Error("invalid logging level: " + value);
+        }
+        CurrentLevel = LevelsMap[value];
+    }
+
+    return Levels[CurrentLevel];
+};
+
+/**
+ * Getter/Setter for the useConsole functionality
+ *
+ * When useConsole is true, the logger will log via the
+ * browser 'console' object.  Otherwise, it will use the
+ * native Logger plugin.
+ */
+logger.useConsole = function (value) {
+    if (arguments.length) UseConsole = !!value;
+
+    if (UseConsole) {
+        if (typeof console == "undefined") {
+            throw new Error("global console object is not defined");
+        }
+
+        if (typeof console.log != "function") {
+            throw new Error("global console object does not have a log function");
+        }
+
+        if (typeof console.useLogger == "function") {
+            if (console.useLogger()) {
+                throw new Error("console and logger are too intertwingly");
+            }
+        }
+    }
+
+    return UseConsole;
+};
+
+/**
+ * Logs a message at the LOG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.log   = function(message) { logWithArgs("LOG",   arguments); };
+
+/**
+ * Logs a message at the ERROR level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.error = function(message) { logWithArgs("ERROR", arguments); };
+
+/**
+ * Logs a message at the WARN level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.warn  = function(message) { logWithArgs("WARN",  arguments); };
+
+/**
+ * Logs a message at the INFO level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.info  = function(message) { logWithArgs("INFO",  arguments); };
+
+/**
+ * Logs a message at the DEBUG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.debug = function(message) { logWithArgs("DEBUG", arguments); };
+
+// log at the specified level with args
+function logWithArgs(level, args) {
+    args = [level].concat([].slice.call(args));
+    logger.logLevel.apply(logger, args);
+}
+
+/**
+ * Logs a message at the specified level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.logLevel = function(level, message /* , ... */) {
+    // format the message with the parameters
+    var formatArgs = [].slice.call(arguments, 2);
+    message    = utils.vformat(message, formatArgs);
+
+    if (LevelsMap[level] === null) {
+        throw new Error("invalid logging level: " + level);
+    }
+
+    if (LevelsMap[level] > CurrentLevel) return;
+
+    // queue the message if not yet at deviceready
+    if (!DeviceReady && !UseConsole) {
+        Queued.push([level, message]);
+        return;
+    }
+
+    // if not using the console, use the native logger
+    if (!UseConsole) {
+        exec(null, null, "Logger", "logLevel", [level, message]);
+        return;
+    }
+
+    // make sure console is not using logger
+    if (console.__usingCordovaLogger) {
+        throw new Error("console and logger are too intertwingly");
+    }
+
+    // log to the console
+    switch (level) {
+        case logger.LOG:   console.log(message); break;
+        case logger.ERROR: console.log("ERROR: " + message); break;
+        case logger.WARN:  console.log("WARN: "  + message); break;
+        case logger.INFO:  console.log("INFO: "  + message); break;
+        case logger.DEBUG: console.log("DEBUG: " + message); break;
+    }
+};
+
+// when deviceready fires, log queued messages
+logger.__onDeviceReady = function() {
+    if (DeviceReady) return;
+
+    DeviceReady = true;
+
+    for (var i=0; i<Queued.length; i++) {
+        var messageArgs = Queued[i];
+        logger.logLevel(messageArgs[0], messageArgs[1]);
+    }
+
+    Queued = null;
+};
+
+// add a deviceready event to log queued messages
+document.addEventListener("deviceready", logger.__onDeviceReady, false);
+
+});
+
+// file: lib/common/plugin/network.js
+define("cordova/plugin/network", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    cordova = require('cordova'),
+    channel = require('cordova/channel');
+
+var NetworkConnection = function () {
+    this.type = null;
+    this._firstRun = true;
+    this._timer = null;
+    this.timeout = 500;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function (info) {
+            me.type = info;
+            if (info === "none") {
+                // set a timer if still offline at the end of timer send the offline event
+                me._timer = setTimeout(function(){
+                    cordova.fireDocumentEvent("offline");
+                    me._timer = null;
+                    }, me.timeout);
+            } else {
+                // If there is a current offline event pending clear it
+                if (me._timer !== null) {
+                    clearTimeout(me._timer);
+                    me._timer = null;
+                }
+                cordova.fireDocumentEvent("online");
+            }
+
+            // should only fire this once
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+        },
+        function (e) {
+            // If we can't get the network info we should still tell Cordova
+            // to fire the deviceready event.
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+            console.log("Error initializing Network Connection: " + e);
+        });
+    });
+};
+
+/**
+ * Get connection info
+ *
+ * @param {Function} successCallback The function to call when the Connection data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)
+ */
+NetworkConnection.prototype.getInfo = function (successCallback, errorCallback) {
+    // Get info
+    exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
+};
+
+module.exports = new NetworkConnection();
+});
+
+// file: lib/common/plugin/notification.js
+define("cordova/plugin/notification", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Provides access to notifications on the device.
+ */
+
+module.exports = {
+
+    /**
+     * Open a native alert dialog, with a customizable title and button text.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} completeCallback   The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Alert)
+     * @param {String} buttonLabel          Label of the close button (default: OK)
+     */
+    alert: function(message, completeCallback, title, buttonLabel) {
+        var _title = (title || "Alert");
+        var _buttonLabel = (buttonLabel || "OK");
+        exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]);
+    },
+
+    /**
+     * Open a native confirm dialog, with a customizable title and button text.
+     * The result that the user selects is returned to the result callback.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Confirm)
+     * @param {String} buttonLabels         Comma separated list of the labels of the buttons (default: 'OK,Cancel')
+     */
+    confirm: function(message, resultCallback, title, buttonLabels) {
+        var _title = (title || "Confirm");
+        var _buttonLabels = (buttonLabels || "OK,Cancel");
+        exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
+    },
+
+    /**
+     * Causes the device to vibrate.
+     *
+     * @param {Integer} mills       The number of milliseconds to vibrate for.
+     */
+    vibrate: function(mills) {
+        exec(null, null, "Notification", "vibrate", [mills]);
+    },
+
+    /**
+     * Causes the device to beep.
+     * On Android, the default notification ringtone is played "count" times.
+     *
+     * @param {Integer} count       The number of beeps.
+     */
+    beep: function(count) {
+        exec(null, null, "Notification", "beep", [count]);
+    }
+};
+});
+
+// file: lib/common/plugin/requestFileSystem.js
+define("cordova/plugin/requestFileSystem", function(require, exports, module) {
+var FileError = require('cordova/plugin/FileError'),
+    FileSystem = require('cordova/plugin/FileSystem'),
+    exec = require('cordova/exec');
+
+/**
+ * Request a file system in which to store application data.
+ * @param type  local file system type
+ * @param size  indicates how much storage space, in bytes, the application expects to need
+ * @param successCallback  invoked with a FileSystem object
+ * @param errorCallback  invoked if error occurs retrieving file system
+ */
+var requestFileSystem = function(type, size, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    if (type < 0 || type > 3) {
+        fail(FileError.SYNTAX_ERR);
+    } else {
+        // if successful, return a FileSystem object
+        var success = function(file_system) {
+            if (file_system) {
+                if (typeof successCallback === 'function') {
+                    // grab the name and root from the file system object
+                    var result = new FileSystem(file_system.name, file_system.root);
+                    successCallback(result);
+                }
+            }
+            else {
+                // no FileSystem object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+        exec(success, fail, "File", "requestFileSystem", [type, size]);
+    }
+};
+
+module.exports = requestFileSystem;
+});
+
+// file: lib/common/plugin/resolveLocalFileSystemURI.js
+define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    FileError = require('cordova/plugin/FileError'),
+    exec = require('cordova/exec');
+
+/**
+ * Look up file system Entry referred to by local URI.
+ * @param {DOMString} uri  URI referring to a local file or directory
+ * @param successCallback  invoked with Entry object corresponding to URI
+ * @param errorCallback    invoked if error occurs retrieving file system entry
+ */
+module.exports = function(uri, successCallback, errorCallback) {
+    // error callback
+    var fail = function(error) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(error));
+        }
+    };
+    // sanity check for 'not:valid:filename'
+    if(!uri || uri.split(":").length > 2) {
+        setTimeout( function() {
+            fail(FileError.ENCODING_ERR);
+        },0);
+        return;
+    }
+    // if successful, return either a file or directory entry
+    var success = function(entry) {
+        var result;
+        if (entry) {
+            if (typeof successCallback === 'function') {
+                // create appropriate Entry object
+                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
+                try {
+                    successCallback(result);
+                }
+                catch (e) {
+                    console.log('Error invoking callback: ' + e);
+                }
+            }
+        }
+        else {
+            // no Entry object returned
+            fail(FileError.NOT_FOUND_ERR);
+        }
+    };
+
+    exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
+};
+
+});
+
+// file: lib/common/plugin/splashscreen.js
+define("cordova/plugin/splashscreen", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+var splashscreen = {
+    show:function() {
+        exec(null, null, "SplashScreen", "show", []);
+    },
+    hide:function() {
+        exec(null, null, "SplashScreen", "hide", []);
+    }
+};
+
+module.exports = splashscreen;
+});
+
+// file: lib/tizen/plugin/tizen/Accelerometer.js
+define("cordova/plugin/tizen/Accelerometer", function(require, exports, module) {
+var callback = null;
+
+module.exports = {
+    start: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+        callback = function (motion) {
+            successCallback({
+                x: motion.accelerationIncludingGravity.x,
+                y: motion.accelerationIncludingGravity.y,
+                z: motion.accelerationIncludingGravity.z,
+                timestamp: motion.timeStamp
+            });
+        };
+        window.addEventListener("devicemotion", callback);
+    },
+    stop: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+    }
+};
+});
+
+// file: lib/tizen/plugin/tizen/Battery.js
+define("cordova/plugin/tizen/Battery", function(require, exports, module) {
+/*global tizen:false */
+var id = null;
+
+module.exports = {
+    start: function(successCallback, errorCallback) {
+        var tizenSuccessCallback = function(power) {
+            if (successCallback) {
+                successCallback({level: Math.round(power.level * 100), isPlugged: power.isCharging});
+            }
+        };
+
+        if (id === null) {
+            id = tizen.systeminfo.addPropertyValueChangeListener("Power", tizenSuccessCallback);
+        }
+        tizen.systeminfo.getPropertyValue("Power", tizenSuccessCallback, errorCallback);
+    },
+
+    stop: function(successCallback, errorCallback) {
+        tizen.systeminfo.removePropertyValueChangeListener(id);
+        id = null;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Camera.js
+define("cordova/plugin/tizen/Camera", function(require, exports, module) {
+/*global tizen:false */
+var Camera = require('cordova/plugin/CameraConstants');
+
+function makeReplyCallback(successCallback, errorCallback) {
+    return {
+        onsuccess: function(reply) {
+            if (reply.length > 0) {
+                successCallback(reply[0].value);
+            } else {
+                errorCallback('Picture selection aborted');
+            }
+        },
+        onfail: function() {
+           console.log('The service launch failed');
+        }
+    };
+}
+
+module.exports = {
+    takePicture: function(successCallback, errorCallback, args) {
+        var destinationType = args[1],
+            sourceType = args[2],
+            encodingType = args[5],
+            mediaType = args[6];
+            // Not supported
+            /*
+            quality = args[0]
+            targetWidth = args[3]
+            targetHeight = args[4]
+            allowEdit = args[7]
+            correctOrientation = args[8]
+            saveToPhotoAlbum = args[9]
+            */
+
+        if (destinationType !== Camera.DestinationType.FILE_URI) {
+            errorCallback('DestinationType not supported');
+            return;
+        }
+        if (mediaType !== Camera.MediaType.PICTURE) {
+            errorCallback('MediaType not supported');
+            return;
+        }
+
+        var mimeType;
+        if (encodingType === Camera.EncodingType.JPEG) {
+            mimeType = 'image/jpeg';
+        } else if (encodingType === Camera.EncodingType.PNG) {
+            mimeType = 'image/png';
+        } else {
+            mimeType = 'image/*';
+        }
+
+        var serviceId;
+        if (sourceType === Camera.PictureSourceType.CAMERA) {
+            serviceId = 'http://tizen.org/appsvc/operation/create_content';
+        } else {
+            serviceId = 'http://tizen.org/appsvc/operation/pick';
+        }
+
+        var service = new tizen.ApplicationService(serviceId, null, mimeType, null);
+        tizen.application.launchService(service, null, null,
+                function(error) { errorCallback(error.message); },
+                makeReplyCallback(successCallback, errorCallback));
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Compass.js
+define("cordova/plugin/tizen/Compass", function(require, exports, module) {
+var CompassError = require('cordova/plugin/CompassError'),
+    callback = null, ready = false;
+
+module.exports = {
+    getHeading: function(successCallback, errorCallback) {
+        if (window.DeviceOrientationEvent !== undefined) {
+            callback = function (orientation) {
+                var heading = 360 - orientation.alpha;
+                if (ready) {
+                    successCallback({
+                        magneticHeading: heading,
+                        trueHeading: heading,
+                        headingAccuracy: 0,
+                        timestamp: orientation.timeStamp
+                    });
+                    window.removeEventListener("deviceorientation", callback);
+                }
+                ready = true;
+            };
+            ready = false; // workaround invalid first event value returned by WRT
+            window.addEventListener("deviceorientation", callback);
+        }
+        else {
+            errorCallback(CompassError.COMPASS_NOT_SUPPORTED);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Contact.js
+define("cordova/plugin/tizen/Contact", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// ------------------
+// Utility functions
+// ------------------
+
+
+/**
+ * Retrieves a Tizen Contact object from the device by its unique id.
+ *
+ * @param uid
+ *            Unique id of the contact on the device
+ * @return {tizen.Contact} Tizen Contact object or null if contact with
+ *         specified id is not found
+ */
+var findByUniqueId = function(id) {
+
+    if (!id) {
+        return null;
+    }
+
+    var tizenContact = null;
+
+    tizen.contact.getDefaultAddressBook().find(
+        function _successCallback(contacts){
+            tizenContact = contacts[0];
+        },
+        function _errorCallback(error){
+            console.log("tizen find error " + error);
+        },
+        new tizen.AttributeFilter('id', 'CONTAINS', id),
+        new tizen.SortMode('id', 'ASC'));
+
+    return tizenContact || null;
+};
+
+
+var traceTizenContact = function (tizenContact) {
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.id " + tizenContact.id);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.lastUpdated " + tizenContact.lastUpdated);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.name " + tizenContact.name);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.account " + tizenContact.account);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.addresses " + tizenContact.addresses);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.photoURI " + tizenContact.photoURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.phoneNumbers " + tizenContact.phoneNumbers);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.emails " + tizenContact.emails);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.birthday " + tizenContact.birthday);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.organization " + tizenContact.organization);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.notes " + tizenContact.notes);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.urls " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.isFavorite " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.ringtonesURI " + tizenContact.ringtonesURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.categories " + tizenContact.categories);
+};
+
+
+/**
+ * Creates a Tizen contact object from the W3C Contact object and persists
+ * it to device storage.
+ *
+ * @param {Contact}
+ *            contact The contact to save
+ * @return a new contact object with all properties set
+ */
+var saveToDevice = function(contact) {
+
+    if (!contact) {
+        return;
+    }
+
+    var tizenContact = null;
+    var update = false;
+    var i = 0;
+
+    // if the underlying Tizen Contact object already exists, retrieve it for
+    // update
+    if (contact.id) {
+        // we must attempt to retrieve the BlackBerry contact from the device
+        // because this may be an update operation
+        tizenContact = findByUniqueId(contact.id);
+    }
+
+    // contact not found on device, create a new one
+    if (!tizenContact) {
+        tizenContact = new tizen.Contact();
+    }
+    // update the existing contact
+    else {
+        update = true;
+    }
+
+    // NOTE: The user may be working with a partial Contact object, because only
+    // user-specified Contact fields are returned from a find operation (blame
+    // the W3C spec). If this is an update to an existing Contact, we don't
+    // want to clear an attribute from the contact database simply because the
+    // Contact object that the user passed in contains a null value for that
+    // attribute. So we only copy the non-null Contact attributes to the
+    // Tizen Contact object before saving.
+    //
+    // This means that a user must explicitly set a Contact attribute to a
+    // non-null value in order to update it in the contact database.
+    //
+    traceTizenContact (tizenContact);
+
+    // display name
+    if (contact.displayName !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            tizenContact.name.displayName = contact.displayName;
+        }
+    }
+
+    // name
+    if (contact.name !== null) {
+        if (contact.name.givenName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.firstName = contact.name.givenName;
+            }
+        }
+
+        if  (contact.name.middleName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.middleName = contact.name.middleName;
+            }
+        }
+
+        if (contact.name.familyName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.lastName = contact.name.familyName;
+            }
+        }
+
+        if (contact.name.honorificPrefix) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.prefix = contact.name.honorificPrefix;
+            }
+        }
+    }
+
+    // nickname
+    if (contact.nickname !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            if (!utils.isArray(tizenContact.name.nicknames))
+            {
+                tizenContact.name.nicknames = [];
+            }
+            tizenContact.name.nicknames[0] = contact.nickname;
+        }
+    }
+    else {
+        tizenContact.name.nicknames = [];
+    }
+
+    // note
+    if (contact.note !== null) {
+        if (tizenContact.note === null) {
+            tizenContact.note = [];
+        }
+        if (tizenContact.note !== null) {
+            tizenContact.note[0] = contact.note;
+        }
+    }
+
+    // photos
+    if (contact.photos && utils.isArray(contact.emails) && contact.emails.length > 0) {
+        tizenContact.photoURI = contact.photos[0];
+    }
+
+    if (utils.isDate(contact.birthday)) {
+        if (!utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday = new Date();
+        }
+        if (utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday.setDate(contact.birthday.getDate());
+        }
+    }
+
+    // Tizen supports many addresses
+    if (utils.isArray(contact.emails)) {
+
+        // if this is an update, re initialize email addresses
+        if (update) {
+            // doit on effacer sur un update??????
+        }
+
+        // copy the first three email addresses found
+        var emails = [];
+        for (i = 0; i < contact.emails.length; i += 1) {
+            var emailTypes = [];
+
+            emailTypes.push (contact.emails[i].type);
+
+            if (contact.emails[i].pref) {
+                emailTypes.push ("PREF");
+            }
+
+            emails.push(
+                new tizen.ContactEmailAddress(
+                    contact.emails[i].value,
+                    emailTypes)
+            );
+        }
+        tizenContact.emails = emails.length > 0 ? emails : [];
+    }
+    else {
+        tizenContact.emails = [];
+    }
+
+    // Tizen supports many phone numbers
+    // copy into appropriate fields based on type
+    if (utils.isArray(contact.phoneNumbers)) {
+        // if this is an update, re-initialize phone numbers
+        if (update) {
+        }
+
+        var phoneNumbers = [];
+
+        for (i = 0; i < contact.phoneNumbers.length; i += 1) {
+
+            if (!contact.phoneNumbers[i] || !contact.phoneNumbers[i].value) {
+                continue;
+            }
+
+             var phoneTypes = [];
+             phoneTypes.push (contact.phoneNumbers[i].type);
+
+             if (contact.phoneNumbers[i].pref) {
+                 phoneTypes.push ("PREF");
+             }
+
+            phoneNumbers.push(
+                new tizen.ContactPhoneNumber(
+                    contact.phoneNumbers[i].value,
+                    phoneTypes)
+            );
+        }
+
+        tizenContact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : [];
+    } else {
+        tizenContact.phoneNumbers = [];
+    }
+
+    if (utils.isArray(contact.addresses)) {
+        // if this is an update, re-initialize addresses
+        if (update) {
+        }
+
+        var addresses = [],
+            address = null;
+
+        for ( i = 0; i < contact.addresses.length; i += 1) {
+            address = contact.addresses[i];
+
+            if (!address || address.id === undefined || address.pref === undefined || address.type === undefined || address.formatted === undefined) {
+                continue;
+            }
+
+            var addressTypes = [];
+            addressTypes.push (address.type);
+
+            if (address.pref) {
+                addressTypes.push ("PREF");
+            }
+
+            addresses.push(
+                new tizen.ContactAddress({
+                         country:                   address.country,
+                         region :                   address.region,
+                         city:                      address.locality,
+                         streetAddress:             address.streetAddress,
+                         additionalInformation:     "",
+                         postalCode:                address.postalCode,
+                         types :                    addressTypes
+                }));
+
+        }
+        tizenContact.addresses = addresses.length > 0 ? addresses : [];
+
+    } else{
+        tizenContact.addresses = [];
+    }
+
+    // copy first url found to BlackBerry 'webpage' field
+    if (utils.isArray(contact.urls)) {
+        // if this is an update, re-initialize web page
+        if (update) {
+        }
+
+        var url = null,
+            urls = [];
+
+        for ( i = 0; i< contact.urls.length; i+= 1) {
+            url = contact.urls[i];
+
+            if (!url || !url.value) {
+                continue;
+            }
+
+            urls.push( new tizen.ContactWebSite(url.value, url.type));
+        }
+        tizenContact.urls = urls.length > 0 ? urls : [];
+    } else{
+        tizenContact.urls = [];
+    }
+
+    if (utils.isArray(contact.organizations && contact.organizations.length > 0) ) {
+        // if this is an update, re-initialize org attributes
+        var organization = contact.organizations[0];
+
+         tizenContact.organization = new tizen.ContacOrganization({
+             name:          organization.name,
+             department:    organization.department,
+             office:        "",
+             title:         organization.title,
+             role:          "",
+             logoURI:       ""
+         });
+    }
+
+    // categories
+    if (utils.isArray(contact.categories)) {
+        tizenContact.categories = [];
+
+        var category = null;
+
+        for (i = 0; i < contact.categories.length; i += 1) {
+            category = contact.categories[i];
+
+            if (typeof category === "string") {
+                tizenContact.categories.push(category);
+            }
+        }
+    }
+    else {
+        tizenContact.categories = [];
+    }
+
+    // save to device
+    // in tizen contact mean update or add
+    // later we might use addBatch and updateBatch
+    if (update){
+        tizen.contact.getDefaultAddressBook().update(tizenContact);
+    }
+    else {
+        tizen.contact.getDefaultAddressBook().add(tizenContact);
+    }
+
+    // Use the fully populated Tizen contact object to create a
+    // corresponding W3C contact object.
+    return ContactUtils.createContact(tizenContact, [ "*" ]);
+};
+
+
+/**
+ * Creates a Tizen ContactAddress object from a W3C ContactAddress.
+ *
+ * @return {tizen.ContactAddress} a Tizen ContactAddress object
+ */
+var createTizenAddress = function(address) {
+
+    var type = null,
+        pref = null,
+        typesAr = [];
+
+    if (address === null) {
+        return null;
+    }
+
+
+    var tizenAddress = new tizen.ContactAddress();
+
+    if (tizenAddress === null) {
+        return null;
+    }
+
+    typesAr.push(address.type);
+
+    if (address.pref) {
+        typesAr.push("PREF");
+    }
+
+    tizenAddress.country = address.country || "";
+    tizenAddress.region = address.region || "";
+    tizenAddress.city = address.locality || "";
+    tizenAddress.streetAddress = address.streetAddress || "";
+    tizenAddress.postalCode = address.postalCode || "";
+    tizenAddress.types = typesAr || "";
+
+    return tizenAddress;
+};
+
+module.exports = {
+    /**
+     * Persists contact to device storage.
+     */
+
+    save : function(successCB, failCB) {
+
+        try {
+            // save the contact and store it's unique id
+            var fullContact = saveToDevice(this);
+
+            this.id = fullContact.id;
+
+            // This contact object may only have a subset of properties
+            // if the save was an update of an existing contact. This is
+            // because the existing contact was likely retrieved using a
+            // subset of properties, so only those properties were set in the
+            // object. For this reason, invoke success with the contact object
+            // returned by saveToDevice since it is fully populated.
+
+            if (typeof successCB === 'function') {
+                successCB(fullContact);
+            }
+        }
+        catch (error) {
+            console.log('Error saving contact: ' +  error);
+
+            if (typeof failCB === 'function') {
+                failCB (new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    },
+
+    /**
+     * Removes contact from device storage.
+     *
+     * @param successCB
+     *            successCB callback
+     * @param failCB
+     *            error callback
+     */
+    remove : function (successCB, failCB) {
+
+        try {
+            // retrieve contact from device by id
+            var tizenContact = null;
+
+            if (this.id) {
+                tizenContact = findByUniqueId(this.id);
+            }
+
+
+            // if contact was found, remove it
+            if (tizenContact) {
+
+                tizen.contact.getDefaultAddressBook().remove(tizenContact.id);
+
+                if (typeof success === 'function') {
+                    successCB(this);
+                }
+            }
+            // attempting to remove a contact that hasn't been saved
+            else if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+        catch (error) {
+            console.log('Error removing contact ' + this.id + ": " + error);
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/ContactUtils.js
+define("cordova/plugin/tizen/ContactUtils", function(require, exports, module) {
+/*global tizen:false */
+var ContactAddress = require('cordova/plugin/ContactAddress'),
+    ContactName = require('cordova/plugin/ContactName'),
+    ContactField = require('cordova/plugin/ContactField'),
+    ContactOrganization = require('cordova/plugin/ContactOrganization'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+ * Mappings for each Contact field that may be used in a find operation. Maps
+ * W3C Contact fields to one or more fields in a Tizen contact object.
+ *
+ * Example: user searches with a filter on the Contact 'name' field:
+ *
+ * <code>Contacts.find(['name'], onSuccess, onFail, {filter:'Bob'});</code>
+ *
+ * The 'name' field does not exist in a Tizen contact. Instead, a filter
+ * expression will be built to search the Tizen contacts using the
+ * Tizen 'title', 'firstName' and 'lastName' fields.
+ */
+var fieldMappings = {
+    "id" : ["id"],
+    "displayName" : ["name.displayName"],
+    "nickname": ["name.nicknames"],
+    "name" : [ "name.prefix", "name.firstName", "name.lastName" ],
+    "phoneNumbers" : ["phoneNumbers.number","phoneNumbers.types"],
+    "emails" : ["emails.types", "emails.email"],
+    "addresses" : ["addresses.country","addresses.region","addresses.city","addresses.streetAddress","addresses.postalCode","addresses.country","addresses.types"],
+    "organizations" : ["organization.name","organization.department","organization.office", "organization.title"],
+    "birthday" : ["birthday"],
+    "note" : ["notes"],
+    "photos" : ["photoURI"],
+    "categories" : ["categories"],
+    "urls" : ["urls.url", "urls.type"]
+};
+
+/*
+ * Build an array of all of the valid W3C Contact fields. This is used to
+ * substitute all the fields when ["*"] is specified.
+ */
+var allFields = [];
+
+(function initializeAllFieldsMapping() {
+
+    for ( var key in fieldMappings) {
+        allFields.push(key);
+    }
+    // as we want it to be executed once
+    function initializeAllFieldsMapping() {
+    }
+
+})();
+
+/**
+ * Create a W3C ContactAddress object from a Tizen Address object
+ *
+ * @param {String}
+ *            type the type of address (e.g. work, home)
+ * @param {tizen.ContactAddress}
+ *            tizenAddress a Tizen Address object
+ * @return {ContactAddress} a contact address object or null if the specified
+ *         address is null
+ */
+var createContactAddress = function(type, tizenAddress) {
+    if (!tizenAddress) {
+        return null;
+    }
+
+    var streetAddress = tizenAddress.streetAddress;
+    var locality = tizenAddress.city || "";
+    var region = tizenAddress.region || "";
+    var postalCode = tizenAddress.postalCode || "";
+    var country = tizenAddress.country || "";
+    var formatted = streetAddress + ", " + locality + ", " + region + ", " + postalCode + ", " + country;
+
+    var contact = new ContactAddress(null, type, formatted, streetAddress, locality, region, postalCode, country);
+
+    return contact;
+};
+
+module.exports = {
+    /**
+     * Builds Tizen filter expressions for contact search using the
+     * contact fields and search filter provided.
+     *
+     * @param {String[]}
+     *            fields Array of Contact fields to search
+     * @param {String}
+     *            filter Filter, or search string
+     * @param {Boolean}
+     *                 multiple, one contacts or more wanted as result
+     * @return filter expression or null if fields is empty or filter is null or
+     *         empty
+     */
+
+    buildFilterExpression: function(fields, filter) {
+        // ensure filter exists
+        if (!filter || filter === "") {
+            return null;
+        }
+
+        if ((fields.length === 1) && (fields[0] === "*")) {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // build a filter expression using all Contact fields provided
+        var compositeFilter = null,
+            attributeFilter = null,
+            filterExpression = null,
+            matchFlag = "CONTAINS",
+            matchValue = filter,
+            attributesArray = [];
+
+        if (fields && utils.isArray(fields)) {
+
+            for ( var field in fields) {
+
+                if (!fields[field]) {
+                    continue;
+                }
+
+                // retrieve Tizen contact fields that map Cordova fields specified
+                // (tizenFields is a string or an array of strings)
+                var tizenFields = fieldMappings[fields[field]];
+
+                if (!tizenFields) {
+                    // does something maps
+                    continue;
+                }
+
+                // construct the filter expression using the Tizen fields
+                for ( var index in tizenFields) {
+                    attributeFilter = new tizen.AttributeFilter(tizenFields[index], matchFlag, matchValue);
+                    if (attributeFilter !== null) {
+                        attributesArray.push(attributeFilter);
+                    }
+                }
+            }
+        }
+
+        // fullfil tizen find attribute as a single or a composite attribute
+        if (attributesArray.length == 1 ) {
+            filterExpression = attributeFilter[0];
+        } else if (attributesArray.length > 1) {
+            // combine the filters as a Union
+            filterExpression = new tizen.CompositeFilter("UNION", attributesArray);
+        } else {
+            filterExpression = null;
+        }
+
+        return filterExpression;
+    },
+
+
+
+    /**
+     * Creates a Contact object from a Tizen Contact object, copying only
+     * the fields specified.
+     *
+     * This is intended as a privately used function but it is made globally
+     * available so that a Contact.save can convert a BlackBerry contact object
+     * into its W3C equivalent.
+     *
+     * @param {tizen.Contact}
+     *            tizenContact Tizen Contact object
+     * @param {String[]}
+     *            fields array of contact fields that should be copied
+     * @return {Contact} a contact object containing the specified fields or
+     *         null if the specified contact is null
+     */
+    createContact: function(tizenContact, fields) {
+
+        if (!tizenContact) {
+            return null;
+        }
+
+        // construct a new contact object
+        // always copy the contact id and displayName fields
+        var contact = new Contact(tizenContact.id, tizenContact.name.displayName);
+
+
+        // nothing to do
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            return contact;
+        } else if (fields.length === 1 && fields[0] === "*") {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // add the fields specified
+        for ( var key in fields) {
+
+            var field = fields[key],
+                index = 0;
+
+            if (!field) {
+                continue;
+            }
+
+            // name
+            if (field.indexOf('name') === 0) {
+
+                var formattedName = (tizenContact.name.prefix || "");
+
+                if (tizenContact.name.firstName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.firstName || "");
+                }
+
+                if (tizenContact.name.middleName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.middleName || "");
+                }
+
+                if (tizenContact.name.lastName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.lastName || "");
+                }
+
+                contact.name = new ContactName(
+                        formattedName,
+                        tizenContact.name.lastName,
+                        tizenContact.name.firstName,
+                        tizenContact.name.middleName,
+                        tizenContact.name.prefix,
+                        null);
+            }
+
+            // phoneNumbers
+            else if (field.indexOf('phoneNumbers') === 0) {
+
+                var phoneNumbers = [];
+
+                for (index = 0 ; index < tizenContact.phoneNumbers.length ; ++index) {
+
+                    phoneNumbers.push(
+                            new ContactField(
+                                    'PHONE',
+                                    tizenContact.phoneNumbers[index].number,
+                                    ((tizenContact.phoneNumbers[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+
+
+                contact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : null;
+            }
+
+            // emails
+            else if (field.indexOf('emails') === 0) {
+
+                var emails = [];
+
+                for (index = 0 ; index < tizenContact.emails.length ; ++index) {
+
+                    emails.push(
+                        new ContactField(
+                            'EMAILS',
+                            tizenContact.emails[index].email,
+                            ((tizenContact.emails[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+                contact.emails = emails.length > 0 ? emails : null;
+            }
+
+            // addresses
+            else if (field.indexOf('addresses') === 0) {
+
+                var addresses = [];
+                for (index = 0 ; index < tizenContact.addresses.length ; ++index) {
+
+                    addresses.push(
+                            new ContactAddress(
+                                    ((tizenContact.addresses[index].types[1] &&  tizenContact.addresses[index].types[1] === "PREF") ? true : false),
+                                    tizenContact.addresses[index].types[0] ? tizenContact.addresses[index].types[0] : "HOME",
+                                    null,
+                                    tizenContact.addresses[index].streetAddress,
+                                    tizenContact.addresses[index].city,
+                                    tizenContact.addresses[index].region,
+                                    tizenContact.addresses[index].postalCode,
+                                    tizenContact.addresses[index].country ));
+                }
+
+                contact.addresses = addresses.length > 0 ? addresses : null;
+            }
+
+            // birthday
+            else if (field.indexOf('birthday') === 0) {
+                if (utils.isDate(tizenContact.birthday)) {
+                    contact.birthday = tizenContact.birthday;
+                }
+            }
+
+            // note only one in Tizen Contact
+            else if (field.indexOf('note') === 0) {
+                if (tizenContact.note) {
+                    contact.note = tizenContact.note[0];
+                }
+            }
+
+            // organizations
+            else if (field.indexOf('organizations') === 0) {
+
+                var organizations = [];
+
+                // there's only one organization in a Tizen Address
+
+                if (tizenContact.organization) {
+                    organizations.push(
+                            new ContactOrganization(
+                                    true,
+                                    'WORK',
+                                    tizenContact.organization.name,
+                                    tizenContact.organization.department,
+                                    tizenContact.organization.jobTitle));
+                }
+
+                contact.organizations = organizations.length > 0 ? organizations : null;
+            }
+
+            // categories
+            else if (field.indexOf('categories') === 0) {
+
+                var categories = [];
+
+                if (tizenContact.categories) {
+
+                    for (index = 0 ; index < tizenContact.categories.length ; ++index) {
+                        categories.push(
+                                new ContactField(
+                                        'MAIN',
+                                        tizenContact.categories,
+                                        (index === 0) ));
+                    }
+
+                    contact.categories = categories.length > 0 ? categories : null;
+                }
+            }
+
+            // urls
+            else if (field.indexOf('urls') === 0) {
+                var urls = [];
+
+                if (tizenContact.urls) {
+                    for (index = 0 ; index <tizenContact.urls.length ; ++index) {
+                        urls.push(
+                                new ContactField(
+                                        tizenContact.urls[index].type,
+                                        tizenContact.urls[index].url,
+                                        (index === 0)));
+                    }
+                }
+
+                contact.urls = urls.length > 0 ? urls : null;
+            }
+
+            // photos
+            else if (field.indexOf('photos') === 0) {
+                var photos = [];
+
+                if (tizenContact.photoURI) {
+                    photos.push(new ContactField('URI', tizenContact.photoURI, true));
+                }
+
+                contact.photos = photos.length > 0 ? photos : null;
+            }
+        }
+
+        return contact;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Device.js
+define("cordova/plugin/tizen/Device", function(require, exports, module) {
+/*global tizen:false */
+var channel = require('cordova/channel');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+function Device() {
+    this.version = null;
+    this.uuid = null;
+    this.name = null;
+    this.cordova =  "2.0.0";
+    this.platform = "Tizen";
+
+    var me = this;
+
+    function onSuccessCallback(sysInfoProp) {
+        me.name = sysInfoProp.model;
+        me.uuid = sysInfoProp.imei;
+        me.version = sysInfoProp.version;
+        channel.onCordovaInfoReady.fire();
+    }
+
+    function onErrorCallback(error) {
+        console.log("error initializing cordova: " + error);
+    }
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getDeviceInfo(onSuccessCallback, onErrorCallback);
+    });
+}
+
+Device.prototype.getDeviceInfo = function(success, fail, args) {
+    tizen.systeminfo.getPropertyValue("Device", success, fail);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/tizen/plugin/tizen/File.js
+define("cordova/plugin/tizen/File", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileError = require('cordova/plugin/FileError'),
+    DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    File = require('cordova/plugin/File'),
+    FileSystem = require('cordova/plugin/FileSystem');
+
+var nativeRequestFileSystem = window.webkitRequestFileSystem,
+    nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL,
+    NativeFileReader = window.FileReader;
+
+function getFileSystemName(nativeFs) {
+    return (nativeFs.name.indexOf("Persistent") != -1) ? "persistent" : "temporary";
+}
+
+function makeEntry(entry) {
+    if (entry.isDirectory) {
+        return new DirectoryEntry(entry.name, decodeURI(entry.toURL()));
+    }
+    else {
+        return new FileEntry(entry.name, decodeURI(entry.toURL()));
+    }
+}
+
+module.exports = {
+    /* requestFileSystem */
+    requestFileSystem: function(successCallback, errorCallback, args) {
+        var type = args[0],
+            size = args[1];
+
+        nativeRequestFileSystem(type, size, function(nativeFs) {
+            successCallback(new FileSystem(getFileSystemName(nativeFs), makeEntry(nativeFs.root)));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* resolveLocalFileSystemURI */
+    resolveLocalFileSystemURI: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            successCallback(makeEntry(entry));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryReader */
+    readEntries: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(dirEntry) {
+            var reader = dirEntry.createReader();
+            reader.readEntries(function(entries) {
+                var retVal = [];
+                for (var i = 0; i < entries.length; i++) {
+                    retVal.push(makeEntry(entries[i]));
+                }
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* Entry */
+    getMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getMetadata(function(metaData) {
+                successCallback(metaData.modificationTime);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    moveTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.moveTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    copyTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.copyTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    remove: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.remove(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getParent: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getParent(function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileEntry */
+    getFileMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.file(function(file) {
+                var retVal = new File(file.name, decodeURI(entry.toURL()), file.type, file.lastModifiedDate, file.size);
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryEntry */
+    getDirectory: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getDirectory(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    removeRecursively: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.removeRecursively(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getFile: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getFile(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileReader */
+    readAsText: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            encoding = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsText(file, encoding);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    readAsDataURL: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsDataURL(file);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileWriter */
+    write: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            text = args[1],
+            position = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.position - position);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                var blob = new WebKitBlobBuilder();
+                blob.append(text);
+
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.seek(position);
+                writer.write(blob.getBlob('text/plain'));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    truncate: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            size = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.length);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.truncate(size);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/FileTransfer.js
+define("cordova/plugin/tizen/FileTransfer", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileEntry = require('cordova/plugin/FileEntry'),
+    FileTransferError = require('cordova/plugin/FileTransferError'),
+    FileUploadResult = require('cordova/plugin/FileUploadResult');
+
+var nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL;
+
+function getParentPath(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(0, pos + 1);
+}
+
+function getFileName(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(pos + 1);
+}
+
+module.exports = {
+    upload: function(successCallback, errorCallback, args) {
+        var filePath = args[0],
+            server = args[1],
+            fileKey = args[2],
+            fileName = args[3],
+            mimeType = args[4],
+            params = args[5],
+            /*trustAllHosts = args[6],*/
+            chunkedMode = args[7];
+
+        nativeResolveLocalFileSystemURI(filePath, function(entry) {
+            entry.file(function(file) {
+                function uploadFile(blobFile) {
+                    var fd = new FormData();
+
+                    fd.append(fileKey, blobFile, fileName);
+                    for (var prop in params) {
+                        if(params.hasOwnProperty(prop)) {
+                            fd.append(prop, params[prop]);
+                        }
+                    }
+
+                    var xhr = new XMLHttpRequest();
+                    xhr.open("POST", server);
+                    xhr.onload = function(evt) {
+                        if (xhr.status == 200) {
+                            var result = new FileUploadResult();
+                            result.bytesSent = file.size;
+                            result.responseCode = xhr.status;
+                            result.response = xhr.response;
+                            successCallback(result);
+                        } else if (xhr.status == 404) {
+                            errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                        } else {
+                            errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                        }
+                    };
+                    xhr.ontimeout = function(evt) {
+                        errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                    };
+
+                    xhr.send(fd);
+                }
+
+                var bytesPerChunk;
+                if (chunkedMode === true) {
+                    bytesPerChunk = 1024 * 1024; // 1MB chunk sizes.
+                } else {
+                    bytesPerChunk = file.size;
+                }
+                var start = 0;
+                var end = bytesPerChunk;
+                while (start < file.size) {
+                    var chunk = file.webkitSlice(start, end, mimeType);
+                    uploadFile(chunk);
+                    start = end;
+                    end = start + bytesPerChunk;
+                }
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            }
+            );
+        },
+        function(error) {
+            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+        }
+        );
+    },
+
+    download: function(successCallback, errorCallback, args) {
+        var url = args[0],
+            filePath = args[1];
+
+        var xhr = new XMLHttpRequest();
+
+        function writeFile(fileEntry) {
+            fileEntry.createWriter(function(writer) {
+                writer.onwriteend = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(new FileEntry(fileEntry.name, fileEntry.toURL()));
+                    } else {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    }
+                };
+
+                writer.onerror = function(evt) {
+                    errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                };
+
+                var builder = new WebKitBlobBuilder();
+                builder.append(xhr.response);
+                var blob = builder.getBlob();
+                writer.write(blob);
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            });
+        }
+
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState == xhr.DONE) {
+                if (xhr.status == 200 && xhr.response) {
+                    nativeResolveLocalFileSystemURI(getParentPath(filePath), function(dir) {
+                        dir.getFile(getFileName(filePath), {create: true}, writeFile, function(error) {
+                            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                        });
+                    }, function(error) {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    });
+                } else if (xhr.status == 404) {
+                    errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                } else {
+                    errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                }
+            }
+        };
+
+        xhr.open("GET", url, true);
+        xhr.responseType = "arraybuffer";
+        xhr.send();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Media.js
+define("cordova/plugin/tizen/Media", function(require, exports, module) {
+/*global Media:false, webkitURL:false */
+var MediaError = require('cordova/plugin/MediaError'),
+    audioObjects = {};
+
+module.exports = {
+    create: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::create() - id =" + id + ", src =" + src);
+        audioObjects[id] = new Audio(src);
+        audioObjects[id].onStalledCB = function () {
+            console.log("media::onStalled()");
+             audioObjects[id].timer = window.setTimeout(function () {
+                    audioObjects[id].pause();
+                    if (audioObjects[id].currentTime !== 0)
+                        audioObjects[id].currentTime = 0;
+                    console.log("media::onStalled() - MEDIA_ERROR -> " + MediaError.MEDIA_ERR_ABORTED);
+                    var err = new MediaError(MediaError.MEDIA_ERR_ABORTED, "Stalled");
+                    Media.onStatus(id, Media.MEDIA_ERROR, err);
+                }, 2000);
+        };
+        audioObjects[id].onEndedCB = function () {
+            console.log("media::onEndedCB() - MEDIA_STATE -> MEDIA_STOPPED");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        };
+        audioObjects[id].onErrorCB = function () {
+            console.log("media::onErrorCB() - MEDIA_ERROR -> " + event.srcElement.error);
+            Media.onStatus(id, Media.MEDIA_ERROR, event.srcElement.error);
+        };
+        audioObjects[id].onPlayCB = function () {
+            console.log("media::onPlayCB() - MEDIA_STATE -> MEDIA_STARTING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING);
+        };
+        audioObjects[id].onPlayingCB = function () {
+            console.log("media::onPlayingCB() - MEDIA_STATE -> MEDIA_RUNNING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING);
+        };
+        audioObjects[id].onDurationChangeCB = function () {
+            console.log("media::onDurationChangeCB() - MEDIA_DURATION -> " +  audioObjects[id].duration);
+            Media.onStatus(id, Media.MEDIA_DURATION, audioObjects[id].duration);
+        };
+        audioObjects[id].onTimeUpdateCB = function () {
+            console.log("media::onTimeUpdateCB() - MEDIA_POSITION -> " +  audioObjects[id].currentTime);
+            Media.onStatus(id, Media.MEDIA_POSITION, audioObjects[id].currentTime);
+        };
+        audioObjects[id].onCanPlayCB = function () {
+            console.log("media::onCanPlayCB()");
+            window.clearTimeout(audioObjects[id].timer);
+            audioObjects[id].play();
+        };
+      },
+    startPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1], options = args[2];
+        console.log("media::startPlayingAudio() - id =" + id + ", src =" + src + ", options =" + options);
+        audioObjects[id].addEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].addEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].addEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].addEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].addEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].addEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].addEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].addEventListener('stalled', audioObjects[id].onStalledCB);
+        audioObjects[id].play();
+    },
+    stopPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        audioObjects[id].pause();
+        if (audioObjects[id].currentTime !== 0)
+            audioObjects[id].currentTime = 0;
+        console.log("media::stopPlayingAudio() - MEDIA_STATE -> MEDIA_STOPPED");
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        audioObjects[id].removeEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].removeEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].removeEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].removeEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].removeEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].removeEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onStalledCB);
+    },
+    seekToAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], milliseconds = args[1];
+        console.log("media::seekToAudio()");
+         audioObjects[id].currentTime = milliseconds;
+        successCallback( audioObjects[id].currentTime);
+    },
+    pausePlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::pausePlayingAudio() - MEDIA_STATE -> MEDIA_PAUSED");
+        audioObjects[id].pause();
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED);
+    },
+    getCurrentPositionAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::getCurrentPositionAudio()");
+        successCallback(audioObjects[id].currentTime);
+    },
+    release: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        console.log("media::release()");
+    },
+    setVolume: function (successCallback, errorCallback, args) {
+        var id = args[0], volume = args[1];
+        console.log("media::setVolume()");
+        audioObjects[id].volume = volume;
+    },
+    startRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::startRecordingAudio() - id =" + id + ", src =" + src);
+
+        function gotStreamCB(stream) {
+            audioObjects[id].src = webkitURL.createObjectURL(stream);
+            console.log("media::startRecordingAudio() - stream CB");
+        }
+
+        function gotStreamFailedCB(error) {
+            console.log("media::startRecordingAudio() - error CB:" + error.toString());
+        }
+
+        if (navigator.webkitGetUserMedia) {
+            audioObjects[id] = new Audio();
+            navigator.webkitGetUserMedia('audio', gotStreamCB, gotStreamFailedCB);
+        } else {
+            console.log("webkitGetUserMedia not supported");
+        }
+        successCallback();
+    },
+    stopRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::stopRecordingAudio() - id =" + id);
+        audioObjects[id].pause();
+        successCallback();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/MediaError.js
+define("cordova/plugin/tizen/MediaError", function(require, exports, module) {
+
+// The MediaError object already exists on Tizen. This prevents the Cordova
+// version from being defined. This object is used to merge in differences
+// between Tizen and Cordova MediaError objects.
+module.exports = {
+        MEDIA_ERR_NONE_ACTIVE : 0,
+        MEDIA_ERR_NONE_SUPPORTED : 4
+};
+});
+
+// file: lib/tizen/plugin/tizen/NetworkStatus.js
+define("cordova/plugin/tizen/NetworkStatus", function(require, exports, module) {
+/*global tizen:false */
+var Connection = require('cordova/plugin/Connection');
+
+module.exports = {
+    getConnectionInfo: function (successCallback, errorCallback) {
+        var cncType = Connection.NONE;
+        var infoCount = 0;
+
+        function infoCB() {
+            infoCount++;
+            if (infoCount > 1)
+               successCallback(cncType);
+        }
+
+        function errorCB(error) {
+           console.log("Error: " + error.code + "," + error.name + "," + error.message);
+           infoCB();
+        }
+
+        function wifiSuccessCB(wifi) {
+            if ((wifi.status === "ON")  && (wifi.ipAddress.length !== 0))
+                cncType = Connection.WIFI;
+            infoCB();
+        }
+
+        function cellularSuccessCB(cell) {
+            if ((cncType === Connection.NONE) && (cell.status === "ON") && (cell.ipAddress.length !== 0))
+                cncType = Connection.CELL_2G;
+            infoCB();
+        }
+
+        if (tizen.systeminfo.isSupported('WifiNetwork')) {
+            tizen.systeminfo.getPropertyValue('WifiNetwork', wifiSuccessCB, errorCB);
+        }
+
+        if (tizen.systeminfo.isSupported('CellularNetwork')) {
+            tizen.systeminfo.getPropertyValue('CellularNetwork', cellularSuccessCB, errorCB);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Notification.js
+define("cordova/plugin/tizen/Notification", function(require, exports, module) {
+module.exports = {
+
+    alert: function(message, alertCallback, title, buttonName) {
+        return this.confirm(message, alertCallback, title, buttonName);
+    },
+
+    confirm: function(message, confirmCallback, title, buttonLabels) {
+        var index = null,
+            overlayElement = null,
+            popup = null,
+            element = null,
+            titleString = null,
+            messageString = null,
+            buttonString = null,
+            buttonsArray = null;
+
+        function initCss() {
+            var id = 'tizen-cordova-css';
+            if (document.getElementById(id))
+                return;
+
+            var rules = {
+                '.ui-popupwindow-screen' :  'background: #000000; opacity: 0.4;',
+                '.ui-popupwindow' : 'background: #828282; padding: 1px 1px; color: white; width: 80%; margin-left: 10%;',
+                '.popup-title' : 'background: #018ccc; padding: 5px 5px;',
+                '.popup-title p' : 'padding: 0px; margin: 0px; text-align: center;',
+                '.popup-text' : 'background: #2d2d2d; padding: 5px 5px;',
+                '.popup-text p' : 'padding: 0px; margin: 0px; text-align: center; vertical-align: middle; line-height:100px;',
+                '.popup-button-bg' : 'background: #424242; padding: 5px 5px;',
+                '.popup-button-bg ul' : 'list-style-type: none; width: 80%; margin-left: 10%; text-align: center; padding: 0px;',
+                '.popup-button-bg li' : 'display: inline;',
+                '.popup-button-bg li input' : 'border-radius: 4px 4px 4px 4px; border: 0px; background: #545454; padding: 5px 15px; color: white; min-width: 80px; margin: 0px 5px;'
+            };
+
+            var css = document.createElement('style');
+            css.type = 'text/css';
+            css.id = id;
+
+            var selector = null;
+            for (selector in rules) {
+                css.appendChild(document.createTextNode(selector + "{ " + rules[selector] + " }"));
+            }
+
+            document.getElementsByTagName("head")[0].appendChild(css);
+        }
+
+        initCss();
+
+        console.log ("message" , message);
+        console.log ("confirmCallback" , confirmCallback);
+        console.log ("title" , title);
+        console.log ("buttonLabels" , buttonLabels);
+
+        titleString = '<div class="popup-title"><p>' + title + '</p></div>';
+        messageString = '<div class="popup-text"><p>' + message + '</p></div>';
+        buttonString = '<div class="popup-button-bg"><ul>';
+
+        switch(typeof(buttonLabels))
+        {
+        case "string":
+            buttonsArray = buttonLabels.split(",");
+
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+
+        case "array":
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+        default:
+            console.log ("cordova/plugin/tizen/Notification, default, buttonLabels: ", buttonLabels);
+            break;
+        }
+
+        buttonString += '</ul></div>';
+
+        overlayElement = document.createElement("div");
+        overlayElement.className = 'ui-popupwindow-screen';
+
+        overlayElement.style.zIndex = 1001;
+        overlayElement.style.width = "100%";
+        overlayElement.style.height = "100%";
+        overlayElement.style.top = 0;
+        overlayElement.style.left = 0;
+        overlayElement.style.margin = 0;
+        overlayElement.style.padding = 0;
+        overlayElement.style.position = "absolute";
+
+        popup = document.createElement("div");
+        popup.className = "ui-popupwindow";
+        popup.style.position = "fixed";
+        popup.style.zIndex = 1002;
+        popup.innerHTML = titleString + messageString + buttonString;
+
+        document.body.appendChild(overlayElement);
+        document.body.appendChild(popup);
+
+        function createListener(button) {
+            return function() {
+                document.body.removeChild(overlayElement);
+                document.body.removeChild(popup);
+                confirmCallback(button.value);
+            };
+        }
+
+       for (index in buttonsArray) {
+           console.log ("index: ", index);
+
+           element = document.getElementById("popup-button-" + buttonsArray[index]);
+           element.addEventListener("click", createListener(element), false);
+       }
+    },
+
+    vibrate: function(milliseconds) {
+        console.log ("milliseconds" , milliseconds);
+
+        if (navigator.vibrate) {
+            navigator.vibrate(milliseconds);
+        }
+        else {
+            console.log ("cordova/plugin/tizen/Notification, vibrate API does not exists");
+        }
+    },
+
+    beep: function(count) {
+            console.log("notification:beep() - count = " + count);
+
+            var beepSound = new Audio("/sounds/beep.wav");
+            beepSound.cpt = 0;
+
+            beepSound.addEventListener('canplay', function () {
+                console.log("notification:beepSound() - canpay CB");
+                this.play();
+            });
+
+            beepSound.addEventListener('ended', function () {
+                console.log("notification:beepSound() - ended CB: cpt = " + this.cpt);
+                if (this.cpt !== 0) {
+                    if (this.currentTime !== 0)
+                        this.currentTime = 0;
+                    this.play();
+                    this.cpt--;
+                }
+            });
+
+            beepSound.addEventListener('error',  function () {
+                    console.log("notification:beepSound() - error CB");
+            });
+
+            beepSound.load();
+            beepSound.pause();
+            if (beepSound.currentTime !== 0)
+                beepSound.currentTime = 0;
+            beepSound.cpt = count - 1;
+            beepSound.play();
+    }
+};
+
+
+
+});
+
+// file: lib/tizen/plugin/tizen/contacts.js
+define("cordova/plugin/tizen/contacts", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils');
+
+module.exports = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     *
+     * @return array of Contacts matching search criteria
+     */
+    find : function(fields, successCB, failCB, options) {
+
+        // Success callback is required. Throw exception if not specified.
+        if (typeof successCB !== 'function') {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+
+        // Search qualifier is required and cannot be empty.
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+            return;
+        }
+
+        // options are optional
+        var filter ="",
+            multiple = false,
+            contacts = [],
+            tizenFilter = null;
+
+        if (options) {
+            filter = options.filter || "";
+            multiple =  options.multiple || false;
+        }
+
+        if (filter){
+            tizenFilter = ContactUtils.buildFilterExpression(fields, filter);
+        }
+
+        tizen.contact.getDefaultAddressBook().find(
+            function(tizenContacts) {
+                if (multiple) {
+                    for (var index in tizenContacts) {
+                        contacts.push(ContactUtils.createContact(tizenContacts[index], fields));
+                    }
+                }
+                else {
+                    contacts.push(ContactUtils.createContact(tizenContacts[0], fields));
+                }
+
+                // return results
+                successCB(contacts);
+            },
+            function(error) {
+                if (typeof failCB === 'function') {
+                    failCB(ContactError.UNKNOWN_ERROR);
+                }
+            },
+            tizenFilter,
+            null);
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/manager.js
+define("cordova/plugin/tizen/manager", function(require, exports, module) {
+var cordova = require('cordova');
+
+module.exports = {
+    exec: function (successCallback, errorCallback, clazz, action, args) {
+        var plugin = require('cordova/plugin/tizen/' + clazz);
+
+        if (plugin && typeof plugin[action] === 'function') {
+            var result = plugin[action](successCallback, errorCallback, args);
+            return result || {status: cordova.callbackStatus.NO_RESULT};
+        }
+
+        return {"status" : cordova.callbackStatus.CLASS_NOT_FOUND_EXCEPTION, "message" : "Function " + clazz + "::" + action + " cannot be found"};
+    },
+    resume: function () {},
+    pause: function () {},
+    destroy: function () {}
+};
+
+});
+
+// file: lib/common/utils.js
+define("cordova/utils", function(require, exports, module) {
+var utils = exports;
+
+/**
+ * Returns an indication of whether the argument is an array or not
+ */
+utils.isArray = function(a) {
+    return Object.prototype.toString.call(a) == '[object Array]';
+};
+
+/**
+ * Returns an indication of whether the argument is a Date or not
+ */
+utils.isDate = function(d) {
+    return Object.prototype.toString.call(d) == '[object Date]';
+};
+
+/**
+ * Does a deep clone of the object.
+ */
+utils.clone = function(obj) {
+    if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
+        return obj;
+    }
+
+    var retVal, i;
+
+    if(utils.isArray(obj)){
+        retVal = [];
+        for(i = 0; i < obj.length; ++i){
+            retVal.push(utils.clone(obj[i]));
+        }
+        return retVal;
+    }
+
+    retVal = {};
+    for(i in obj){
+        if(!(i in retVal) || retVal[i] != obj[i]) {
+            retVal[i] = utils.clone(obj[i]);
+        }
+    }
+    return retVal;
+};
+
+/**
+ * Returns a wrappered version of the function
+ */
+utils.close = function(context, func, params) {
+    if (typeof params == 'undefined') {
+        return function() {
+            return func.apply(context, arguments);
+        };
+    } else {
+        return function() {
+            return func.apply(context, params);
+        };
+    }
+};
+
+/**
+ * Create a UUID
+ */
+utils.createUUID = function() {
+    return UUIDcreatePart(4) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(6);
+};
+
+/**
+ * Extends a child object from a parent object using classical inheritance
+ * pattern.
+ */
+utils.extend = (function() {
+    // proxy used to establish prototype chain
+    var F = function() {};
+    // extend Child from Parent
+    return function(Child, Parent) {
+        F.prototype = Parent.prototype;
+        Child.prototype = new F();
+        Child.__super__ = Parent.prototype;
+        Child.prototype.constructor = Child;
+    };
+}());
+
+/**
+ * Alerts a message in any available way: alert or console.log.
+ */
+utils.alert = function(msg) {
+    if (alert) {
+        alert(msg);
+    } else if (console && console.log) {
+        console.log(msg);
+    }
+};
+
+/**
+ * Formats a string and arguments following it ala sprintf()
+ *
+ * see utils.vformat() for more information
+ */
+utils.format = function(formatString /* ,... */) {
+    var args = [].slice.call(arguments, 1);
+    return utils.vformat(formatString, args);
+};
+
+/**
+ * Formats a string and arguments following it ala vsprintf()
+ *
+ * format chars:
+ *   %j - format arg as JSON
+ *   %o - format arg as JSON
+ *   %c - format arg as ''
+ *   %% - replace with '%'
+ * any other char following % will format it's
+ * arg via toString().
+ *
+ * for rationale, see FireBug's Console API:
+ *    http://getfirebug.com/wiki/index.php/Console_API
+ */
+utils.vformat = function(formatString, args) {
+    if (formatString === null || formatString === undefined) return "";
+    if (arguments.length == 1) return formatString.toString();
+    if (typeof formatString != "string") return formatString.toString();
+
+    var pattern = /(.*?)%(.)(.*)/;
+    var rest    = formatString;
+    var result  = [];
+
+    while (args.length) {
+        var arg   = args.shift();
+        var match = pattern.exec(rest);
+
+        if (!match) break;
+
+        rest = match[3];
+
+        result.push(match[1]);
+
+        if (match[2] == '%') {
+            result.push('%');
+            args.unshift(arg);
+            continue;
+        }
+
+        result.push(formatted(arg, match[2]));
+    }
+
+    result.push(rest);
+
+    return result.join('');
+};
+
+//------------------------------------------------------------------------------
+function UUIDcreatePart(length) {
+    var uuidpart = "";
+    for (var i=0; i<length; i++) {
+        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
+        if (uuidchar.length == 1) {
+            uuidchar = "0" + uuidchar;
+        }
+        uuidpart += uuidchar;
+    }
+    return uuidpart;
+}
+
+//------------------------------------------------------------------------------
+function formatted(object, formatChar) {
+
+    try {
+        switch(formatChar) {
+            case 'j':
+            case 'o': return JSON.stringify(object);
+            case 'c': return '';
+        }
+    }
+    catch (e) {
+        return "error JSON.stringify()ing argument: " + e;
+    }
+
+    if ((object === null) || (object === undefined)) {
+        return Object.prototype.toString.call(object);
+    }
+
+    return object.toString();
+}
+
+});
+
+
+window.cordova = require('cordova');
+
+// file: lib/scripts/bootstrap.js
+(function (context) {
+    var channel = require("cordova/channel"),
+        _self = {
+            boot: function () {
+                /**
+                 * Create all cordova objects once page has fully loaded and native side is ready.
+                 */
+                channel.join(function() {
+                    var builder = require('cordova/builder'),
+                        base = require('cordova/common'),
+                        platform = require('cordova/platform');
+
+                    // Drop the common globals into the window object, but be nice and don't overwrite anything.
+                    builder.build(base.objects).intoButDontClobber(window);
+
+                    // Drop the platform-specific globals into the window object
+                    // and clobber any existing object.
+                    builder.build(platform.objects).intoAndClobber(window);
+
+                    // Merge the platform-specific overrides/enhancements into
+                    // the window object.
+                    if (typeof platform.merges !== 'undefined') {
+                        builder.build(platform.merges).intoAndMerge(window);
+                    }
+
+                    // Call the platform-specific initialization
+                    platform.initialize();
+
+                    // Fire event to notify that all objects are created
+                    channel.onCordovaReady.fire();
+
+                    // Fire onDeviceReady event once all constructors have run and
+                    // cordova info has been received from native side.
+                    channel.join(function() {
+                        require('cordova').fireDocumentEvent('deviceready');
+                    }, channel.deviceReadyChannelsArray);
+
+                }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);
+            }
+        };
+
+    // boot up once native side is ready
+    channel.onNativeReady.subscribeOnce(_self.boot);
+
+    // _nativeReady is global variable that the native side can set
+    // to signify that the native code is ready. It is a global since
+    // it may be called before any cordova JS is ready.
+    if (window._nativeReady) {
+        channel.onNativeReady.fire();
+    }
+
+}(window));
+
+// file: lib/scripts/bootstrap-tizen.js
+require('cordova/channel').onNativeReady.fire();
+
+
+})();
\ No newline at end of file
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/css/style.css b/templates/CordovaTizenWebUIFrameworkTemplate/project/css/style.css
new file mode 100644
index 0000000..25fa51c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/css/style.css
@@ -0,0 +1,2 @@
+body {
+}
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/icon.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/icon.png
new file mode 100755
index 0000000..eef3cd9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/icon.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/index.html b/templates/CordovaTizenWebUIFrameworkTemplate/project/index.html
new file mode 100644
index 0000000..f5e3bce
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8"/>
+    <meta name="description" content="A Cordova Tizen Web UI FW single-page template generated by Tizen Web IDE"/>
+
+    <title>Tizen Web IDE - Template - Cordova Tizen - Tizen Web UI Framework - Single-Page</title>
+    <!--NOTE:
+        jquery.js and web-ui-fw.js must be included.
+        DO NOT REMOVE below code!
+    -->
+    <script src="tizen-web-ui-fw/0.1/js/jquery.js"></script>
+    <script src="tizen-web-ui-fw/0.1/js/tizen-web-ui-fw-libs.js"></script>
+    <script src="tizen-web-ui-fw/0.1/js/tizen-web-ui-fw.js"
+        data-framework-theme="tizen-gray" data-framework-viewport-scale="false"></script>
+
+    <!--NOTE:
+        Additional scripts and css files are to be placed here.
+        You can use jQuery namespace($) and all functionalities in jQuery
+        in your script.  For example:
+
+            <script src="main.js"></script>
+            <link rel="stylesheet" href="my.css">
+
+        When you want to manipulate elements in your code, you have to
+        use domReady for your code to work properly, like this;
+
+            domReady(function(){ ... });
+    -->
+    <script type="text/javascript" src="cordova-2.0.0.js"></script>
+        
+    <script type="text/javascript" src="./js/main.js"></script>
+    <link rel="stylesheet" type="text/css" href="./css/style.css"/>
+</head>
+
+<body>
+    <div data-role="page">
+        <div data-role="header" data-position="fixed">
+            <h1>Cordova Single-Page Application </h1>
+        </div><!-- /header -->
+
+        <div data-role="content">
+            <p>This is a Cordova single page boilerplate template that you can copy to build your first Cordova Tizen Web UI Framework page.</p>
+            <div id="myButton" data-role="button" data-inline="true">Battery Info</div>
+            <div id="myInfo" data-role="content" data-inline="true" hidden="hidden">
+            	<p>Battery Info.</p>
+            </div>
+        </div>
+        </div><!-- /content -->
+
+        <div data-role="footer" data-position="fixed">
+            <h4>Footer content</h4>
+        </div><!-- /footer -->
+    </div><!-- /page -->
+</body>
+</html>
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/js/main.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/js/main.js
new file mode 100644
index 0000000..8d48a03
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/js/main.js
@@ -0,0 +1,27 @@
+var deviceReady = false;
+
+var init = function () {
+    console.log("init() called");
+    $("#myButton").click(function () {
+        $(this).remove();
+        $("#myInfo").show();
+        window.addEventListener("batterystatus", function(info) {
+            $("#myInfo").text("Level = " + info.level + "%, Status: " + ((info.isPlugged) ? "Plugged" : "Unplugged"));
+        }, false);
+    });
+    
+};
+
+window.onload = function () {
+    document.addEventListener("deviceready", function () {
+       deviceReady = true;
+       console.log("Device = " + device.platform + ", Version = " + device.version);
+       $(document).ready(init);
+    }, false);
+
+    window.setTimeout(function() {
+        if (!deviceReady) {
+            alert("Cordova initialization failed !!!");
+        }
+    }, 1000);
+};
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/sounds/beep.wav b/templates/CordovaTizenWebUIFrameworkTemplate/project/sounds/beep.wav
new file mode 100644
index 0000000..1e9797c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/sounds/beep.wav
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af-ZA.js
new file mode 100644
index 0000000..8588aef
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af-ZA.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture af-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "af-ZA", "default", {
+	name: "af-ZA",
+	englishName: "Afrikaans (South Africa)",
+	nativeName: "Afrikaans (Suid Afrika)",
+	language: "af",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
+				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
+				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
+			},
+			months: {
+				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af.js
new file mode 100644
index 0000000..0f17c0d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.af.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture af
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "af", "default", {
+	name: "af",
+	englishName: "Afrikaans",
+	nativeName: "Afrikaans",
+	language: "af",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
+				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
+				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
+			},
+			months: {
+				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am-ET.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am-ET.js
new file mode 100644
index 0000000..e603a0b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am-ET.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture am-ET
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "am-ET", "default", {
+	name: "am-ET",
+	englishName: "Amharic (Ethiopia)",
+	nativeName: "አማርኛ (ኢትዮጵያ)",
+	language: "am",
+	numberFormat: {
+		decimals: 1,
+		groupSizes: [3,0],
+		NaN: "NAN",
+		percent: {
+			pattern: ["-n%","n%"],
+			decimals: 1,
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			groupSizes: [3,0],
+			symbol: "ETB"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
+			},
+			months: {
+				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
+				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
+			},
+			AM: ["ጡዋት","ጡዋት","ጡዋት"],
+			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
+			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd '፣' MMMM d 'ቀን' yyyy",
+				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
+				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
+				M: "MMMM d ቀን",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am.js
new file mode 100644
index 0000000..fe1a37c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.am.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture am
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "am", "default", {
+	name: "am",
+	englishName: "Amharic",
+	nativeName: "አማርኛ",
+	language: "am",
+	numberFormat: {
+		decimals: 1,
+		groupSizes: [3,0],
+		NaN: "NAN",
+		percent: {
+			pattern: ["-n%","n%"],
+			decimals: 1,
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			groupSizes: [3,0],
+			symbol: "ETB"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
+			},
+			months: {
+				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
+				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
+			},
+			AM: ["ጡዋት","ጡዋት","ጡዋት"],
+			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
+			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd '፣' MMMM d 'ቀን' yyyy",
+				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
+				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
+				M: "MMMM d ቀን",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-AE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-AE.js
new file mode 100644
index 0000000..fdf1a51
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-AE.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-AE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-AE", "default", {
+	name: "ar-AE",
+	englishName: "Arabic (U.A.E.)",
+	nativeName: "العربية (الإمارات العربية المتحدة)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.إ.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-BH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-BH.js
new file mode 100644
index 0000000..b073e2c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-BH.js
@@ -0,0 +1,462 @@
+/*
+ * Globalize Culture ar-BH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-BH", "default", {
+	name: "ar-BH",
+	englishName: "Arabic (Bahrain)",
+	nativeName: "العربية (البحرين)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ب.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-DZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-DZ.js
new file mode 100644
index 0000000..75eaa7f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-DZ.js
@@ -0,0 +1,458 @@
+/*
+ * Globalize Culture ar-DZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-DZ", "default", {
+	name: "ar-DZ",
+	englishName: "Arabic (Algeria)",
+	nativeName: "العربية (الجزائر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.ج.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-EG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-EG.js
new file mode 100644
index 0000000..9d2365c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-EG.js
@@ -0,0 +1,484 @@
+/*
+ * Globalize Culture ar-EG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-EG", "default", {
+	name: "ar-EG",
+	englishName: "Arabic (Egypt)",
+	nativeName: "العربية (مصر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ج.م.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-IQ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-IQ.js
new file mode 100644
index 0000000..0235336
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-IQ.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-IQ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-IQ", "default", {
+	name: "ar-IQ",
+	englishName: "Arabic (Iraq)",
+	nativeName: "العربية (العراق)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.ع.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-JO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-JO.js
new file mode 100644
index 0000000..152ce08
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-JO.js
@@ -0,0 +1,462 @@
+/*
+ * Globalize Culture ar-JO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-JO", "default", {
+	name: "ar-JO",
+	englishName: "Arabic (Jordan)",
+	nativeName: "العربية (الأردن)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ا.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-KW.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-KW.js
new file mode 100644
index 0000000..07d1f89
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-KW.js
@@ -0,0 +1,462 @@
+/*
+ * Globalize Culture ar-KW
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-KW", "default", {
+	name: "ar-KW",
+	englishName: "Arabic (Kuwait)",
+	nativeName: "العربية (الكويت)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ك.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LB.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LB.js
new file mode 100644
index 0000000..8c82f5a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LB.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-LB
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-LB", "default", {
+	name: "ar-LB",
+	englishName: "Arabic (Lebanon)",
+	nativeName: "العربية (لبنان)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.ل.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LY.js
new file mode 100644
index 0000000..5c16db8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-LY.js
@@ -0,0 +1,462 @@
+/*
+ * Globalize Culture ar-LY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-LY", "default", {
+	name: "ar-LY",
+	englishName: "Arabic (Libya)",
+	nativeName: "العربية (ليبيا)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			decimals: 3,
+			symbol: "د.ل.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-MA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-MA.js
new file mode 100644
index 0000000..483eba8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-MA.js
@@ -0,0 +1,458 @@
+/*
+ * Globalize Culture ar-MA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-MA", "default", {
+	name: "ar-MA",
+	englishName: "Arabic (Morocco)",
+	nativeName: "العربية (المملكة المغربية)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.م.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-OM.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-OM.js
new file mode 100644
index 0000000..630fef0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-OM.js
@@ -0,0 +1,458 @@
+/*
+ * Globalize Culture ar-OM
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-OM", "default", {
+	name: "ar-OM",
+	englishName: "Arabic (Oman)",
+	nativeName: "العربية (عمان)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "ر.ع.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-QA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-QA.js
new file mode 100644
index 0000000..69839a2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-QA.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-QA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-QA", "default", {
+	name: "ar-QA",
+	englishName: "Arabic (Qatar)",
+	nativeName: "العربية (قطر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.ق.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SA.js
new file mode 100644
index 0000000..86c73cd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SA.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-SA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-SA", "default", {
+	name: "ar-SA",
+	englishName: "Arabic (Saudi Arabia)",
+	nativeName: "العربية (المملكة العربية السعودية)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SY.js
new file mode 100644
index 0000000..1444e7e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-SY.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-SY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-SY", "default", {
+	name: "ar-SY",
+	englishName: "Arabic (Syria)",
+	nativeName: "العربية (سوريا)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-TN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-TN.js
new file mode 100644
index 0000000..47eb3ca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-TN.js
@@ -0,0 +1,463 @@
+/*
+ * Globalize Culture ar-TN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-TN", "default", {
+	name: "ar-TN",
+	englishName: "Arabic (Tunisia)",
+	nativeName: "العربية (تونس)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ت.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-YE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-YE.js
new file mode 100644
index 0000000..2d25f2f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar-YE.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar-YE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar-YE", "default", {
+	name: "ar-YE",
+	englishName: "Arabic (Yemen)",
+	nativeName: "العربية (اليمن)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.ي.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar.js
new file mode 100644
index 0000000..31938bd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ar.js
@@ -0,0 +1,457 @@
+/*
+ * Globalize Culture ar
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar", "default", {
+	name: "ar",
+	englishName: "Arabic",
+	nativeName: "العربية",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn-CL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn-CL.js
new file mode 100644
index 0000000..12a7ebe
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn-CL.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture arn-CL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "arn-CL", "default", {
+	name: "arn-CL",
+	englishName: "Mapudungun (Chile)",
+	nativeName: "Mapudungun (Chile)",
+	language: "arn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn.js
new file mode 100644
index 0000000..9839cd9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.arn.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture arn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "arn", "default", {
+	name: "arn",
+	englishName: "Mapudungun",
+	nativeName: "Mapudungun",
+	language: "arn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as-IN.js
new file mode 100644
index 0000000..ead83ba
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as-IN.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture as-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "as-IN", "default", {
+	name: "as-IN",
+	englishName: "Assamese (India)",
+	nativeName: "অসমীয়া (ভাৰত)",
+	language: "as",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","n$"],
+			groupSizes: [3,2],
+			symbol: "ট"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্রবাৰ","শনিবাৰ","ৰবিবাৰ"],
+				namesAbbr: ["সোম.","মঙ্গল.","বুধ.","বৃহ.","শুক্র.","শনি.","ৰবি."],
+				namesShort: ["সো","ম","বু","বৃ","শু","শ","র"]
+			},
+			months: {
+				names: ["জানুৱাৰী","ফেব্রুৱাৰী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টেম্বর","অক্টোবর","নবেম্বর","ডিচেম্বর",""],
+				namesAbbr: ["জানু","ফেব্রু","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টে","অক্টো","নবে","ডিচে",""]
+			},
+			AM: ["ৰাতিপু","ৰাতিপু","ৰাতিপু"],
+			PM: ["আবেলি","আবেলি","আবেলি"],
+			eras: [{"name":"খ্রীষ্টাব্দ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "yyyy,MMMM dd, dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy,MMMM dd, dddd tt h:mm",
+				F: "yyyy,MMMM dd, dddd tt h:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM,yy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as.js
new file mode 100644
index 0000000..f20cccf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.as.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture as
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "as", "default", {
+	name: "as",
+	englishName: "Assamese",
+	nativeName: "অসমীয়া",
+	language: "as",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","n$"],
+			groupSizes: [3,2],
+			symbol: "ট"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্রবাৰ","শনিবাৰ","ৰবিবাৰ"],
+				namesAbbr: ["সোম.","মঙ্গল.","বুধ.","বৃহ.","শুক্র.","শনি.","ৰবি."],
+				namesShort: ["সো","ম","বু","বৃ","শু","শ","র"]
+			},
+			months: {
+				names: ["জানুৱাৰী","ফেব্রুৱাৰী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টেম্বর","অক্টোবর","নবেম্বর","ডিচেম্বর",""],
+				namesAbbr: ["জানু","ফেব্রু","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টে","অক্টো","নবে","ডিচে",""]
+			},
+			AM: ["ৰাতিপু","ৰাতিপু","ৰাতিপু"],
+			PM: ["আবেলি","আবেলি","আবেলি"],
+			eras: [{"name":"খ্রীষ্টাব্দ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "yyyy,MMMM dd, dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy,MMMM dd, dddd tt h:mm",
+				F: "yyyy,MMMM dd, dddd tt h:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM,yy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl-AZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl-AZ.js
new file mode 100644
index 0000000..5808bdf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl-AZ.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az-Cyrl-AZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az-Cyrl-AZ", "default", {
+	name: "az-Cyrl-AZ",
+	englishName: "Azeri (Cyrillic, Azerbaijan)",
+	nativeName: "Азәрбајҹан (Азәрбајҹан)",
+	language: "az-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "ман."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],
+				namesAbbr: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],
+				namesShort: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"]
+			},
+			months: {
+				names: ["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["јанвар","феврал","март","апрел","мај","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","мая","ијун","ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl.js
new file mode 100644
index 0000000..786b81f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Cyrl.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az-Cyrl", "default", {
+	name: "az-Cyrl",
+	englishName: "Azeri (Cyrillic)",
+	nativeName: "Азәрбајҹан дили",
+	language: "az-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "ман."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],
+				namesAbbr: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],
+				namesShort: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"]
+			},
+			months: {
+				names: ["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["јанвар","феврал","март","апрел","мај","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","мая","ијун","ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn-AZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn-AZ.js
new file mode 100644
index 0000000..a70d637
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn-AZ.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az-Latn-AZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az-Latn-AZ", "default", {
+	name: "az-Latn-AZ",
+	englishName: "Azeri (Latin, Azerbaijan)",
+	nativeName: "Azərbaycan­ılı (Azərbaycan)",
+	language: "az-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn.js
new file mode 100644
index 0000000..a8175c2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az-Latn.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az-Latn", "default", {
+	name: "az-Latn",
+	englishName: "Azeri (Latin)",
+	nativeName: "Azərbaycan­ılı",
+	language: "az-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az.js
new file mode 100644
index 0000000..94c9ad0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.az.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture az
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "az", "default", {
+	name: "az",
+	englishName: "Azeri",
+	nativeName: "Azərbaycan­ılı",
+	language: "az",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba-RU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba-RU.js
new file mode 100644
index 0000000..b5f9559
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba-RU.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture ba-RU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ba-RU", "default", {
+	name: "ba-RU",
+	englishName: "Bashkir (Russia)",
+	nativeName: "Башҡорт (Россия)",
+	language: "ba",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ",",
+			symbol: "һ."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Йәкшәмбе","Дүшәмбе","Шишәмбе","Шаршамбы","Кесаҙна","Йома","Шәмбе"],
+				namesAbbr: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"],
+				namesShort: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"]
+			},
+			months: {
+				names: ["ғинуар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь",""],
+				namesAbbr: ["ғин","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy 'й'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'й' H:mm",
+				F: "d MMMM yyyy 'й' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba.js
new file mode 100644
index 0000000..b026451
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ba.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture ba
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ba", "default", {
+	name: "ba",
+	englishName: "Bashkir",
+	nativeName: "Башҡорт",
+	language: "ba",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ",",
+			symbol: "һ."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Йәкшәмбе","Дүшәмбе","Шишәмбе","Шаршамбы","Кесаҙна","Йома","Шәмбе"],
+				namesAbbr: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"],
+				namesShort: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"]
+			},
+			months: {
+				names: ["ғинуар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь",""],
+				namesAbbr: ["ғин","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy 'й'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'й' H:mm",
+				F: "d MMMM yyyy 'й' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be-BY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be-BY.js
new file mode 100644
index 0000000..9f736f2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be-BY.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture be-BY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "be-BY", "default", {
+	name: "be-BY",
+	englishName: "Belarusian (Belarus)",
+	nativeName: "Беларускі (Беларусь)",
+	language: "be",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],
+				namesAbbr: ["нд","пн","аў","ср","чц","пт","сб"],
+				namesShort: ["нд","пн","аў","ср","чц","пт","сб"]
+			},
+			months: {
+				names: ["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			monthsGenitive: {
+				names: ["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be.js
new file mode 100644
index 0000000..422a644
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.be.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture be
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "be", "default", {
+	name: "be",
+	englishName: "Belarusian",
+	nativeName: "Беларускі",
+	language: "be",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],
+				namesAbbr: ["нд","пн","аў","ср","чц","пт","сб"],
+				namesShort: ["нд","пн","аў","ср","чц","пт","сб"]
+			},
+			months: {
+				names: ["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			monthsGenitive: {
+				names: ["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg-BG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg-BG.js
new file mode 100644
index 0000000..bf3e085
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg-BG.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture bg-BG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bg-BG", "default", {
+	name: "bg-BG",
+	englishName: "Bulgarian (Bulgaria)",
+	nativeName: "български (България)",
+	language: "bg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "- безкрайност",
+		positiveInfinity: "+ безкрайност",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "лв."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],
+				namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"],
+				namesShort: ["н","п","в","с","ч","п","с"]
+			},
+			months: {
+				names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"след новата ера","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy 'г.'",
+				D: "dd MMMM yyyy 'г.'",
+				t: "HH:mm 'ч.'",
+				T: "HH:mm:ss 'ч.'",
+				f: "dd MMMM yyyy 'г.' HH:mm 'ч.'",
+				F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'",
+				M: "dd MMMM",
+				Y: "MMMM yyyy 'г.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg.js
new file mode 100644
index 0000000..06574e6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bg.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture bg
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bg", "default", {
+	name: "bg",
+	englishName: "Bulgarian",
+	nativeName: "български",
+	language: "bg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "- безкрайност",
+		positiveInfinity: "+ безкрайност",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "лв."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],
+				namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"],
+				namesShort: ["н","п","в","с","ч","п","с"]
+			},
+			months: {
+				names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"след новата ера","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy 'г.'",
+				D: "dd MMMM yyyy 'г.'",
+				t: "HH:mm 'ч.'",
+				T: "HH:mm:ss 'ч.'",
+				f: "dd MMMM yyyy 'г.' HH:mm 'ч.'",
+				F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'",
+				M: "dd MMMM",
+				Y: "MMMM yyyy 'г.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-BD.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-BD.js
new file mode 100644
index 0000000..7f746f8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-BD.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture bn-BD
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bn-BD", "default", {
+	name: "bn-BD",
+	englishName: "Bengali (Bangladesh)",
+	nativeName: "বাংলা (বাংলাদেশ)",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "৳"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-IN.js
new file mode 100644
index 0000000..169e4af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn-IN.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture bn-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bn-IN", "default", {
+	name: "bn-IN",
+	englishName: "Bengali (India)",
+	nativeName: "বাংলা (ভারত)",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "টা"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn.js
new file mode 100644
index 0000000..9a07ddb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bn.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture bn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bn", "default", {
+	name: "bn",
+	englishName: "Bengali",
+	nativeName: "বাংলা",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "টা"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo-CN.js
new file mode 100644
index 0000000..b337e02
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo-CN.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture bo-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bo-CN", "default", {
+	name: "bo-CN",
+	englishName: "Tibetan (PRC)",
+	nativeName: "བོད་ཡིག (ཀྲུང་ཧྭ་མི་དམངས་སྤྱི་མཐུན་རྒྱལ་ཁབ།)",
+	language: "bo",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ཨང་ཀི་མིན་པ།",
+		negativeInfinity: "མོ་གྲངས་ཚད་མེད་ཆུང་བ།",
+		positiveInfinity: "ཕོ་གྲངས་ཚད་མེད་ཆེ་བ།",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["གཟའ་ཉི་མ།","གཟའ་ཟླ་བ།","གཟའ་མིག་དམར།","གཟའ་ལྷག་པ།","གཟའ་ཕུར་བུ།","གཟའ་པ་སངས།","གཟའ་སྤེན་པ།"],
+				namesAbbr: ["ཉི་མ།","ཟླ་བ།","མིག་དམར།","ལྷག་པ།","ཕུར་བུ།","པ་སངས།","སྤེན་པ།"],
+				namesShort: ["༧","༡","༢","༣","༤","༥","༦"]
+			},
+			months: {
+				names: ["སྤྱི་ཟླ་དང་པོ།","སྤྱི་ཟླ་གཉིས་པ།","སྤྱི་ཟླ་གསུམ་པ།","སྤྱི་ཟླ་བཞི་པ།","སྤྱི་ཟླ་ལྔ་པ།","སྤྱི་ཟླ་དྲུག་པ།","སྤྱི་ཟླ་བདུན་པ།","སྤྱི་ཟླ་བརྒྱད་པ།","སྤྱི་ཟླ་དགུ་པ།","སྤྱི་ཟླ་བཅུ་པོ།","སྤྱི་ཟླ་བཅུ་གཅིག་པ།","སྤྱི་ཟླ་བཅུ་གཉིས་པ།",""],
+				namesAbbr: ["ཟླ་ ༡","ཟླ་ ༢","ཟླ་ ༣","ཟླ་ ༤","ཟླ་ ༥","ཟླ་ ༦","ཟླ་ ༧","ཟླ་ ༨","ཟླ་ ༩","ཟླ་ ༡༠","ཟླ་ ༡༡","ཟླ་ ༡༢",""]
+			},
+			AM: ["སྔ་དྲོ","སྔ་དྲོ","སྔ་དྲོ"],
+			PM: ["ཕྱི་དྲོ","ཕྱི་དྲོ","ཕྱི་དྲོ"],
+			eras: [{"name":"སྤྱི་ལོ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ལོའི་ཟླ' M'ཚེས' d",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm",
+				F: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm:ss",
+				M: "'ཟླ་' M'ཚེས'd",
+				Y: "yyyy.M"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo.js
new file mode 100644
index 0000000..f36be06
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bo.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture bo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bo", "default", {
+	name: "bo",
+	englishName: "Tibetan",
+	nativeName: "བོད་ཡིག",
+	language: "bo",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ཨང་ཀི་མིན་པ།",
+		negativeInfinity: "མོ་གྲངས་ཚད་མེད་ཆུང་བ།",
+		positiveInfinity: "ཕོ་གྲངས་ཚད་མེད་ཆེ་བ།",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["གཟའ་ཉི་མ།","གཟའ་ཟླ་བ།","གཟའ་མིག་དམར།","གཟའ་ལྷག་པ།","གཟའ་ཕུར་བུ།","གཟའ་པ་སངས།","གཟའ་སྤེན་པ།"],
+				namesAbbr: ["ཉི་མ།","ཟླ་བ།","མིག་དམར།","ལྷག་པ།","ཕུར་བུ།","པ་སངས།","སྤེན་པ།"],
+				namesShort: ["༧","༡","༢","༣","༤","༥","༦"]
+			},
+			months: {
+				names: ["སྤྱི་ཟླ་དང་པོ།","སྤྱི་ཟླ་གཉིས་པ།","སྤྱི་ཟླ་གསུམ་པ།","སྤྱི་ཟླ་བཞི་པ།","སྤྱི་ཟླ་ལྔ་པ།","སྤྱི་ཟླ་དྲུག་པ།","སྤྱི་ཟླ་བདུན་པ།","སྤྱི་ཟླ་བརྒྱད་པ།","སྤྱི་ཟླ་དགུ་པ།","སྤྱི་ཟླ་བཅུ་པོ།","སྤྱི་ཟླ་བཅུ་གཅིག་པ།","སྤྱི་ཟླ་བཅུ་གཉིས་པ།",""],
+				namesAbbr: ["ཟླ་ ༡","ཟླ་ ༢","ཟླ་ ༣","ཟླ་ ༤","ཟླ་ ༥","ཟླ་ ༦","ཟླ་ ༧","ཟླ་ ༨","ཟླ་ ༩","ཟླ་ ༡༠","ཟླ་ ༡༡","ཟླ་ ༡༢",""]
+			},
+			AM: ["སྔ་དྲོ","སྔ་དྲོ","སྔ་དྲོ"],
+			PM: ["ཕྱི་དྲོ","ཕྱི་དྲོ","ཕྱི་དྲོ"],
+			eras: [{"name":"སྤྱི་ལོ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ལོའི་ཟླ' M'ཚེས' d",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm",
+				F: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm:ss",
+				M: "'ཟླ་' M'ཚེས'd",
+				Y: "yyyy.M"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br-FR.js
new file mode 100644
index 0000000..73a711c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br-FR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture br-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "br-FR", "default", {
+	name: "br-FR",
+	englishName: "Breton (France)",
+	nativeName: "brezhoneg (Frañs)",
+	language: "br",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NkN",
+		negativeInfinity: "-Anfin",
+		positiveInfinity: "+Anfin",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],
+				namesAbbr: ["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],
+				namesShort: ["Su","Lu","Mz","Mc","Ya","Gw","Sa"]
+			},
+			months: {
+				names: ["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu",""],
+				namesAbbr: ["Gen.","C'hwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"g. J.-K.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br.js
new file mode 100644
index 0000000..cac444b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.br.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture br
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "br", "default", {
+	name: "br",
+	englishName: "Breton",
+	nativeName: "brezhoneg",
+	language: "br",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NkN",
+		negativeInfinity: "-Anfin",
+		positiveInfinity: "+Anfin",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],
+				namesAbbr: ["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],
+				namesShort: ["Su","Lu","Mz","Mc","Ya","Gw","Sa"]
+			},
+			months: {
+				names: ["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu",""],
+				namesAbbr: ["Gen.","C'hwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"g. J.-K.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl-BA.js
new file mode 100644
index 0000000..dea619b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl-BA.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture bs-Cyrl-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs-Cyrl-BA", "default", {
+	name: "bs-Cyrl-BA",
+	englishName: "Bosnian (Cyrillic, Bosnia and Herzegovina)",
+	nativeName: "босански (Босна и Херцеговина)",
+	language: "bs-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl.js
new file mode 100644
index 0000000..47d2fa5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Cyrl.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture bs-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs-Cyrl", "default", {
+	name: "bs-Cyrl",
+	englishName: "Bosnian (Cyrillic)",
+	nativeName: "босански",
+	language: "bs-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn-BA.js
new file mode 100644
index 0000000..08c41d8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn-BA.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture bs-Latn-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs-Latn-BA", "default", {
+	name: "bs-Latn-BA",
+	englishName: "Bosnian (Latin, Bosnia and Herzegovina)",
+	nativeName: "bosanski (Bosna i Hercegovina)",
+	language: "bs-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn.js
new file mode 100644
index 0000000..f962bb3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs-Latn.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture bs-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs-Latn", "default", {
+	name: "bs-Latn",
+	englishName: "Bosnian (Latin)",
+	nativeName: "bosanski",
+	language: "bs-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs.js
new file mode 100644
index 0000000..3fac524
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.bs.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture bs
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "bs", "default", {
+	name: "bs",
+	englishName: "Bosnian",
+	nativeName: "bosanski",
+	language: "bs",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca-ES.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca-ES.js
new file mode 100644
index 0000000..b882330
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca-ES.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture ca-ES
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ca-ES", "default", {
+	name: "ca-ES",
+	englishName: "Catalan (Catalan)",
+	nativeName: "català (català)",
+	language: "ca",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "Infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],
+				namesAbbr: ["dg.","dl.","dt.","dc.","dj.","dv.","ds."],
+				namesShort: ["dg","dl","dt","dc","dj","dv","ds"]
+			},
+			months: {
+				names: ["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre",""],
+				namesAbbr: ["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' / 'MMMM' / 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' / 'MMMM' / 'yyyy HH:mm",
+				F: "dddd, d' / 'MMMM' / 'yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' / 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca.js
new file mode 100644
index 0000000..5b515d8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ca.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture ca
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ca", "default", {
+	name: "ca",
+	englishName: "Catalan",
+	nativeName: "català",
+	language: "ca",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "Infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],
+				namesAbbr: ["dg.","dl.","dt.","dc.","dj.","dv.","ds."],
+				namesShort: ["dg","dl","dt","dc","dj","dv","ds"]
+			},
+			months: {
+				names: ["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre",""],
+				namesAbbr: ["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' / 'MMMM' / 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' / 'MMMM' / 'yyyy HH:mm",
+				F: "dddd, d' / 'MMMM' / 'yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' / 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co-FR.js
new file mode 100644
index 0000000..203fecb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co-FR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture co-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "co-FR", "default", {
+	name: "co-FR",
+	englishName: "Corsican (France)",
+	nativeName: "Corsu (France)",
+	language: "co",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Mica numericu",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "+Infinitu",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumenica","luni","marti","mercuri","ghjovi","venderi","sabbatu"],
+				namesAbbr: ["dum.","lun.","mar.","mer.","ghj.","ven.","sab."],
+				namesShort: ["du","lu","ma","me","gh","ve","sa"]
+			},
+			months: {
+				names: ["ghjennaghju","ferraghju","marzu","aprile","maghju","ghjunghju","lugliu","aostu","settembre","ottobre","nuvembre","dicembre",""],
+				namesAbbr: ["ghje","ferr","marz","apri","magh","ghju","lugl","aost","sett","otto","nuve","dice",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"dopu J-C","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co.js
new file mode 100644
index 0000000..885b5af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.co.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture co
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "co", "default", {
+	name: "co",
+	englishName: "Corsican",
+	nativeName: "Corsu",
+	language: "co",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Mica numericu",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "+Infinitu",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumenica","luni","marti","mercuri","ghjovi","venderi","sabbatu"],
+				namesAbbr: ["dum.","lun.","mar.","mer.","ghj.","ven.","sab."],
+				namesShort: ["du","lu","ma","me","gh","ve","sa"]
+			},
+			months: {
+				names: ["ghjennaghju","ferraghju","marzu","aprile","maghju","ghjunghju","lugliu","aostu","settembre","ottobre","nuvembre","dicembre",""],
+				namesAbbr: ["ghje","ferr","marz","apri","magh","ghju","lugl","aost","sett","otto","nuve","dice",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"dopu J-C","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs-CZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs-CZ.js
new file mode 100644
index 0000000..fd1c5c3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs-CZ.js
@@ -0,0 +1,85 @@
+/*
+ * Globalize Culture cs-CZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "cs-CZ", "default", {
+	name: "cs-CZ",
+	englishName: "Czech (Czech Republic)",
+	nativeName: "čeština (Česká republika)",
+	language: "cs",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Není číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Kč"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],
+				namesAbbr: ["ne","po","út","st","čt","pá","so"],
+				namesShort: ["ne","po","út","st","čt","pá","so"]
+			},
+			months: {
+				names: ["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["dop.","dop.","DOP."],
+			PM: ["odp.","odp.","ODP."],
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs.js
new file mode 100644
index 0000000..4d6397b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cs.js
@@ -0,0 +1,85 @@
+/*
+ * Globalize Culture cs
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "cs", "default", {
+	name: "cs",
+	englishName: "Czech",
+	nativeName: "čeština",
+	language: "cs",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Není číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Kč"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],
+				namesAbbr: ["ne","po","út","st","čt","pá","so"],
+				namesShort: ["ne","po","út","st","čt","pá","so"]
+			},
+			months: {
+				names: ["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["dop.","dop.","DOP."],
+			PM: ["odp.","odp.","ODP."],
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy-GB.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy-GB.js
new file mode 100644
index 0000000..83e37b6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy-GB.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture cy-GB
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "cy-GB", "default", {
+	name: "cy-GB",
+	englishName: "Welsh (United Kingdom)",
+	nativeName: "Cymraeg (y Deyrnas Unedig)",
+	language: "cy",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],
+				namesAbbr: ["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],
+				namesShort: ["Su","Ll","Ma","Me","Ia","Gw","Sa"]
+			},
+			months: {
+				names: ["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr",""],
+				namesAbbr: ["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy.js
new file mode 100644
index 0000000..fdaba63
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.cy.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture cy
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "cy", "default", {
+	name: "cy",
+	englishName: "Welsh",
+	nativeName: "Cymraeg",
+	language: "cy",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],
+				namesAbbr: ["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],
+				namesShort: ["Su","Ll","Ma","Me","Ia","Gw","Sa"]
+			},
+			months: {
+				names: ["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr",""],
+				namesAbbr: ["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da-DK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da-DK.js
new file mode 100644
index 0000000..703722c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da-DK.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture da-DK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "da-DK", "default", {
+	name: "da-DK",
+	englishName: "Danish (Denmark)",
+	nativeName: "dansk (Danmark)",
+	language: "da",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da.js
new file mode 100644
index 0000000..259e63e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.da.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture da
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "da", "default", {
+	name: "da",
+	englishName: "Danish",
+	nativeName: "dansk",
+	language: "da",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-AT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-AT.js
new file mode 100644
index 0000000..d00ffc5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-AT.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture de-AT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-AT", "default", {
+	name: "de-AT",
+	englishName: "German (Austria)",
+	nativeName: "Deutsch (Österreich)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd. MMMM yyyy HH:mm",
+				F: "dddd, dd. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-CH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-CH.js
new file mode 100644
index 0000000..4cd202a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-CH.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture de-CH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-CH", "default", {
+	name: "de-CH",
+	englishName: "German (Switzerland)",
+	nativeName: "Deutsch (Schweiz)",
+	language: "de",
+	numberFormat: {
+		",": "'",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "Fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-DE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-DE.js
new file mode 100644
index 0000000..5466bd7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-DE.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture de-DE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-DE", "default", {
+	name: "de-DE",
+	englishName: "German (Germany)",
+	nativeName: "Deutsch (Deutschland)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LI.js
new file mode 100644
index 0000000..b821044
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LI.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture de-LI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-LI", "default", {
+	name: "de-LI",
+	englishName: "German (Liechtenstein)",
+	nativeName: "Deutsch (Liechtenstein)",
+	language: "de",
+	numberFormat: {
+		",": "'",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "CHF"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LU.js
new file mode 100644
index 0000000..76f5feb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de-LU.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture de-LU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de-LU", "default", {
+	name: "de-LU",
+	englishName: "German (Luxembourg)",
+	nativeName: "Deutsch (Luxemburg)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de.js
new file mode 100644
index 0000000..a2183ac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.de.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture de
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "de", "default", {
+	name: "de",
+	englishName: "German",
+	nativeName: "Deutsch",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb-DE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb-DE.js
new file mode 100644
index 0000000..04ad511
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb-DE.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture dsb-DE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "dsb-DE", "default", {
+	name: "dsb-DE",
+	englishName: "Lower Sorbian (Germany)",
+	nativeName: "dolnoserbšćina (Nimska)",
+	language: "dsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekońcne",
+		positiveInfinity: "+njekońcne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njeźela","ponjeźele","wałtora","srjoda","stwortk","pětk","sobota"],
+				namesAbbr: ["nje","pon","wał","srj","stw","pět","sob"],
+				namesShort: ["n","p","w","s","s","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'goź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'goź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb.js
new file mode 100644
index 0000000..f75129e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dsb.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture dsb
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "dsb", "default", {
+	name: "dsb",
+	englishName: "Lower Sorbian",
+	nativeName: "dolnoserbšćina",
+	language: "dsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekońcne",
+		positiveInfinity: "+njekońcne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njeźela","ponjeźele","wałtora","srjoda","stwortk","pětk","sobota"],
+				namesAbbr: ["nje","pon","wał","srj","stw","pět","sob"],
+				namesShort: ["n","p","w","s","s","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'goź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'goź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv-MV.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv-MV.js
new file mode 100644
index 0000000..367a759
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv-MV.js
@@ -0,0 +1,164 @@
+/*
+ * Globalize Culture dv-MV
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "dv-MV", "default", {
+	name: "dv-MV",
+	englishName: "Divehi (Maldives)",
+	nativeName: "ދިވެހިބަސް (ދިވެހި ރާއްޖެ)",
+	language: "dv",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["n $-","n $"],
+			symbol: "ރ."
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""],
+				namesAbbr: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"ހިޖްރީ","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd/MM/yyyy HH:mm",
+				F: "dd/MM/yyyy HH:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""],
+				namesAbbr: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"މީލާދީ","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yy",
+				D: "ddd, yyyy MMMM dd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "ddd, yyyy MMMM dd HH:mm",
+				F: "ddd, yyyy MMMM dd HH:mm:ss",
+				Y: "yyyy, MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv.js
new file mode 100644
index 0000000..04043e8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.dv.js
@@ -0,0 +1,164 @@
+/*
+ * Globalize Culture dv
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "dv", "default", {
+	name: "dv",
+	englishName: "Divehi",
+	nativeName: "ދިވެހިބަސް",
+	language: "dv",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["n $-","n $"],
+			symbol: "ރ."
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""],
+				namesAbbr: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd/MM/yyyy HH:mm",
+				F: "dd/MM/yyyy HH:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""],
+				namesAbbr: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"މީލާދީ","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yy",
+				D: "ddd, yyyy MMMM dd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "ddd, yyyy MMMM dd HH:mm",
+				F: "ddd, yyyy MMMM dd HH:mm:ss",
+				Y: "yyyy, MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el-GR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el-GR.js
new file mode 100644
index 0000000..a598e0d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el-GR.js
@@ -0,0 +1,82 @@
+/*
+ * Globalize Culture el-GR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "el-GR", "default", {
+	name: "el-GR",
+	englishName: "Greek (Greece)",
+	nativeName: "Ελληνικά (Ελλάδα)",
+	language: "el",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "μη αριθμός",
+		negativeInfinity: "-Άπειρο",
+		positiveInfinity: "Άπειρο",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],
+				namesAbbr: ["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],
+				namesShort: ["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"]
+			},
+			months: {
+				names: ["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			monthsGenitive: {
+				names: ["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			AM: ["πμ","πμ","ΠΜ"],
+			PM: ["μμ","μμ","ΜΜ"],
+			eras: [{"name":"μ.Χ.","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el.js
new file mode 100644
index 0000000..7ab0a51
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.el.js
@@ -0,0 +1,82 @@
+/*
+ * Globalize Culture el
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "el", "default", {
+	name: "el",
+	englishName: "Greek",
+	nativeName: "Ελληνικά",
+	language: "el",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "μη αριθμός",
+		negativeInfinity: "-Άπειρο",
+		positiveInfinity: "Άπειρο",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],
+				namesAbbr: ["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],
+				namesShort: ["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"]
+			},
+			months: {
+				names: ["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			monthsGenitive: {
+				names: ["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			AM: ["πμ","πμ","ΠΜ"],
+			PM: ["μμ","μμ","ΜΜ"],
+			eras: [{"name":"μ.Χ.","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-029.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-029.js
new file mode 100644
index 0000000..28a1705
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-029.js
@@ -0,0 +1,47 @@
+/*
+ * Globalize Culture en-029
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-029", "default", {
+	name: "en-029",
+	englishName: "English (Caribbean)",
+	nativeName: "English (Caribbean)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "MM/dd/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-AU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-AU.js
new file mode 100644
index 0000000..8c62088
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-AU.js
@@ -0,0 +1,52 @@
+/*
+ * Globalize Culture en-AU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-AU", "default", {
+	name: "en-AU",
+	englishName: "English (Australia)",
+	nativeName: "English (Australia)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-BZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-BZ.js
new file mode 100644
index 0000000..1dd1ba6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-BZ.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture en-BZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-BZ", "default", {
+	name: "en-BZ",
+	englishName: "English (Belize)",
+	nativeName: "English (Belize)",
+	numberFormat: {
+		currency: {
+			groupSizes: [3,0],
+			symbol: "BZ$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd MMMM yyyy hh:mm tt",
+				F: "dddd, dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-CA.js
new file mode 100644
index 0000000..7e0bab3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-CA.js
@@ -0,0 +1,49 @@
+/*
+ * Globalize Culture en-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-CA", "default", {
+	name: "en-CA",
+	englishName: "English (Canada)",
+	nativeName: "English (Canada)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "MMMM-dd-yy",
+				f: "MMMM-dd-yy h:mm tt",
+				F: "MMMM-dd-yy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-GB.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-GB.js
new file mode 100644
index 0000000..5167db7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-GB.js
@@ -0,0 +1,55 @@
+/*
+ * Globalize Culture en-GB
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-GB", "default", {
+	name: "en-GB",
+	englishName: "English (United Kingdom)",
+	nativeName: "English (United Kingdom)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IE.js
new file mode 100644
index 0000000..52772b1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IE.js
@@ -0,0 +1,57 @@
+/*
+ * Globalize Culture en-IE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-IE", "default", {
+	name: "en-IE",
+	englishName: "English (Ireland)",
+	nativeName: "English (Ireland)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IN.js
new file mode 100644
index 0000000..8dd0d36
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-IN.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture en-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-IN", "default", {
+	name: "en-IN",
+	englishName: "English (India)",
+	nativeName: "English (India)",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "Rs."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-JM.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-JM.js
new file mode 100644
index 0000000..f1442b7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-JM.js
@@ -0,0 +1,51 @@
+/*
+ * Globalize Culture en-JM
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-JM", "default", {
+	name: "en-JM",
+	englishName: "English (Jamaica)",
+	nativeName: "English (Jamaica)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "J$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-MY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-MY.js
new file mode 100644
index 0000000..5d6b8cc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-MY.js
@@ -0,0 +1,56 @@
+/*
+ * Globalize Culture en-MY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-MY", "default", {
+	name: "en-MY",
+	englishName: "English (Malaysia)",
+	nativeName: "English (Malaysia)",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM, yyyy",
+				f: "dddd, d MMMM, yyyy h:mm tt",
+				F: "dddd, d MMMM, yyyy h:mm:ss tt",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-NZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-NZ.js
new file mode 100644
index 0000000..08c28e9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-NZ.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture en-NZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-NZ", "default", {
+	name: "en-NZ",
+	englishName: "English (New Zealand)",
+	nativeName: "English (New Zealand)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-PH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-PH.js
new file mode 100644
index 0000000..8be79eb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-PH.js
@@ -0,0 +1,39 @@
+/*
+ * Globalize Culture en-PH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-PH", "default", {
+	name: "en-PH",
+	englishName: "English (Republic of the Philippines)",
+	nativeName: "English (Philippines)",
+	numberFormat: {
+		currency: {
+			symbol: "Php"
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-SG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-SG.js
new file mode 100644
index 0000000..a4aaf12
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-SG.js
@@ -0,0 +1,53 @@
+/*
+ * Globalize Culture en-SG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-SG", "default", {
+	name: "en-SG",
+	englishName: "English (Singapore)",
+	nativeName: "English (Singapore)",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM, yyyy",
+				f: "dddd, d MMMM, yyyy h:mm tt",
+				F: "dddd, d MMMM, yyyy h:mm:ss tt",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-TT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-TT.js
new file mode 100644
index 0000000..1ac4aa5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-TT.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture en-TT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-TT", "default", {
+	name: "en-TT",
+	englishName: "English (Trinidad and Tobago)",
+	nativeName: "English (Trinidad y Tobago)",
+	numberFormat: {
+		currency: {
+			groupSizes: [3,0],
+			symbol: "TT$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd MMMM yyyy hh:mm tt",
+				F: "dddd, dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-US.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-US.js
new file mode 100644
index 0000000..0958d1d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-US.js
@@ -0,0 +1,33 @@
+/*
+ * Globalize Culture en-US
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-US", "default", {
+	name: "en-US",
+	englishName: "English (United States)"
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZA.js
new file mode 100644
index 0000000..64f2a0c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZA.js
@@ -0,0 +1,61 @@
+/*
+ * Globalize Culture en-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-ZA", "default", {
+	name: "en-ZA",
+	englishName: "English (South Africa)",
+	nativeName: "English (South Africa)",
+	numberFormat: {
+		",": " ",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " "
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZW.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZW.js
new file mode 100644
index 0000000..8323c62
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.en-ZW.js
@@ -0,0 +1,39 @@
+/*
+ * Globalize Culture en-ZW
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "en-ZW", "default", {
+	name: "en-ZW",
+	englishName: "English (Zimbabwe)",
+	nativeName: "English (Zimbabwe)",
+	numberFormat: {
+		currency: {
+			symbol: "Z$"
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-AR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-AR.js
new file mode 100644
index 0000000..853296f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-AR.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture es-AR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-AR", "default", {
+	name: "es-AR",
+	englishName: "Spanish (Argentina)",
+	nativeName: "Español (Argentina)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-BO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-BO.js
new file mode 100644
index 0000000..f784f68
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-BO.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture es-BO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-BO", "default", {
+	name: "es-BO",
+	englishName: "Spanish (Bolivia)",
+	nativeName: "Español (Bolivia)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CL.js
new file mode 100644
index 0000000..769ad2c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CL.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture es-CL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-CL", "default", {
+	name: "es-CL",
+	englishName: "Spanish (Chile)",
+	nativeName: "Español (Chile)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CO.js
new file mode 100644
index 0000000..fb75fc9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CO.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture es-CO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-CO", "default", {
+	name: "es-CO",
+	englishName: "Spanish (Colombia)",
+	nativeName: "Español (Colombia)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CR.js
new file mode 100644
index 0000000..13b90cf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-CR.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture es-CR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-CR", "default", {
+	name: "es-CR",
+	englishName: "Spanish (Costa Rica)",
+	nativeName: "Español (Costa Rica)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			",": ".",
+			".": ",",
+			symbol: "₡"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-DO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-DO.js
new file mode 100644
index 0000000..33a4f99
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-DO.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture es-DO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-DO", "default", {
+	name: "es-DO",
+	englishName: "Spanish (Dominican Republic)",
+	nativeName: "Español (República Dominicana)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "RD$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-EC.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-EC.js
new file mode 100644
index 0000000..c2779ea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-EC.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture es-EC
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-EC", "default", {
+	name: "es-EC",
+	englishName: "Spanish (Ecuador)",
+	nativeName: "Español (Ecuador)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-ES.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-ES.js
new file mode 100644
index 0000000..8a5b3df
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-ES.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture es-ES
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-ES", "default", {
+	name: "es-ES",
+	englishName: "Spanish (Spain, International Sort)",
+	nativeName: "Español (España, alfabetización internacional)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-GT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-GT.js
new file mode 100644
index 0000000..1e55ce6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-GT.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture es-GT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-GT", "default", {
+	name: "es-GT",
+	englishName: "Spanish (Guatemala)",
+	nativeName: "Español (Guatemala)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-HN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-HN.js
new file mode 100644
index 0000000..d392d64
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-HN.js
@@ -0,0 +1,71 @@
+/*
+ * Globalize Culture es-HN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-HN", "default", {
+	name: "es-HN",
+	englishName: "Spanish (Honduras)",
+	nativeName: "Español (Honduras)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			symbol: "L."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-MX.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-MX.js
new file mode 100644
index 0000000..7cbf393
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-MX.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture es-MX
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-MX", "default", {
+	name: "es-MX",
+	englishName: "Spanish (Mexico)",
+	nativeName: "Español (México)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-NI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-NI.js
new file mode 100644
index 0000000..1b4a4c1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-NI.js
@@ -0,0 +1,71 @@
+/*
+ * Globalize Culture es-NI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-NI", "default", {
+	name: "es-NI",
+	englishName: "Spanish (Nicaragua)",
+	nativeName: "Español (Nicaragua)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			groupSizes: [3,0],
+			symbol: "C$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PA.js
new file mode 100644
index 0000000..6369ea7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PA.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture es-PA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-PA", "default", {
+	name: "es-PA",
+	englishName: "Spanish (Panama)",
+	nativeName: "Español (Panamá)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "B/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PE.js
new file mode 100644
index 0000000..b0261ac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PE.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture es-PE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-PE", "default", {
+	name: "es-PE",
+	englishName: "Spanish (Peru)",
+	nativeName: "Español (Perú)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["$ -n","$ n"],
+			symbol: "S/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PR.js
new file mode 100644
index 0000000..63774f9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PR.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture es-PR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-PR", "default", {
+	name: "es-PR",
+	englishName: "Spanish (Puerto Rico)",
+	nativeName: "Español (Puerto Rico)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PY.js
new file mode 100644
index 0000000..6a1eed0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-PY.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture es-PY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-PY", "default", {
+	name: "es-PY",
+	englishName: "Spanish (Paraguay)",
+	nativeName: "Español (Paraguay)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "Gs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-SV.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-SV.js
new file mode 100644
index 0000000..4b4d088
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-SV.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture es-SV
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-SV", "default", {
+	name: "es-SV",
+	englishName: "Spanish (El Salvador)",
+	nativeName: "Español (El Salvador)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-US.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-US.js
new file mode 100644
index 0000000..2e4a89a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-US.js
@@ -0,0 +1,62 @@
+/*
+ * Globalize Culture es-US
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-US", "default", {
+	name: "es-US",
+	englishName: "Spanish (United States)",
+	nativeName: "Español (Estados Unidos)",
+	language: "es",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sa"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-UY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-UY.js
new file mode 100644
index 0000000..50d6a2b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-UY.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture es-UY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-UY", "default", {
+	name: "es-UY",
+	englishName: "Spanish (Uruguay)",
+	nativeName: "Español (Uruguay)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$U"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-VE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-VE.js
new file mode 100644
index 0000000..445181d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es-VE.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture es-VE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es-VE", "default", {
+	name: "es-VE",
+	englishName: "Spanish (Bolivarian Republic of Venezuela)",
+	nativeName: "Español (Republica Bolivariana de Venezuela)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "Bs. F."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es.js
new file mode 100644
index 0000000..6441bcd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.es.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture es
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "es", "default", {
+	name: "es",
+	englishName: "Spanish",
+	nativeName: "español",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et-EE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et-EE.js
new file mode 100644
index 0000000..6164b31
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et-EE.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture et-EE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "et-EE", "default", {
+	name: "et-EE",
+	englishName: "Estonian (Estonia)",
+	nativeName: "eesti (Eesti)",
+	language: "et",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "avaldamatu",
+		negativeInfinity: "miinuslõpmatus",
+		positiveInfinity: "plusslõpmatus",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],
+				namesAbbr: ["P","E","T","K","N","R","L"],
+				namesShort: ["P","E","T","K","N","R","L"]
+			},
+			months: {
+				names: ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember",""],
+				namesAbbr: ["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets",""]
+			},
+			AM: ["EL","el","EL"],
+			PM: ["PL","pl","PL"],
+			patterns: {
+				d: "d.MM.yyyy",
+				D: "d. MMMM yyyy'. a.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy'. a.' H:mm",
+				F: "d. MMMM yyyy'. a.' H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy'. a.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et.js
new file mode 100644
index 0000000..bf3384f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.et.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture et
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "et", "default", {
+	name: "et",
+	englishName: "Estonian",
+	nativeName: "eesti",
+	language: "et",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "avaldamatu",
+		negativeInfinity: "miinuslõpmatus",
+		positiveInfinity: "plusslõpmatus",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],
+				namesAbbr: ["P","E","T","K","N","R","L"],
+				namesShort: ["P","E","T","K","N","R","L"]
+			},
+			months: {
+				names: ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember",""],
+				namesAbbr: ["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets",""]
+			},
+			AM: ["EL","el","EL"],
+			PM: ["PL","pl","PL"],
+			patterns: {
+				d: "d.MM.yyyy",
+				D: "d. MMMM yyyy'. a.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy'. a.' H:mm",
+				F: "d. MMMM yyyy'. a.' H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy'. a.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu-ES.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu-ES.js
new file mode 100644
index 0000000..2a98ef6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu-ES.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture eu-ES
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "eu-ES", "default", {
+	name: "eu-ES",
+	englishName: "Basque (Basque)",
+	nativeName: "euskara (euskara)",
+	language: "eu",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "EdZ",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "Infinitu",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],
+				namesAbbr: ["ig.","al.","as.","az.","og.","or.","lr."],
+				namesShort: ["ig","al","as","az","og","or","lr"]
+			},
+			months: {
+				names: ["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua",""],
+				namesAbbr: ["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dddd, yyyy.'eko' MMMM'k 'd",
+				t: "HH:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy.'eko' MMMM'k 'd HH:mm",
+				F: "dddd, yyyy.'eko' MMMM'k 'd H:mm:ss",
+				Y: "yyyy.'eko' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu.js
new file mode 100644
index 0000000..ab2f3d9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.eu.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture eu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "eu", "default", {
+	name: "eu",
+	englishName: "Basque",
+	nativeName: "euskara",
+	language: "eu",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "EdZ",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "Infinitu",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],
+				namesAbbr: ["ig.","al.","as.","az.","og.","or.","lr."],
+				namesShort: ["ig","al","as","az","og","or","lr"]
+			},
+			months: {
+				names: ["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua",""],
+				namesAbbr: ["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dddd, yyyy.'eko' MMMM'k 'd",
+				t: "HH:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy.'eko' MMMM'k 'd HH:mm",
+				F: "dddd, yyyy.'eko' MMMM'k 'd H:mm:ss",
+				Y: "yyyy.'eko' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa-IR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa-IR.js
new file mode 100644
index 0000000..3386f5f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa-IR.js
@@ -0,0 +1,213 @@
+/*
+ * Globalize Culture fa-IR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fa-IR", "default", {
+	name: "fa-IR",
+	englishName: "Persian",
+	nativeName: "فارسى (ایران)",
+	language: "fa",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		currency: {
+			pattern: ["$n-","$ n"],
+			".": "/",
+			symbol: "ريال"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""],
+				namesAbbr: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy/MM/dd",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "yyyy/MM/dd hh:mm tt",
+				F: "yyyy/MM/dd hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa.js
new file mode 100644
index 0000000..580eac1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fa.js
@@ -0,0 +1,213 @@
+/*
+ * Globalize Culture fa
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fa", "default", {
+	name: "fa",
+	englishName: "Persian",
+	nativeName: "فارسى",
+	language: "fa",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		currency: {
+			pattern: ["$n-","$ n"],
+			".": "/",
+			symbol: "ريال"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""],
+				namesAbbr: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy/MM/dd",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "yyyy/MM/dd hh:mm tt",
+				F: "yyyy/MM/dd hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi-FI.js
new file mode 100644
index 0000000..09f0dad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi-FI.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture fi-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fi-FI", "default", {
+	name: "fi-FI",
+	englishName: "Finnish (Finland)",
+	nativeName: "suomi (Suomi)",
+	language: "fi",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],
+				namesAbbr: ["su","ma","ti","ke","to","pe","la"],
+				namesShort: ["su","ma","ti","ke","to","pe","la"]
+			},
+			months: {
+				names: ["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu",""],
+				namesAbbr: ["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM'ta 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM'ta 'yyyy H:mm",
+				F: "d. MMMM'ta 'yyyy H:mm:ss",
+				M: "d. MMMM'ta'",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi.js
new file mode 100644
index 0000000..e8fa06c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fi.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture fi
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fi", "default", {
+	name: "fi",
+	englishName: "Finnish",
+	nativeName: "suomi",
+	language: "fi",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],
+				namesAbbr: ["su","ma","ti","ke","to","pe","la"],
+				namesShort: ["su","ma","ti","ke","to","pe","la"]
+			},
+			months: {
+				names: ["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu",""],
+				namesAbbr: ["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM'ta 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM'ta 'yyyy H:mm",
+				F: "d. MMMM'ta 'yyyy H:mm:ss",
+				M: "d. MMMM'ta'",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil-PH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil-PH.js
new file mode 100644
index 0000000..3e6c8fa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil-PH.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture fil-PH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fil-PH", "default", {
+	name: "fil-PH",
+	englishName: "Filipino (Philippines)",
+	nativeName: "Filipino (Pilipinas)",
+	language: "fil",
+	numberFormat: {
+		currency: {
+			symbol: "PhP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Linggo","Lunes","Martes","Mierkoles","Huebes","Biernes","Sabado"],
+				namesAbbr: ["Lin","Lun","Mar","Mier","Hueb","Bier","Saba"],
+				namesShort: ["L","L","M","M","H","B","S"]
+			},
+			months: {
+				names: ["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septyembre","Oktubre","Nobyembre","Disyembre",""],
+				namesAbbr: ["En","Peb","Mar","Abr","Mayo","Hun","Hul","Agos","Sept","Okt","Nob","Dis",""]
+			},
+			eras: [{"name":"Anno Domini","start":null,"offset":0}]
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil.js
new file mode 100644
index 0000000..6e4509f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fil.js
@@ -0,0 +1,54 @@
+/*
+ * Globalize Culture fil
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fil", "default", {
+	name: "fil",
+	englishName: "Filipino",
+	nativeName: "Filipino",
+	language: "fil",
+	numberFormat: {
+		currency: {
+			symbol: "PhP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Linggo","Lunes","Martes","Mierkoles","Huebes","Biernes","Sabado"],
+				namesAbbr: ["Lin","Lun","Mar","Mier","Hueb","Bier","Saba"],
+				namesShort: ["L","L","M","M","H","B","S"]
+			},
+			months: {
+				names: ["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septyembre","Oktubre","Nobyembre","Disyembre",""],
+				namesAbbr: ["En","Peb","Mar","Abr","Mayo","Hun","Hul","Agos","Sept","Okt","Nob","Dis",""]
+			},
+			eras: [{"name":"Anno Domini","start":null,"offset":0}]
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo-FO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo-FO.js
new file mode 100644
index 0000000..68783ce
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo-FO.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fo-FO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fo-FO", "default", {
+	name: "fo-FO",
+	englishName: "Faroese (Faroe Islands)",
+	nativeName: "føroyskt (Føroyar)",
+	language: "fo",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],
+				namesAbbr: ["sun","mán","týs","mik","hós","frí","leyg"],
+				namesShort: ["su","má","tý","mi","hó","fr","ley"]
+			},
+			months: {
+				names: ["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo.js
new file mode 100644
index 0000000..7b98c7d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fo.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fo", "default", {
+	name: "fo",
+	englishName: "Faroese",
+	nativeName: "føroyskt",
+	language: "fo",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],
+				namesAbbr: ["sun","mán","týs","mik","hós","frí","leyg"],
+				namesShort: ["su","má","tý","mi","hó","fr","ley"]
+			},
+			months: {
+				names: ["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-BE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-BE.js
new file mode 100644
index 0000000..e5d5b9b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-BE.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr-BE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-BE", "default", {
+	name: "fr-BE",
+	englishName: "French (Belgium)",
+	nativeName: "français (Belgique)",
+	language: "fr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CA.js
new file mode 100644
index 0000000..d91d60e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CA.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture fr-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-CA", "default", {
+	name: "fr-CA",
+	englishName: "French (Canada)",
+	nativeName: "français (Canada)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["(n $)","n $"],
+			",": " ",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CH.js
new file mode 100644
index 0000000..89d416b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-CH.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture fr-CH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-CH", "default", {
+	name: "fr-CH",
+	englishName: "French (Switzerland)",
+	nativeName: "français (Suisse)",
+	language: "fr",
+	numberFormat: {
+		",": "'",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-FR.js
new file mode 100644
index 0000000..ddd833a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-FR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-FR", "default", {
+	name: "fr-FR",
+	englishName: "French (France)",
+	nativeName: "français (France)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-LU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-LU.js
new file mode 100644
index 0000000..1a3408f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-LU.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr-LU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-LU", "default", {
+	name: "fr-LU",
+	englishName: "French (Luxembourg)",
+	nativeName: "français (Luxembourg)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-MC.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-MC.js
new file mode 100644
index 0000000..a487097
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr-MC.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr-MC
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr-MC", "default", {
+	name: "fr-MC",
+	englishName: "French (Monaco)",
+	nativeName: "français (Principauté de Monaco)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr.js
new file mode 100644
index 0000000..a6ce16e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fr.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture fr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fr", "default", {
+	name: "fr",
+	englishName: "French",
+	nativeName: "français",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy-NL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy-NL.js
new file mode 100644
index 0000000..bf16672
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy-NL.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture fy-NL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fy-NL", "default", {
+	name: "fy-NL",
+	englishName: "Frisian (Netherlands)",
+	nativeName: "Frysk (Nederlân)",
+	language: "fy",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],
+				namesAbbr: ["Sn","Mo","Ti","Wo","To","Fr","Sn"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["jannewaris","febrewaris","maart","april","maaie","juny","july","augustus","septimber","oktober","novimber","desimber",""],
+				namesAbbr: ["jann","febr","mrt","apr","maaie","jun","jul","aug","sept","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy.js
new file mode 100644
index 0000000..7d617a0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.fy.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture fy
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "fy", "default", {
+	name: "fy",
+	englishName: "Frisian",
+	nativeName: "Frysk",
+	language: "fy",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],
+				namesAbbr: ["Sn","Mo","Ti","Wo","To","Fr","Sn"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["jannewaris","febrewaris","maart","april","maaie","juny","july","augustus","septimber","oktober","novimber","desimber",""],
+				namesAbbr: ["jann","febr","mrt","apr","maaie","jun","jul","aug","sept","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga-IE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga-IE.js
new file mode 100644
index 0000000..dabd2ca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga-IE.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture ga-IE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ga-IE", "default", {
+	name: "ga-IE",
+	englishName: "Irish (Ireland)",
+	nativeName: "Gaeilge (Éire)",
+	language: "ga",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],
+				namesAbbr: ["Domh","Luan","Máir","Céad","Déar","Aoi","Sath"],
+				namesShort: ["Do","Lu","Má","Cé","De","Ao","Sa"]
+			},
+			months: {
+				names: ["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig",""],
+				namesAbbr: ["Ean","Feabh","Már","Aib","Bealt","Meith","Iúil","Lún","M.Fómh","D.Fómh","Samh","Noll",""]
+			},
+			AM: ["r.n.","r.n.","R.N."],
+			PM: ["i.n.","i.n.","I.N."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga.js
new file mode 100644
index 0000000..b7df294
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ga.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture ga
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ga", "default", {
+	name: "ga",
+	englishName: "Irish",
+	nativeName: "Gaeilge",
+	language: "ga",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],
+				namesAbbr: ["Domh","Luan","Máir","Céad","Déar","Aoi","Sath"],
+				namesShort: ["Do","Lu","Má","Cé","De","Ao","Sa"]
+			},
+			months: {
+				names: ["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig",""],
+				namesAbbr: ["Ean","Feabh","Már","Aib","Bealt","Meith","Iúil","Lún","M.Fómh","D.Fómh","Samh","Noll",""]
+			},
+			AM: ["r.n.","r.n.","R.N."],
+			PM: ["i.n.","i.n.","I.N."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd-GB.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd-GB.js
new file mode 100644
index 0000000..3716169
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd-GB.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture gd-GB
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gd-GB", "default", {
+	name: "gd-GB",
+	englishName: "Scottish Gaelic (United Kingdom)",
+	nativeName: "Gàidhlig (An Rìoghachd Aonaichte)",
+	language: "gd",
+	numberFormat: {
+		negativeInfinity: "-Neo-chrìochnachd",
+		positiveInfinity: "Neo-chrìochnachd",
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],
+				namesAbbr: ["Dòm","Lua","Mài","Cia","Ard","Hao","Sat"],
+				namesShort: ["D","L","M","C","A","H","S"]
+			},
+			months: {
+				names: ["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd",""],
+				namesAbbr: ["Fao","Gea","Màr","Gib","Cèi","Ògm","Iuc","Lùn","Sul","Dàm","Sam","Dùb",""]
+			},
+			AM: ["m","m","M"],
+			PM: ["f","f","F"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd.js
new file mode 100644
index 0000000..7c0c35b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gd.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture gd
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gd", "default", {
+	name: "gd",
+	englishName: "Scottish Gaelic",
+	nativeName: "Gàidhlig",
+	language: "gd",
+	numberFormat: {
+		negativeInfinity: "-Neo-chrìochnachd",
+		positiveInfinity: "Neo-chrìochnachd",
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],
+				namesAbbr: ["Dòm","Lua","Mài","Cia","Ard","Hao","Sat"],
+				namesShort: ["D","L","M","C","A","H","S"]
+			},
+			months: {
+				names: ["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd",""],
+				namesAbbr: ["Fao","Gea","Màr","Gib","Cèi","Ògm","Iuc","Lùn","Sul","Dàm","Sam","Dùb",""]
+			},
+			AM: ["m","m","M"],
+			PM: ["f","f","F"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl-ES.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl-ES.js
new file mode 100644
index 0000000..2f30b61
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl-ES.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture gl-ES
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gl-ES", "default", {
+	name: "gl-ES",
+	englishName: "Galician (Galician)",
+	nativeName: "galego (galego)",
+	language: "gl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","luns","martes","mércores","xoves","venres","sábado"],
+				namesAbbr: ["dom","luns","mar","mér","xov","ven","sáb"],
+				namesShort: ["do","lu","ma","mé","xo","ve","sá"]
+			},
+			months: {
+				names: ["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro",""],
+				namesAbbr: ["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl.js
new file mode 100644
index 0000000..a1fd8f1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gl.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture gl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gl", "default", {
+	name: "gl",
+	englishName: "Galician",
+	nativeName: "galego",
+	language: "gl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","luns","martes","mércores","xoves","venres","sábado"],
+				namesAbbr: ["dom","luns","mar","mér","xov","ven","sáb"],
+				namesShort: ["do","lu","ma","mé","xo","ve","sá"]
+			},
+			months: {
+				names: ["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro",""],
+				namesAbbr: ["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw-FR.js
new file mode 100644
index 0000000..a6528d3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw-FR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture gsw-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gsw-FR", "default", {
+	name: "gsw-FR",
+	englishName: "Alsatian (France)",
+	nativeName: "Elsässisch (Frànkrisch)",
+	language: "gsw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Ohne Nummer",
+		negativeInfinity: "-Unendlich",
+		positiveInfinity: "+Unendlich",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sundàà","Mondàà","Dienschdàà","Mittwuch","Dunnerschdàà","Fridàà","Sàmschdàà"],
+				namesAbbr: ["Su.","Mo.","Di.","Mi.","Du.","Fr.","Sà."],
+				namesShort: ["Su","Mo","Di","Mi","Du","Fr","Sà"]
+			},
+			months: {
+				names: ["Jänner","Feverje","März","Àpril","Mai","Jüni","Jüli","Augscht","September","Oktower","Nowember","Dezember",""],
+				namesAbbr: ["Jän.","Fev.","März","Apr.","Mai","Jüni","Jüli","Aug.","Sept.","Okt.","Now.","Dez.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"Vor J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw.js
new file mode 100644
index 0000000..8eca7be
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gsw.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture gsw
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gsw", "default", {
+	name: "gsw",
+	englishName: "Alsatian",
+	nativeName: "Elsässisch",
+	language: "gsw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Ohne Nummer",
+		negativeInfinity: "-Unendlich",
+		positiveInfinity: "+Unendlich",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sundàà","Mondàà","Dienschdàà","Mittwuch","Dunnerschdàà","Fridàà","Sàmschdàà"],
+				namesAbbr: ["Su.","Mo.","Di.","Mi.","Du.","Fr.","Sà."],
+				namesShort: ["Su","Mo","Di","Mi","Du","Fr","Sà"]
+			},
+			months: {
+				names: ["Jänner","Feverje","März","Àpril","Mai","Jüni","Jüli","Augscht","September","Oktower","Nowember","Dezember",""],
+				namesAbbr: ["Jän.","Fev.","März","Apr.","Mai","Jüni","Jüli","Aug.","Sept.","Okt.","Now.","Dez.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"Vor J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu-IN.js
new file mode 100644
index 0000000..b6c4009
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture gu-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gu-IN", "default", {
+	name: "gu-IN",
+	englishName: "Gujarati (India)",
+	nativeName: "ગુજરાતી (ભારત)",
+	language: "gu",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "રૂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],
+				namesAbbr: ["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],
+				namesShort: ["ર","સ","મ","બ","ગ","શ","શ"]
+			},
+			months: {
+				names: ["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર",""],
+				namesAbbr: ["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે",""]
+			},
+			AM: ["પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન"],
+			PM: ["ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu.js
new file mode 100644
index 0000000..cab1c0e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.gu.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture gu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "gu", "default", {
+	name: "gu",
+	englishName: "Gujarati",
+	nativeName: "ગુજરાતી",
+	language: "gu",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "રૂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],
+				namesAbbr: ["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],
+				namesShort: ["ર","સ","મ","બ","ગ","શ","શ"]
+			},
+			months: {
+				names: ["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર",""],
+				namesAbbr: ["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે",""]
+			},
+			AM: ["પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન"],
+			PM: ["ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn-NG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn-NG.js
new file mode 100644
index 0000000..5ac8bd8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn-NG.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ha-Latn-NG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ha-Latn-NG", "default", {
+	name: "ha-Latn-NG",
+	englishName: "Hausa (Latin, Nigeria)",
+	nativeName: "Hausa (Nigeria)",
+	language: "ha-Latn",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn.js
new file mode 100644
index 0000000..049ca5a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha-Latn.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ha-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ha-Latn", "default", {
+	name: "ha-Latn",
+	englishName: "Hausa (Latin)",
+	nativeName: "Hausa",
+	language: "ha-Latn",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha.js
new file mode 100644
index 0000000..07f4be8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ha.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ha
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ha", "default", {
+	name: "ha",
+	englishName: "Hausa",
+	nativeName: "Hausa",
+	language: "ha",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he-IL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he-IL.js
new file mode 100644
index 0000000..b0bd6b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he-IL.js
@@ -0,0 +1,97 @@
+/*
+ * Globalize Culture he-IL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "he-IL", "default", {
+	name: "he-IL",
+	englishName: "Hebrew (Israel)",
+	nativeName: "עברית (ישראל)",
+	language: "he",
+	isRTL: true,
+	numberFormat: {
+		NaN: "לא מספר",
+		negativeInfinity: "אינסוף שלילי",
+		positiveInfinity: "אינסוף חיובי",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "₪"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר",""],
+				namesAbbr: ["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ",""]
+			},
+			eras: [{"name":"לספירה","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Hebrew: {
+			name: "Hebrew",
+			"/": " ",
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["א","ב","ג","ד","ה","ו","ש"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"],
+				namesAbbr: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"]
+			},
+			eras: [{"name":"C.E.","start":null,"offset":0}],
+			twoDigitYearMax: 5790,
+			patterns: {
+				d: "dd MMMM yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he.js
new file mode 100644
index 0000000..bca17f3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.he.js
@@ -0,0 +1,97 @@
+/*
+ * Globalize Culture he
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "he", "default", {
+	name: "he",
+	englishName: "Hebrew",
+	nativeName: "עברית",
+	language: "he",
+	isRTL: true,
+	numberFormat: {
+		NaN: "לא מספר",
+		negativeInfinity: "אינסוף שלילי",
+		positiveInfinity: "אינסוף חיובי",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "₪"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר",""],
+				namesAbbr: ["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ",""]
+			},
+			eras: [{"name":"לספירה","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Hebrew: {
+			name: "Hebrew",
+			"/": " ",
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["א","ב","ג","ד","ה","ו","ש"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"],
+				namesAbbr: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"]
+			},
+			eras: [{"name":"C.E.","start":null,"offset":0}],
+			twoDigitYearMax: 5790,
+			patterns: {
+				d: "dd MMMM yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi-IN.js
new file mode 100644
index 0000000..7e228b2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture hi-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hi-IN", "default", {
+	name: "hi-IN",
+	englishName: "Hindi (India)",
+	nativeName: "हिंदी (भारत)",
+	language: "hi",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi.js
new file mode 100644
index 0000000..15dc5d4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hi.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture hi
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hi", "default", {
+	name: "hi",
+	englishName: "Hindi",
+	nativeName: "हिंदी",
+	language: "hi",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-BA.js
new file mode 100644
index 0000000..63ff67e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-BA.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture hr-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hr-BA", "default", {
+	name: "hr-BA",
+	englishName: "Croatian (Latin, Bosnia and Herzegovina)",
+	nativeName: "hrvatski (Bosna i Hercegovina)",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-HR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-HR.js
new file mode 100644
index 0000000..f63a459
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr-HR.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture hr-HR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hr-HR", "default", {
+	name: "hr-HR",
+	englishName: "Croatian (Croatia)",
+	nativeName: "hrvatski (Hrvatska)",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kn"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr.js
new file mode 100644
index 0000000..747e76c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hr.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture hr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hr", "default", {
+	name: "hr",
+	englishName: "Croatian",
+	nativeName: "hrvatski",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kn"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb-DE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb-DE.js
new file mode 100644
index 0000000..8588f95
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb-DE.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture hsb-DE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hsb-DE", "default", {
+	name: "hsb-DE",
+	englishName: "Upper Sorbian (Germany)",
+	nativeName: "hornjoserbšćina (Němska)",
+	language: "hsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekónčne",
+		positiveInfinity: "+njekónčne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],
+				namesAbbr: ["nje","pón","wut","srj","štw","pja","sob"],
+				namesShort: ["n","p","w","s","š","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'hodź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'hodź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb.js
new file mode 100644
index 0000000..a6ce654
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hsb.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture hsb
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hsb", "default", {
+	name: "hsb",
+	englishName: "Upper Sorbian",
+	nativeName: "hornjoserbšćina",
+	language: "hsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekónčne",
+		positiveInfinity: "+njekónčne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],
+				namesAbbr: ["nje","pón","wut","srj","štw","pja","sob"],
+				namesShort: ["n","p","w","s","š","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'hodź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'hodź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu-HU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu-HU.js
new file mode 100644
index 0000000..e48037a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu-HU.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture hu-HU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hu-HU", "default", {
+	name: "hu-HU",
+	englishName: "Hungarian (Hungary)",
+	nativeName: "magyar (Magyarország)",
+	language: "hu",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nem szám",
+		negativeInfinity: "negatív végtelen",
+		positiveInfinity: "végtelen",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Ft"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],
+				namesAbbr: ["V","H","K","Sze","Cs","P","Szo"],
+				namesShort: ["V","H","K","Sze","Cs","P","Szo"]
+			},
+			months: {
+				names: ["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december",""],
+				namesAbbr: ["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec.",""]
+			},
+			AM: ["de.","de.","DE."],
+			PM: ["du.","du.","DU."],
+			eras: [{"name":"i.sz.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "yyyy. MMMM d.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy. MMMM d. H:mm",
+				F: "yyyy. MMMM d. H:mm:ss",
+				M: "MMMM d.",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu.js
new file mode 100644
index 0000000..5db2111
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hu.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture hu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hu", "default", {
+	name: "hu",
+	englishName: "Hungarian",
+	nativeName: "magyar",
+	language: "hu",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nem szám",
+		negativeInfinity: "negatív végtelen",
+		positiveInfinity: "végtelen",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Ft"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],
+				namesAbbr: ["V","H","K","Sze","Cs","P","Szo"],
+				namesShort: ["V","H","K","Sze","Cs","P","Szo"]
+			},
+			months: {
+				names: ["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december",""],
+				namesAbbr: ["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec.",""]
+			},
+			AM: ["de.","de.","DE."],
+			PM: ["du.","du.","DU."],
+			eras: [{"name":"i.sz.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "yyyy. MMMM d.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy. MMMM d. H:mm",
+				F: "yyyy. MMMM d. H:mm:ss",
+				M: "MMMM d.",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy-AM.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy-AM.js
new file mode 100644
index 0000000..d4b0e3f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy-AM.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture hy-AM
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hy-AM", "default", {
+	name: "hy-AM",
+	englishName: "Armenian (Armenia)",
+	nativeName: "Հայերեն (Հայաստան)",
+	language: "hy",
+	numberFormat: {
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "դր."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],
+				namesAbbr: ["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],
+				namesShort: ["Կ","Ե","Ե","Չ","Հ","Ո","Շ"]
+			},
+			months: {
+				names: ["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր",""],
+				namesAbbr: ["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM, yyyy H:mm",
+				F: "d MMMM, yyyy H:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy.js
new file mode 100644
index 0000000..914d70f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.hy.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture hy
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "hy", "default", {
+	name: "hy",
+	englishName: "Armenian",
+	nativeName: "Հայերեն",
+	language: "hy",
+	numberFormat: {
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "դր."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],
+				namesAbbr: ["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],
+				namesShort: ["Կ","Ե","Ե","Չ","Հ","Ո","Շ"]
+			},
+			months: {
+				names: ["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր",""],
+				namesAbbr: ["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM, yyyy H:mm",
+				F: "d MMMM, yyyy H:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id-ID.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id-ID.js
new file mode 100644
index 0000000..7f7c890
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id-ID.js
@@ -0,0 +1,75 @@
+/*
+ * Globalize Culture id-ID
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "id-ID", "default", {
+	name: "id-ID",
+	englishName: "Indonesian (Indonesia)",
+	nativeName: "Bahasa Indonesia (Indonesia)",
+	language: "id",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "Rp"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],
+				namesAbbr: ["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],
+				namesShort: ["M","S","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id.js
new file mode 100644
index 0000000..278522d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.id.js
@@ -0,0 +1,75 @@
+/*
+ * Globalize Culture id
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "id", "default", {
+	name: "id",
+	englishName: "Indonesian",
+	nativeName: "Bahasa Indonesia",
+	language: "id",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "Rp"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],
+				namesAbbr: ["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],
+				namesShort: ["M","S","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig-NG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig-NG.js
new file mode 100644
index 0000000..444f59f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig-NG.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ig-NG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ig-NG", "default", {
+	name: "ig-NG",
+	englishName: "Igbo (Nigeria)",
+	nativeName: "Igbo (Nigeria)",
+	language: "ig",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Onwa mbu","Onwa ibua","Onwa ato","Onwa ano","Onwa ise","Onwa isi","Onwa asa","Onwa asato","Onwa itolu","Onwa iri","Onwa iri n'ofu","Onwa iri n'ibua",""],
+				namesAbbr: ["mbu.","ibu.","ato.","ano.","ise","isi","asa","asa.","ito.","iri.","n'of.","n'ib.",""]
+			},
+			AM: ["Ututu","ututu","UTUTU"],
+			PM: ["Efifie","efifie","EFIFIE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig.js
new file mode 100644
index 0000000..bce5771
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ig.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture ig
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ig", "default", {
+	name: "ig",
+	englishName: "Igbo",
+	nativeName: "Igbo",
+	language: "ig",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Onwa mbu","Onwa ibua","Onwa ato","Onwa ano","Onwa ise","Onwa isi","Onwa asa","Onwa asato","Onwa itolu","Onwa iri","Onwa iri n'ofu","Onwa iri n'ibua",""],
+				namesAbbr: ["mbu.","ibu.","ato.","ano.","ise","isi","asa","asa.","ito.","iri.","n'of.","n'ib.",""]
+			},
+			AM: ["Ututu","ututu","UTUTU"],
+			PM: ["Efifie","efifie","EFIFIE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii-CN.js
new file mode 100644
index 0000000..7157e36
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii-CN.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture ii-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ii-CN", "default", {
+	name: "ii-CN",
+	englishName: "Yi (PRC)",
+	nativeName: "ꆈꌠꁱꂷ (ꍏꉸꏓꂱꇭꉼꇩ)",
+	language: "ii",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ꌗꂷꀋꉬ",
+		negativeInfinity: "ꀄꊭꌐꀋꉆ",
+		positiveInfinity: "ꈤꇁꑖꀋꉬ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ꑭꆏꑍ","ꆏꊂ꒔","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],
+				namesAbbr: ["ꑭꆏ","ꆏ꒔","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],
+				namesShort: ["ꆏ","꒔","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"]
+			},
+			months: {
+				names: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""],
+				namesAbbr: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""]
+			},
+			AM: ["ꂵꆪꈌꈐ","ꂵꆪꈌꈐ","ꂵꆪꈌꈐ"],
+			PM: ["ꂵꆪꈌꉈ","ꂵꆪꈌꉈ","ꂵꆪꈌꉈ"],
+			eras: [{"name":"ꇬꑼ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ꈎ' M'ꆪ' d'ꑍ'",
+				t: "tt h:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ꈎ' M'ꆪ' d'ꑍ' tt h:mm",
+				F: "yyyy'ꈎ' M'ꆪ' d'ꑍ' H:mm:ss",
+				M: "M'ꆪ' d'ꑍ'",
+				Y: "yyyy'ꈎ' M'ꆪ'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii.js
new file mode 100644
index 0000000..6aace19
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ii.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture ii
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ii", "default", {
+	name: "ii",
+	englishName: "Yi",
+	nativeName: "ꆈꌠꁱꂷ",
+	language: "ii",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ꌗꂷꀋꉬ",
+		negativeInfinity: "ꀄꊭꌐꀋꉆ",
+		positiveInfinity: "ꈤꇁꑖꀋꉬ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ꑭꆏꑍ","ꆏꊂ꒔","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],
+				namesAbbr: ["ꑭꆏ","ꆏ꒔","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],
+				namesShort: ["ꆏ","꒔","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"]
+			},
+			months: {
+				names: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""],
+				namesAbbr: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""]
+			},
+			AM: ["ꂵꆪꈌꈐ","ꂵꆪꈌꈐ","ꂵꆪꈌꈐ"],
+			PM: ["ꂵꆪꈌꉈ","ꂵꆪꈌꉈ","ꂵꆪꈌꉈ"],
+			eras: [{"name":"ꇬꑼ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ꈎ' M'ꆪ' d'ꑍ'",
+				t: "tt h:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ꈎ' M'ꆪ' d'ꑍ' tt h:mm",
+				F: "yyyy'ꈎ' M'ꆪ' d'ꑍ' H:mm:ss",
+				M: "M'ꆪ' d'ꑍ'",
+				Y: "yyyy'ꈎ' M'ꆪ'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is-IS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is-IS.js
new file mode 100644
index 0000000..7af9121
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is-IS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture is-IS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "is-IS", "default", {
+	name: "is-IS",
+	englishName: "Icelandic (Iceland)",
+	nativeName: "íslenska (Ísland)",
+	language: "is",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],
+				namesAbbr: ["sun.","mán.","þri.","mið.","fim.","fös.","lau."],
+				namesShort: ["su","má","þr","mi","fi","fö","la"]
+			},
+			months: {
+				names: ["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember",""],
+				namesAbbr: ["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is.js
new file mode 100644
index 0000000..971e18a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.is.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture is
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "is", "default", {
+	name: "is",
+	englishName: "Icelandic",
+	nativeName: "íslenska",
+	language: "is",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],
+				namesAbbr: ["sun.","mán.","þri.","mið.","fim.","fös.","lau."],
+				namesShort: ["su","má","þr","mi","fi","fö","la"]
+			},
+			months: {
+				names: ["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember",""],
+				namesAbbr: ["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-CH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-CH.js
new file mode 100644
index 0000000..e231c2f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-CH.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture it-CH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "it-CH", "default", {
+	name: "it-CH",
+	englishName: "Italian (Switzerland)",
+	nativeName: "italiano (Svizzera)",
+	language: "it",
+	numberFormat: {
+		",": "'",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-IT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-IT.js
new file mode 100644
index 0000000..42ec54a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it-IT.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture it-IT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "it-IT", "default", {
+	name: "it-IT",
+	englishName: "Italian (Italy)",
+	nativeName: "italiano (Italia)",
+	language: "it",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it.js
new file mode 100644
index 0000000..34594b0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.it.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture it
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "it", "default", {
+	name: "it",
+	englishName: "Italian",
+	nativeName: "italiano",
+	language: "it",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans-CA.js
new file mode 100644
index 0000000..f546847
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans-CA.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture iu-Cans-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu-Cans-CA", "default", {
+	name: "iu-Cans-CA",
+	englishName: "Inuktitut (Syllabics, Canada)",
+	nativeName: "ᐃᓄᒃᑎᑐᑦ (ᑲᓇᑕᒥ)",
+	language: "iu-Cans",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ᓈᑦᑏᖑᔭ","ᓇᒡᒐᔾᔭᐅ","ᐊᐃᑉᐱᖅ","ᐱᖓᑦᓯᖅ","ᓯᑕᒻᒥᖅ","ᑕᓪᓕᕐᒥᖅ","ᓯᕙᑖᕐᕕᒃ"],
+				namesAbbr: ["ᓈᑦᑏ","ᓇᒡᒐ","ᐊᐃᑉᐱ","ᐱᖓᑦᓯ","ᓯᑕ","ᑕᓪᓕ","ᓯᕙᑖᕐᕕᒃ"],
+				namesShort: ["ᓈ","ᓇ","ᐊ","ᐱ","ᓯ","ᑕ","ᓯ"]
+			},
+			months: {
+				names: ["ᔮᓐᓄᐊᕆ","ᕖᕝᕗᐊᕆ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌᓯ","ᓯᑎᐱᕆ","ᐅᑐᐱᕆ","ᓄᕕᐱᕆ","ᑎᓯᐱᕆ",""],
+				namesAbbr: ["ᔮᓐᓄ","ᕖᕝᕗ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌ","ᓯᑎᐱ","ᐅᑐᐱ","ᓄᕕᐱ","ᑎᓯᐱ",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd,MMMM dd,yyyy",
+				f: "dddd,MMMM dd,yyyy h:mm tt",
+				F: "dddd,MMMM dd,yyyy h:mm:ss tt",
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans.js
new file mode 100644
index 0000000..62f15ab
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Cans.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture iu-Cans
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu-Cans", "default", {
+	name: "iu-Cans",
+	englishName: "Inuktitut (Syllabics)",
+	nativeName: "ᐃᓄᒃᑎᑐᑦ",
+	language: "iu-Cans",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ᓈᑦᑏᖑᔭ","ᓇᒡᒐᔾᔭᐅ","ᐊᐃᑉᐱᖅ","ᐱᖓᑦᓯᖅ","ᓯᑕᒻᒥᖅ","ᑕᓪᓕᕐᒥᖅ","ᓯᕙᑖᕐᕕᒃ"],
+				namesAbbr: ["ᓈᑦᑏ","ᓇᒡᒐ","ᐊᐃᑉᐱ","ᐱᖓᑦᓯ","ᓯᑕ","ᑕᓪᓕ","ᓯᕙᑖᕐᕕᒃ"],
+				namesShort: ["ᓈ","ᓇ","ᐊ","ᐱ","ᓯ","ᑕ","ᓯ"]
+			},
+			months: {
+				names: ["ᔮᓐᓄᐊᕆ","ᕖᕝᕗᐊᕆ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌᓯ","ᓯᑎᐱᕆ","ᐅᑐᐱᕆ","ᓄᕕᐱᕆ","ᑎᓯᐱᕆ",""],
+				namesAbbr: ["ᔮᓐᓄ","ᕖᕝᕗ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌ","ᓯᑎᐱ","ᐅᑐᐱ","ᓄᕕᐱ","ᑎᓯᐱ",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd,MMMM dd,yyyy",
+				f: "dddd,MMMM dd,yyyy h:mm tt",
+				F: "dddd,MMMM dd,yyyy h:mm:ss tt",
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn-CA.js
new file mode 100644
index 0000000..2fa1467
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn-CA.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture iu-Latn-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu-Latn-CA", "default", {
+	name: "iu-Latn-CA",
+	englishName: "Inuktitut (Latin, Canada)",
+	nativeName: "Inuktitut (Kanatami)",
+	language: "iu-Latn",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn.js
new file mode 100644
index 0000000..d2e54fa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu-Latn.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture iu-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu-Latn", "default", {
+	name: "iu-Latn",
+	englishName: "Inuktitut (Latin)",
+	nativeName: "Inuktitut",
+	language: "iu-Latn",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu.js
new file mode 100644
index 0000000..093956b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.iu.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture iu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "iu", "default", {
+	name: "iu",
+	englishName: "Inuktitut",
+	nativeName: "Inuktitut",
+	language: "iu",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja-JP.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja-JP.js
new file mode 100644
index 0000000..a9469d7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja-JP.js
@@ -0,0 +1,100 @@
+/*
+ * Globalize Culture ja-JP
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ja-JP", "default", {
+	name: "ja-JP",
+	englishName: "Japanese (Japan)",
+	nativeName: "日本語 (日本)",
+	language: "ja",
+	numberFormat: {
+		NaN: "NaN (非数値)",
+		negativeInfinity: "-∞",
+		positiveInfinity: "+∞",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"西暦","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Japanese: {
+			name: "Japanese",
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "gg y/M/d",
+				D: "gg y'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "gg y'年'M'月'd'日' H:mm",
+				F: "gg y'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "gg y'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja.js
new file mode 100644
index 0000000..1539f99
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ja.js
@@ -0,0 +1,100 @@
+/*
+ * Globalize Culture ja
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ja", "default", {
+	name: "ja",
+	englishName: "Japanese",
+	nativeName: "日本語",
+	language: "ja",
+	numberFormat: {
+		NaN: "NaN (非数値)",
+		negativeInfinity: "-∞",
+		positiveInfinity: "+∞",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"西暦","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Japanese: {
+			name: "Japanese",
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "gg y/M/d",
+				D: "gg y'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "gg y'年'M'月'd'日' H:mm",
+				F: "gg y'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "gg y'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka-GE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka-GE.js
new file mode 100644
index 0000000..97b767b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka-GE.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture ka-GE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ka-GE", "default", {
+	name: "ka-GE",
+	englishName: "Georgian (Georgia)",
+	nativeName: "ქართული (საქართველო)",
+	language: "ka",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Lari"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesAbbr: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesShort: ["კ","ო","ს","ო","ხ","პ","შ"]
+			},
+			months: {
+				names: ["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი",""],
+				namesAbbr: ["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'წლის' dd MM, dddd",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'წლის' dd MM, dddd H:mm",
+				F: "yyyy 'წლის' dd MM, dddd H:mm:ss",
+				M: "dd MM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka.js
new file mode 100644
index 0000000..6e19adf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ka.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture ka
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ka", "default", {
+	name: "ka",
+	englishName: "Georgian",
+	nativeName: "ქართული",
+	language: "ka",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Lari"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesAbbr: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesShort: ["კ","ო","ს","ო","ხ","პ","შ"]
+			},
+			months: {
+				names: ["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი",""],
+				namesAbbr: ["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'წლის' dd MM, dddd",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'წლის' dd MM, dddd H:mm",
+				F: "yyyy 'წლის' dd MM, dddd H:mm:ss",
+				M: "dd MM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk-KZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk-KZ.js
new file mode 100644
index 0000000..138d486
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk-KZ.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture kk-KZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kk-KZ", "default", {
+	name: "kk-KZ",
+	englishName: "Kazakh (Kazakhstan)",
+	nativeName: "Қазақ (Қазақстан)",
+	language: "kk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			",": " ",
+			".": "-",
+			symbol: "Т"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],
+				namesAbbr: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],
+				namesShort: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"]
+			},
+			months: {
+				names: ["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан",""],
+				namesAbbr: ["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'ж.' H:mm",
+				F: "d MMMM yyyy 'ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk.js
new file mode 100644
index 0000000..7530988
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kk.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture kk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kk", "default", {
+	name: "kk",
+	englishName: "Kazakh",
+	nativeName: "Қазақ",
+	language: "kk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			",": " ",
+			".": "-",
+			symbol: "Т"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],
+				namesAbbr: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],
+				namesShort: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"]
+			},
+			months: {
+				names: ["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан",""],
+				namesAbbr: ["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'ж.' H:mm",
+				F: "d MMMM yyyy 'ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl-GL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl-GL.js
new file mode 100644
index 0000000..03b9637
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl-GL.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture kl-GL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kl-GL", "default", {
+	name: "kl-GL",
+	englishName: "Greenlandic (Greenland)",
+	nativeName: "kalaallisut (Kalaallit Nunaat)",
+	language: "kl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			groupSizes: [3,0],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],
+				namesAbbr: ["sap","ata","mar","ping","sis","tal","arf"],
+				namesShort: ["sa","at","ma","pi","si","ta","ar"]
+			},
+			months: {
+				names: ["januari","februari","martsi","apriili","maaji","juni","juli","aggusti","septembari","oktobari","novembari","decembari",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl.js
new file mode 100644
index 0000000..cf71fed
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kl.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture kl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kl", "default", {
+	name: "kl",
+	englishName: "Greenlandic",
+	nativeName: "kalaallisut",
+	language: "kl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			groupSizes: [3,0],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],
+				namesAbbr: ["sap","ata","mar","ping","sis","tal","arf"],
+				namesShort: ["sa","at","ma","pi","si","ta","ar"]
+			},
+			months: {
+				names: ["januari","februari","martsi","apriili","maaji","juni","juli","aggusti","septembari","oktobari","novembari","decembari",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km-KH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km-KH.js
new file mode 100644
index 0000000..6c2ea1c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km-KH.js
@@ -0,0 +1,99 @@
+/*
+ * Globalize Culture km-KH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "km-KH", "default", {
+	name: "km-KH",
+	englishName: "Khmer (Cambodia)",
+	nativeName: "ខ្មែរ (កម្ពុជា)",
+	language: "km",
+	numberFormat: {
+		pattern: ["- n"],
+		groupSizes: [3,0],
+		NaN: "NAN",
+		negativeInfinity: "-- អនន្ត",
+		positiveInfinity: "អនន្ត",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			symbol: "៛"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ថ្ងៃអាទិត្យ","ថ្ងៃច័ន្ទ","ថ្ងៃអង្គារ","ថ្ងៃពុធ","ថ្ងៃព្រហស្បតិ៍","ថ្ងៃសុក្រ","ថ្ងៃសៅរ៍"],
+				namesAbbr: ["អាទិ.","ច.","អ.","ពុ","ព្រហ.","សុ.","ស."],
+				namesShort: ["អា","ច","អ","ពុ","ព្","សុ","ស"]
+			},
+			months: {
+				names: ["មករា","កុម្ភៈ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ",""],
+				namesAbbr: ["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"មុនគ.ស.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy H:mm tt",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "'ថ្ងៃទី' dd 'ខែ' MM",
+				Y: "'ខែ' MM 'ឆ្នាំ' yyyy"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm tt",
+				F: "dddd, MMMM dd, yyyy HH:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km.js
new file mode 100644
index 0000000..b3d9b4c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.km.js
@@ -0,0 +1,99 @@
+/*
+ * Globalize Culture km
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "km", "default", {
+	name: "km",
+	englishName: "Khmer",
+	nativeName: "ខ្មែរ",
+	language: "km",
+	numberFormat: {
+		pattern: ["- n"],
+		groupSizes: [3,0],
+		NaN: "NAN",
+		negativeInfinity: "-- អនន្ត",
+		positiveInfinity: "អនន្ត",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			symbol: "៛"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ថ្ងៃអាទិត្យ","ថ្ងៃច័ន្ទ","ថ្ងៃអង្គារ","ថ្ងៃពុធ","ថ្ងៃព្រហស្បតិ៍","ថ្ងៃសុក្រ","ថ្ងៃសៅរ៍"],
+				namesAbbr: ["អាទិ.","ច.","អ.","ពុ","ព្រហ.","សុ.","ស."],
+				namesShort: ["អា","ច","អ","ពុ","ព្","សុ","ស"]
+			},
+			months: {
+				names: ["មករា","កុម្ភៈ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ",""],
+				namesAbbr: ["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"មុនគ.ស.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy H:mm tt",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "'ថ្ងៃទី' dd 'ខែ' MM",
+				Y: "'ខែ' MM 'ឆ្នាំ' yyyy"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm tt",
+				F: "dddd, MMMM dd, yyyy HH:mm:ss"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn-IN.js
new file mode 100644
index 0000000..23b8684
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture kn-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kn-IN", "default", {
+	name: "kn-IN",
+	englishName: "Kannada (India)",
+	nativeName: "ಕನ್ನಡ (ಭಾರತ)",
+	language: "kn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ರೂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],
+				namesAbbr: ["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],
+				namesShort: ["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"]
+			},
+			months: {
+				names: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""],
+				namesAbbr: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""]
+			},
+			AM: ["ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ"],
+			PM: ["ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn.js
new file mode 100644
index 0000000..43322e2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kn.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture kn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kn", "default", {
+	name: "kn",
+	englishName: "Kannada",
+	nativeName: "ಕನ್ನಡ",
+	language: "kn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ರೂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],
+				namesAbbr: ["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],
+				namesShort: ["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"]
+			},
+			months: {
+				names: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""],
+				namesAbbr: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""]
+			},
+			AM: ["ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ"],
+			PM: ["ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko-KR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko-KR.js
new file mode 100644
index 0000000..ce97685
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko-KR.js
@@ -0,0 +1,96 @@
+/*
+ * Globalize Culture ko-KR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ko-KR", "default", {
+	name: "ko-KR",
+	englishName: "Korean (Korea)",
+	nativeName: "한국어 (대한민국)",
+	language: "ko",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "₩"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"서기","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "yyyy'년' M'월'"
+			}
+		},
+		Korean: {
+			name: "Korean",
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"단기","start":null,"offset":-2333}],
+			twoDigitYearMax: 4362,
+			patterns: {
+				d: "gg yyyy-MM-dd",
+				D: "gg yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "gg yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "gg yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "gg yyyy'년' M'월'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko.js
new file mode 100644
index 0000000..a0a7376
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ko.js
@@ -0,0 +1,96 @@
+/*
+ * Globalize Culture ko
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ko", "default", {
+	name: "ko",
+	englishName: "Korean",
+	nativeName: "한국어",
+	language: "ko",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "₩"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"서기","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "yyyy'년' M'월'"
+			}
+		},
+		Korean: {
+			name: "Korean",
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"단기","start":null,"offset":-2333}],
+			twoDigitYearMax: 4362,
+			patterns: {
+				d: "gg yyyy-MM-dd",
+				D: "gg yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "gg yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "gg yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "gg yyyy'년' M'월'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok-IN.js
new file mode 100644
index 0000000..ec8cab9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture kok-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kok-IN", "default", {
+	name: "kok-IN",
+	englishName: "Konkani (India)",
+	nativeName: "कोंकणी (भारत)",
+	language: "kok",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],
+				namesAbbr: ["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],
+				namesShort: ["आ","स","म","ब","ब","स","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""],
+				namesAbbr: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok.js
new file mode 100644
index 0000000..65a3678
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.kok.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture kok
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "kok", "default", {
+	name: "kok",
+	englishName: "Konkani",
+	nativeName: "कोंकणी",
+	language: "kok",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],
+				namesAbbr: ["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],
+				namesShort: ["आ","स","म","ब","ब","स","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""],
+				namesAbbr: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky-KG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky-KG.js
new file mode 100644
index 0000000..3c35abd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky-KG.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture ky-KG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ky-KG", "default", {
+	name: "ky-KG",
+	englishName: "Kyrgyz (Kyrgyzstan)",
+	nativeName: "Кыргыз (Кыргызстан)",
+	language: "ky",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": "-",
+			symbol: "сом"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],
+				namesAbbr: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],
+				namesShort: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d'-'MMMM yyyy'-ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d'-'MMMM yyyy'-ж.' H:mm",
+				F: "d'-'MMMM yyyy'-ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy'-ж.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky.js
new file mode 100644
index 0000000..7bc386b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ky.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture ky
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ky", "default", {
+	name: "ky",
+	englishName: "Kyrgyz",
+	nativeName: "Кыргыз",
+	language: "ky",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": "-",
+			symbol: "сом"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],
+				namesAbbr: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],
+				namesShort: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d'-'MMMM yyyy'-ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d'-'MMMM yyyy'-ж.' H:mm",
+				F: "d'-'MMMM yyyy'-ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy'-ж.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb-LU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb-LU.js
new file mode 100644
index 0000000..ef9d39a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb-LU.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture lb-LU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lb-LU", "default", {
+	name: "lb-LU",
+	englishName: "Luxembourgish (Luxembourg)",
+	nativeName: "Lëtzebuergesch (Luxembourg)",
+	language: "lb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "n. num.",
+		negativeInfinity: "-onendlech",
+		positiveInfinity: "+onendlech",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],
+				namesAbbr: ["Son","Méi","Dën","Mët","Don","Fre","Sam"],
+				namesShort: ["So","Mé","Dë","Më","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb.js
new file mode 100644
index 0000000..56983ff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lb.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture lb
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lb", "default", {
+	name: "lb",
+	englishName: "Luxembourgish",
+	nativeName: "Lëtzebuergesch",
+	language: "lb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "n. num.",
+		negativeInfinity: "-onendlech",
+		positiveInfinity: "+onendlech",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],
+				namesAbbr: ["Son","Méi","Dën","Mët","Don","Fre","Sam"],
+				namesShort: ["So","Mé","Dë","Më","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo-LA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo-LA.js
new file mode 100644
index 0000000..5556d3c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo-LA.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture lo-LA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lo-LA", "default", {
+	name: "lo-LA",
+	englishName: "Lao (Lao P.D.R.)",
+	nativeName: "ລາວ (ສ.ປ.ປ. ລາວ)",
+	language: "lo",
+	numberFormat: {
+		pattern: ["(n)"],
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["(n$)","n$"],
+			groupSizes: [3,0],
+			symbol: "₭"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],
+				namesAbbr: ["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],
+				namesShort: ["ອ","ຈ","ອ","ພ","ພ","ສ","ເ"]
+			},
+			months: {
+				names: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""],
+				namesAbbr: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""]
+			},
+			AM: ["ເຊົ້າ","ເຊົ້າ","ເຊົ້າ"],
+			PM: ["ແລງ","ແລງ","ແລງ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy H:mm tt",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo.js
new file mode 100644
index 0000000..bea14aa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lo.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture lo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lo", "default", {
+	name: "lo",
+	englishName: "Lao",
+	nativeName: "ລາວ",
+	language: "lo",
+	numberFormat: {
+		pattern: ["(n)"],
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["(n$)","n$"],
+			groupSizes: [3,0],
+			symbol: "₭"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],
+				namesAbbr: ["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],
+				namesShort: ["ອ","ຈ","ອ","ພ","ພ","ສ","ເ"]
+			},
+			months: {
+				names: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""],
+				namesAbbr: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""]
+			},
+			AM: ["ເຊົ້າ","ເຊົ້າ","ເຊົ້າ"],
+			PM: ["ແລງ","ແລງ","ແລງ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy H:mm tt",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt-LT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt-LT.js
new file mode 100644
index 0000000..d0d31a3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt-LT.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture lt-LT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lt-LT", "default", {
+	name: "lt-LT",
+	englishName: "Lithuanian (Lithuania)",
+	nativeName: "lietuvių (Lietuva)",
+	language: "lt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-begalybė",
+		positiveInfinity: "begalybė",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Lt"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],
+				namesAbbr: ["Sk","Pr","An","Tr","Kt","Pn","Št"],
+				namesShort: ["S","P","A","T","K","Pn","Š"]
+			},
+			months: {
+				names: ["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			monthsGenitive: {
+				names: ["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd",
+				D: "yyyy 'm.' MMMM d 'd.'",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'm.' MMMM d 'd.' HH:mm",
+				F: "yyyy 'm.' MMMM d 'd.' HH:mm:ss",
+				M: "MMMM d 'd.'",
+				Y: "yyyy 'm.' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt.js
new file mode 100644
index 0000000..e06d87f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lt.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture lt
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lt", "default", {
+	name: "lt",
+	englishName: "Lithuanian",
+	nativeName: "lietuvių",
+	language: "lt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-begalybė",
+		positiveInfinity: "begalybė",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Lt"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],
+				namesAbbr: ["Sk","Pr","An","Tr","Kt","Pn","Št"],
+				namesShort: ["S","P","A","T","K","Pn","Š"]
+			},
+			months: {
+				names: ["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			monthsGenitive: {
+				names: ["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd",
+				D: "yyyy 'm.' MMMM d 'd.'",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'm.' MMMM d 'd.' HH:mm",
+				F: "yyyy 'm.' MMMM d 'd.' HH:mm:ss",
+				M: "MMMM d 'd.'",
+				Y: "yyyy 'm.' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv-LV.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv-LV.js
new file mode 100644
index 0000000..145329b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv-LV.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture lv-LV
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lv-LV", "default", {
+	name: "lv-LV",
+	englishName: "Latvian (Latvia)",
+	nativeName: "latviešu (Latvija)",
+	language: "lv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-bezgalība",
+		positiveInfinity: "bezgalība",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "Ls"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],
+				namesAbbr: ["sv","pr","ot","tr","ce","pk","se"],
+				namesShort: ["sv","pr","ot","tr","ce","pk","se"]
+			},
+			months: {
+				names: ["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			monthsGenitive: {
+				names: ["janvārī","februārī","martā","aprīlī","maijā","jūnijā","jūlijā","augustā","septembrī","oktobrī","novembrī","decembrī",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "dddd, yyyy'. gada 'd. MMMM",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy'. gada 'd. MMMM H:mm",
+				F: "dddd, yyyy'. gada 'd. MMMM H:mm:ss",
+				M: "d. MMMM",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv.js
new file mode 100644
index 0000000..5065722
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.lv.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture lv
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "lv", "default", {
+	name: "lv",
+	englishName: "Latvian",
+	nativeName: "latviešu",
+	language: "lv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-bezgalība",
+		positiveInfinity: "bezgalība",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "Ls"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],
+				namesAbbr: ["sv","pr","ot","tr","ce","pk","se"],
+				namesShort: ["sv","pr","ot","tr","ce","pk","se"]
+			},
+			months: {
+				names: ["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			monthsGenitive: {
+				names: ["janvārī","februārī","martā","aprīlī","maijā","jūnijā","jūlijā","augustā","septembrī","oktobrī","novembrī","decembrī",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "dddd, yyyy'. gada 'd. MMMM",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy'. gada 'd. MMMM H:mm",
+				F: "dddd, yyyy'. gada 'd. MMMM H:mm:ss",
+				M: "d. MMMM",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi-NZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi-NZ.js
new file mode 100644
index 0000000..03720c9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi-NZ.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture mi-NZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mi-NZ", "default", {
+	name: "mi-NZ",
+	englishName: "Maori (New Zealand)",
+	nativeName: "Reo Māori (Aotearoa)",
+	language: "mi",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],
+				namesAbbr: ["Ta","Hi","Tū","Apa","Pa","Me","Ho"],
+				namesShort: ["Ta","Hi","Tū","Aa","Pa","Me","Ho"]
+			},
+			months: {
+				names: ["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngongoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea",""],
+				namesAbbr: ["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM, yyyy",
+				f: "dddd, dd MMMM, yyyy h:mm tt",
+				F: "dddd, dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM, yy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi.js
new file mode 100644
index 0000000..5f861db
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mi.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture mi
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mi", "default", {
+	name: "mi",
+	englishName: "Maori",
+	nativeName: "Reo Māori",
+	language: "mi",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],
+				namesAbbr: ["Ta","Hi","Tū","Apa","Pa","Me","Ho"],
+				namesShort: ["Ta","Hi","Tū","Aa","Pa","Me","Ho"]
+			},
+			months: {
+				names: ["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngongoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea",""],
+				namesAbbr: ["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM, yyyy",
+				f: "dddd, dd MMMM, yyyy h:mm tt",
+				F: "dddd, dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM, yy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk-MK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk-MK.js
new file mode 100644
index 0000000..f0d5e51
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk-MK.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture mk-MK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mk-MK", "default", {
+	name: "mk-MK",
+	englishName: "Macedonian (Former Yugoslav Republic of Macedonia)",
+	nativeName: "македонски јазик (Македонија)",
+	language: "mk",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "ден."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недела","понеделник","вторник","среда","четврток","петок","сабота"],
+				namesAbbr: ["нед","пон","втр","срд","чет","пет","саб"],
+				namesShort: ["не","по","вт","ср","че","пе","са"]
+			},
+			months: {
+				names: ["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd MMMM yyyy HH:mm",
+				F: "dddd, dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk.js
new file mode 100644
index 0000000..a6f8210
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mk.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture mk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mk", "default", {
+	name: "mk",
+	englishName: "Macedonian (FYROM)",
+	nativeName: "македонски јазик",
+	language: "mk",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "ден."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недела","понеделник","вторник","среда","четврток","петок","сабота"],
+				namesAbbr: ["нед","пон","втр","срд","чет","пет","саб"],
+				namesShort: ["не","по","вт","ср","че","пе","са"]
+			},
+			months: {
+				names: ["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd MMMM yyyy HH:mm",
+				F: "dddd, dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml-IN.js
new file mode 100644
index 0000000..3a915e5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture ml-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ml-IN", "default", {
+	name: "ml-IN",
+	englishName: "Malayalam (India)",
+	nativeName: "മലയാളം (ഭാരതം)",
+	language: "ml",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ക"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["ഞായറാഴ്ച","തിങ്കളാഴ്ച","ചൊവ്വാഴ്ച","ബുധനാഴ്ച","വ്യാഴാഴ്ച","വെള്ളിയാഴ്ച","ശനിയാഴ്ച"],
+				namesAbbr: ["ഞായർ.","തിങ്കൾ.","ചൊവ്വ.","ബുധൻ.","വ്യാഴം.","വെള്ളി.","ശനി."],
+				namesShort: ["ഞ","ത","ച","ബ","വ","വെ","ശ"]
+			},
+			months: {
+				names: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""],
+				namesAbbr: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""]
+			},
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml.js
new file mode 100644
index 0000000..183a223
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ml.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture ml
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ml", "default", {
+	name: "ml",
+	englishName: "Malayalam",
+	nativeName: "മലയാളം",
+	language: "ml",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ക"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["ഞായറാഴ്ച","തിങ്കളാഴ്ച","ചൊവ്വാഴ്ച","ബുധനാഴ്ച","വ്യാഴാഴ്ച","വെള്ളിയാഴ്ച","ശനിയാഴ്ച"],
+				namesAbbr: ["ഞായർ.","തിങ്കൾ.","ചൊവ്വ.","ബുധൻ.","വ്യാഴം.","വെള്ളി.","ശനി."],
+				namesShort: ["ഞ","ത","ച","ബ","വ","വെ","ശ"]
+			},
+			months: {
+				names: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""],
+				namesAbbr: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""]
+			},
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Cyrl.js
new file mode 100644
index 0000000..9493c43
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Cyrl.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture mn-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn-Cyrl", "default", {
+	name: "mn-Cyrl",
+	englishName: "Mongolian (Cyrillic)",
+	nativeName: "Монгол хэл",
+	language: "mn-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-MN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-MN.js
new file mode 100644
index 0000000..90577b4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-MN.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture mn-MN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn-MN", "default", {
+	name: "mn-MN",
+	englishName: "Mongolian (Cyrillic, Mongolia)",
+	nativeName: "Монгол хэл (Монгол улс)",
+	language: "mn-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong-CN.js
new file mode 100644
index 0000000..94b57dd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong-CN.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture mn-Mong-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn-Mong-CN", "default", {
+	name: "mn-Mong-CN",
+	englishName: "Mongolian (Traditional Mongolian, PRC)",
+	nativeName: "ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ (ᠪᠦᠭᠦᠳᠡ ᠨᠠᠢᠷᠠᠮᠳᠠᠬᠤ ᠳᠤᠮᠳᠠᠳᠤ ᠠᠷᠠᠳ ᠣᠯᠣᠰ)",
+	language: "mn-Mong",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ᠲᠤᠭᠠᠠ ᠪᠤᠰᠤ",
+		negativeInfinity: "ᠰᠦᠬᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠡᠬᠡ",
+		positiveInfinity: "ᠡᠶ᠋ᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠠᠬᠡ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesAbbr: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesShort: ["ᠡ‍","ᠨᠢ‍","ᠬᠣ‍","ᠭᠤ‍","ᠳᠥ‍","ᠲᠠ‍","ᠵᠢ‍"]
+			},
+			months: {
+				names: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""],
+				namesAbbr: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ᠣᠨ ᠲᠣᠭᠠᠯᠠᠯ ᠤᠨ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm",
+				F: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm:ss",
+				M: "M'ᠰᠠᠷ᠎ᠠ' d'ᠡᠳᠦᠷ'",
+				Y: "yyyy'ᠣᠨ' M'ᠰᠠᠷ᠎ᠠ'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong.js
new file mode 100644
index 0000000..a263973
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn-Mong.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture mn-Mong
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn-Mong", "default", {
+	name: "mn-Mong",
+	englishName: "Mongolian (Traditional Mongolian)",
+	nativeName: "ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ",
+	language: "mn-Mong",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ᠲᠤᠭᠠᠠ ᠪᠤᠰᠤ",
+		negativeInfinity: "ᠰᠦᠬᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠡᠬᠡ",
+		positiveInfinity: "ᠡᠶ᠋ᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠠᠬᠡ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesAbbr: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesShort: ["ᠡ‍","ᠨᠢ‍","ᠬᠣ‍","ᠭᠤ‍","ᠳᠥ‍","ᠲᠠ‍","ᠵᠢ‍"]
+			},
+			months: {
+				names: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""],
+				namesAbbr: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ᠣᠨ ᠲᠣᠭᠠᠯᠠᠯ ᠤᠨ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm",
+				F: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm:ss",
+				M: "M'ᠰᠠᠷ᠎ᠠ' d'ᠡᠳᠦᠷ'",
+				Y: "yyyy'ᠣᠨ' M'ᠰᠠᠷ᠎ᠠ'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn.js
new file mode 100644
index 0000000..acc45c4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mn.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture mn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mn", "default", {
+	name: "mn",
+	englishName: "Mongolian",
+	nativeName: "Монгол хэл",
+	language: "mn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh-CA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh-CA.js
new file mode 100644
index 0000000..ebea792
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh-CA.js
@@ -0,0 +1,52 @@
+/*
+ * Globalize Culture moh-CA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "moh-CA", "default", {
+	name: "moh-CA",
+	englishName: "Mohawk (Mohawk)",
+	nativeName: "Kanien'kéha",
+	language: "moh",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Awentatokentì:ke","Awentataón'ke","Ratironhia'kehronòn:ke","Soséhne","Okaristiiáhne","Ronwaia'tanentaktonhne","Entákta"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["Tsothohrkó:Wa","Enniska","Enniskó:Wa","Onerahtókha","Onerahtohkó:Wa","Ohiari:Ha","Ohiarihkó:Wa","Seskéha","Seskehkó:Wa","Kenténha","Kentenhkó:Wa","Tsothóhrha",""]
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh.js
new file mode 100644
index 0000000..e8fa748
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.moh.js
@@ -0,0 +1,52 @@
+/*
+ * Globalize Culture moh
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "moh", "default", {
+	name: "moh",
+	englishName: "Mohawk",
+	nativeName: "Kanien'kéha",
+	language: "moh",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Awentatokentì:ke","Awentataón'ke","Ratironhia'kehronòn:ke","Soséhne","Okaristiiáhne","Ronwaia'tanentaktonhne","Entákta"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["Tsothohrkó:Wa","Enniska","Enniskó:Wa","Onerahtókha","Onerahtohkó:Wa","Ohiari:Ha","Ohiarihkó:Wa","Seskéha","Seskehkó:Wa","Kenténha","Kentenhkó:Wa","Tsothóhrha",""]
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr-IN.js
new file mode 100644
index 0000000..b671dca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture mr-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mr-IN", "default", {
+	name: "mr-IN",
+	englishName: "Marathi (India)",
+	nativeName: "मराठी (भारत)",
+	language: "mr",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर",""],
+				namesAbbr: ["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें.",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr.js
new file mode 100644
index 0000000..2a59f15
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mr.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture mr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mr", "default", {
+	name: "mr",
+	englishName: "Marathi",
+	nativeName: "मराठी",
+	language: "mr",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर",""],
+				namesAbbr: ["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें.",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-BN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-BN.js
new file mode 100644
index 0000000..61bedd0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-BN.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture ms-BN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ms-BN", "default", {
+	name: "ms-BN",
+	englishName: "Malay (Brunei Darussalam)",
+	nativeName: "Bahasa Melayu (Brunei Darussalam)",
+	language: "ms",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-MY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-MY.js
new file mode 100644
index 0000000..d6d916d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms-MY.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture ms-MY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ms-MY", "default", {
+	name: "ms-MY",
+	englishName: "Malay (Malaysia)",
+	nativeName: "Bahasa Melayu (Malaysia)",
+	language: "ms",
+	numberFormat: {
+		currency: {
+			decimals: 0,
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms.js
new file mode 100644
index 0000000..033e5d2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ms.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture ms
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ms", "default", {
+	name: "ms",
+	englishName: "Malay",
+	nativeName: "Bahasa Melayu",
+	language: "ms",
+	numberFormat: {
+		currency: {
+			decimals: 0,
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt-MT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt-MT.js
new file mode 100644
index 0000000..bb7d40e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt-MT.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture mt-MT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mt-MT", "default", {
+	name: "mt-MT",
+	englishName: "Maltese (Malta)",
+	nativeName: "Malti (Malta)",
+	language: "mt",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],
+				namesAbbr: ["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],
+				namesShort: ["I","I","I","L","I","I","I"]
+			},
+			months: {
+				names: ["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru",""],
+				namesAbbr: ["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' ta\\' 'MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' ta\\' 'MMMM yyyy HH:mm",
+				F: "dddd, d' ta\\' 'MMMM yyyy HH:mm:ss",
+				M: "d' ta\\' 'MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt.js
new file mode 100644
index 0000000..b742360
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.mt.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture mt
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "mt", "default", {
+	name: "mt",
+	englishName: "Maltese",
+	nativeName: "Malti",
+	language: "mt",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],
+				namesAbbr: ["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],
+				namesShort: ["I","I","I","L","I","I","I"]
+			},
+			months: {
+				names: ["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru",""],
+				namesAbbr: ["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' ta\\' 'MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' ta\\' 'MMMM yyyy HH:mm",
+				F: "dddd, d' ta\\' 'MMMM yyyy HH:mm:ss",
+				M: "d' ta\\' 'MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb-NO.js
new file mode 100644
index 0000000..4961cb1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb-NO.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture nb-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nb-NO", "default", {
+	name: "nb-NO",
+	englishName: "Norwegian, Bokmål (Norway)",
+	nativeName: "norsk, bokmål (Norge)",
+	language: "nb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb.js
new file mode 100644
index 0000000..31e3144
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nb.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture nb
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nb", "default", {
+	name: "nb",
+	englishName: "Norwegian (Bokmål)",
+	nativeName: "norsk (bokmål)",
+	language: "nb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne-NP.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne-NP.js
new file mode 100644
index 0000000..6b40800
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne-NP.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture ne-NP
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ne-NP", "default", {
+	name: "ne-NP",
+	englishName: "Nepali (Nepal)",
+	nativeName: "नेपाली (नेपाल)",
+	language: "ne",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["आइतवार","सोमवार","मङ्गलवार","बुधवार","बिहीवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],
+				namesShort: ["आ","सो","म","बु","बि","शु","श"]
+			},
+			months: {
+				names: ["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जून","जुलाई","अगस्त","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर",""],
+				namesAbbr: ["जन","फेब","मार्च","अप्रिल","मे","जून","जुलाई","अग","सेप्ट","अक्ट","नोभ","डिस",""]
+			},
+			AM: ["विहानी","विहानी","विहानी"],
+			PM: ["बेलुकी","बेलुकी","बेलुकी"],
+			eras: [{"name":"a.d.","start":null,"offset":0}],
+			patterns: {
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne.js
new file mode 100644
index 0000000..874982f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ne.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture ne
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ne", "default", {
+	name: "ne",
+	englishName: "Nepali",
+	nativeName: "नेपाली",
+	language: "ne",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["आइतवार","सोमवार","मङ्गलवार","बुधवार","बिहीवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],
+				namesShort: ["आ","सो","म","बु","बि","शु","श"]
+			},
+			months: {
+				names: ["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जून","जुलाई","अगस्त","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर",""],
+				namesAbbr: ["जन","फेब","मार्च","अप्रिल","मे","जून","जुलाई","अग","सेप्ट","अक्ट","नोभ","डिस",""]
+			},
+			AM: ["विहानी","विहानी","विहानी"],
+			PM: ["बेलुकी","बेलुकी","बेलुकी"],
+			eras: [{"name":"a.d.","start":null,"offset":0}],
+			patterns: {
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-BE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-BE.js
new file mode 100644
index 0000000..c9f93c7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-BE.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture nl-BE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nl-BE", "default", {
+	name: "nl-BE",
+	englishName: "Dutch (Belgium)",
+	nativeName: "Nederlands (België)",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Niet-een-getal)",
+		negativeInfinity: "-oneindig",
+		positiveInfinity: "oneindig",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-NL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-NL.js
new file mode 100644
index 0000000..263d5af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl-NL.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture nl-NL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nl-NL", "default", {
+	name: "nl-NL",
+	englishName: "Dutch (Netherlands)",
+	nativeName: "Nederlands (Nederland)",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl.js
new file mode 100644
index 0000000..560fa97
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nl.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture nl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nl", "default", {
+	name: "nl",
+	englishName: "Dutch",
+	nativeName: "Nederlands",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn-NO.js
new file mode 100644
index 0000000..921debf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn-NO.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture nn-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nn-NO", "default", {
+	name: "nn-NO",
+	englishName: "Norwegian, Nynorsk (Norway)",
+	nativeName: "norsk, nynorsk (Noreg)",
+	language: "nn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],
+				namesAbbr: ["sø","må","ty","on","to","fr","la"],
+				namesShort: ["sø","må","ty","on","to","fr","la"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn.js
new file mode 100644
index 0000000..9942d9e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nn.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture nn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nn", "default", {
+	name: "nn",
+	englishName: "Norwegian (Nynorsk)",
+	nativeName: "norsk (nynorsk)",
+	language: "nn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],
+				namesAbbr: ["sø","må","ty","on","to","fr","la"],
+				namesShort: ["sø","må","ty","on","to","fr","la"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.no.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.no.js
new file mode 100644
index 0000000..e1131df
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.no.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture no
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "no", "default", {
+	name: "no",
+	englishName: "Norwegian",
+	nativeName: "norsk",
+	language: "no",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso-ZA.js
new file mode 100644
index 0000000..ad3afa0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso-ZA.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture nso-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nso-ZA", "default", {
+	name: "nso-ZA",
+	englishName: "Sesotho sa Leboa (South Africa)",
+	nativeName: "Sesotho sa Leboa (Afrika Borwa)",
+	language: "nso",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],
+				namesAbbr: ["Lam","Moš","Lbb","Lbr","Lbn","Lbh","Mok"],
+				namesShort: ["L","M","L","L","L","L","M"]
+			},
+			months: {
+				names: ["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole",""],
+				namesAbbr: ["Pher","Hlak","Mop","Mor","Mos","Ngwat","Phup","Phat","Lew","Dip","Dib","Man",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso.js
new file mode 100644
index 0000000..76621b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.nso.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture nso
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "nso", "default", {
+	name: "nso",
+	englishName: "Sesotho sa Leboa",
+	nativeName: "Sesotho sa Leboa",
+	language: "nso",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],
+				namesAbbr: ["Lam","Moš","Lbb","Lbr","Lbn","Lbh","Mok"],
+				namesShort: ["L","M","L","L","L","L","M"]
+			},
+			months: {
+				names: ["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole",""],
+				namesAbbr: ["Pher","Hlak","Mop","Mor","Mos","Ngwat","Phup","Phat","Lew","Dip","Dib","Man",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc-FR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc-FR.js
new file mode 100644
index 0000000..6681813
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc-FR.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture oc-FR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "oc-FR", "default", {
+	name: "oc-FR",
+	englishName: "Occitan (France)",
+	nativeName: "Occitan (França)",
+	language: "oc",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numeric",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "+Infinit",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],
+				namesAbbr: ["dim.","lun.","mar.","mèc.","jòu.","ven.","sab."],
+				namesShort: ["di","lu","ma","mè","jò","ve","sa"]
+			},
+			months: {
+				names: ["genier","febrier","març","abril","mai","junh","julh","agost","setembre","octobre","novembre","desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			monthsGenitive: {
+				names: ["de genier","de febrier","de març","d'abril","de mai","de junh","de julh","d'agost","de setembre","d'octobre","de novembre","de desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"après Jèsus-Crist","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd,' lo 'd MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd,' lo 'd MMMM' de 'yyyy HH:mm",
+				F: "dddd,' lo 'd MMMM' de 'yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc.js
new file mode 100644
index 0000000..34705f0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.oc.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture oc
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "oc", "default", {
+	name: "oc",
+	englishName: "Occitan",
+	nativeName: "Occitan",
+	language: "oc",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numeric",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "+Infinit",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],
+				namesAbbr: ["dim.","lun.","mar.","mèc.","jòu.","ven.","sab."],
+				namesShort: ["di","lu","ma","mè","jò","ve","sa"]
+			},
+			months: {
+				names: ["genier","febrier","març","abril","mai","junh","julh","agost","setembre","octobre","novembre","desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			monthsGenitive: {
+				names: ["de genier","de febrier","de març","d'abril","de mai","de junh","de julh","d'agost","de setembre","d'octobre","de novembre","de desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"après Jèsus-Crist","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd,' lo 'd MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd,' lo 'd MMMM' de 'yyyy HH:mm",
+				F: "dddd,' lo 'd MMMM' de 'yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or-IN.js
new file mode 100644
index 0000000..f773323
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or-IN.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture or-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "or-IN", "default", {
+	name: "or-IN",
+	englishName: "Oriya (India)",
+	nativeName: "ଓଡ଼ିଆ (ଭାରତ)",
+	language: "or",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ଟ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],
+				namesAbbr: ["ରବି.","ସୋମ.","ମଙ୍ଗଳ.","ବୁଧ.","ଗୁରୁ.","ଶୁକ୍ର.","ଶନି."],
+				namesShort: ["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"]
+			},
+			months: {
+				names: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""],
+				namesAbbr: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""]
+			},
+			eras: [{"name":"ଖ୍ରୀଷ୍ଟାବ୍ଦ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or.js
new file mode 100644
index 0000000..55581bd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.or.js
@@ -0,0 +1,70 @@
+/*
+ * Globalize Culture or
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "or", "default", {
+	name: "or",
+	englishName: "Oriya",
+	nativeName: "ଓଡ଼ିଆ",
+	language: "or",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ଟ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],
+				namesAbbr: ["ରବି.","ସୋମ.","ମଙ୍ଗଳ.","ବୁଧ.","ଗୁରୁ.","ଶୁକ୍ର.","ଶନି."],
+				namesShort: ["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"]
+			},
+			months: {
+				names: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""],
+				namesAbbr: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""]
+			},
+			eras: [{"name":"ଖ୍ରୀଷ୍ଟାବ୍ଦ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa-IN.js
new file mode 100644
index 0000000..fa6672a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture pa-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pa-IN", "default", {
+	name: "pa-IN",
+	englishName: "Punjabi (India)",
+	nativeName: "ਪੰਜਾਬੀ (ਭਾਰਤ)",
+	language: "pa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ਰੁ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],
+				namesAbbr: ["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁੱਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨਿੱਚਰ."],
+				namesShort: ["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"]
+			},
+			months: {
+				names: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""],
+				namesAbbr: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""]
+			},
+			AM: ["ਸਵੇਰ","ਸਵੇਰ","ਸਵੇਰ"],
+			PM: ["ਸ਼ਾਮ","ਸ਼ਾਮ","ਸ਼ਾਮ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy dddd",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "dd MMMM yyyy dddd tt hh:mm",
+				F: "dd MMMM yyyy dddd tt hh:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa.js
new file mode 100644
index 0000000..f0f1bd5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pa.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture pa
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pa", "default", {
+	name: "pa",
+	englishName: "Punjabi",
+	nativeName: "ਪੰਜਾਬੀ",
+	language: "pa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ਰੁ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],
+				namesAbbr: ["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁੱਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨਿੱਚਰ."],
+				namesShort: ["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"]
+			},
+			months: {
+				names: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""],
+				namesAbbr: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""]
+			},
+			AM: ["ਸਵੇਰ","ਸਵੇਰ","ਸਵੇਰ"],
+			PM: ["ਸ਼ਾਮ","ਸ਼ਾਮ","ਸ਼ਾਮ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy dddd",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "dd MMMM yyyy dddd tt hh:mm",
+				F: "dd MMMM yyyy dddd tt hh:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl-PL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl-PL.js
new file mode 100644
index 0000000..59b4330
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl-PL.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture pl-PL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pl-PL", "default", {
+	name: "pl-PL",
+	englishName: "Polish (Poland)",
+	nativeName: "polski (Polska)",
+	language: "pl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nie jest liczbą",
+		negativeInfinity: "-nieskończoność",
+		positiveInfinity: "+nieskończoność",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "zł"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],
+				namesAbbr: ["N","Pn","Wt","Śr","Cz","Pt","So"],
+				namesShort: ["N","Pn","Wt","Śr","Cz","Pt","So"]
+			},
+			months: {
+				names: ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			monthsGenitive: {
+				names: ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl.js
new file mode 100644
index 0000000..5b09eca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pl.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture pl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pl", "default", {
+	name: "pl",
+	englishName: "Polish",
+	nativeName: "polski",
+	language: "pl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nie jest liczbą",
+		negativeInfinity: "-nieskończoność",
+		positiveInfinity: "+nieskończoność",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "zł"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],
+				namesAbbr: ["N","Pn","Wt","Śr","Cz","Pt","So"],
+				namesShort: ["N","Pn","Wt","Śr","Cz","Pt","So"]
+			},
+			months: {
+				names: ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			monthsGenitive: {
+				names: ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs-AF.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs-AF.js
new file mode 100644
index 0000000..d487690
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs-AF.js
@@ -0,0 +1,174 @@
+/*
+ * Globalize Culture prs-AF
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "prs-AF", "default", {
+	name: "prs-AF",
+	englishName: "Dari (Afghanistan)",
+	nativeName: "درى (افغانستان)",
+	language: "prs",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 5,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 5,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs.js
new file mode 100644
index 0000000..5111acc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.prs.js
@@ -0,0 +1,174 @@
+/*
+ * Globalize Culture prs
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "prs", "default", {
+	name: "prs",
+	englishName: "Dari",
+	nativeName: "درى",
+	language: "prs",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 5,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 5,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps-AF.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps-AF.js
new file mode 100644
index 0000000..15e57f0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps-AF.js
@@ -0,0 +1,176 @@
+/*
+ * Globalize Culture ps-AF
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ps-AF", "default", {
+	name: "ps-AF",
+	englishName: "Pashto (Afghanistan)",
+	nativeName: "پښتو (افغانستان)",
+	language: "ps",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": "،",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": "،",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			",": "٬",
+			".": "٫",
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښزمرى","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښ","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps.js
new file mode 100644
index 0000000..73e4c93
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ps.js
@@ -0,0 +1,176 @@
+/*
+ * Globalize Culture ps
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ps", "default", {
+	name: "ps",
+	englishName: "Pashto",
+	nativeName: "پښتو",
+	language: "ps",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": "،",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": "،",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			",": "٬",
+			".": "٫",
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښزمرى","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښ","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-BR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-BR.js
new file mode 100644
index 0000000..ccbb632
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-BR.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture pt-BR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pt-BR", "default", {
+	name: "pt-BR",
+	englishName: "Portuguese (Brazil)",
+	nativeName: "Português (Brasil)",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "R$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro",""],
+				namesAbbr: ["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-PT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-PT.js
new file mode 100644
index 0000000..d521e23
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt-PT.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture pt-PT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pt-PT", "default", {
+	name: "pt-PT",
+	englishName: "Portuguese (Portugal)",
+	nativeName: "português (Portugal)",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro",""],
+				namesAbbr: ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "d/M",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt.js
new file mode 100644
index 0000000..5a83321
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.pt.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture pt
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "pt", "default", {
+	name: "pt",
+	englishName: "Portuguese",
+	nativeName: "Português",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "R$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro",""],
+				namesAbbr: ["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut-GT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut-GT.js
new file mode 100644
index 0000000..93bcffb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut-GT.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture qut-GT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "qut-GT", "default", {
+	name: "qut-GT",
+	englishName: "K'iche (Guatemala)",
+	nativeName: "K'iche (Guatemala)",
+	language: "qut",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["juq'ij","kaq'ij","oxq'ij","kajq'ij","joq'ij","waqq'ij","wuqq'ij"],
+				namesAbbr: ["juq","kaq","oxq","kajq","joq","waqq","wuqq"],
+				namesShort: ["ju","ka","ox","ka","jo","wa","wu"]
+			},
+			months: {
+				names: ["nab'e ik'","ukab' ik'","rox ik'","ukaj ik'","uro' ik'","uwaq ik'","uwuq ik'","uwajxaq ik'","ub'elej ik'","ulaj ik'","ujulaj ik'","ukab'laj ik'",""],
+				namesAbbr: ["nab'e","ukab","rox","ukaj","uro","uwaq","uwuq","uwajxaq","ub'elej","ulaj","ujulaj","ukab'laj",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut.js
new file mode 100644
index 0000000..5d5790b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.qut.js
@@ -0,0 +1,69 @@
+/*
+ * Globalize Culture qut
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "qut", "default", {
+	name: "qut",
+	englishName: "K'iche",
+	nativeName: "K'iche",
+	language: "qut",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["juq'ij","kaq'ij","oxq'ij","kajq'ij","joq'ij","waqq'ij","wuqq'ij"],
+				namesAbbr: ["juq","kaq","oxq","kajq","joq","waqq","wuqq"],
+				namesShort: ["ju","ka","ox","ka","jo","wa","wu"]
+			},
+			months: {
+				names: ["nab'e ik'","ukab' ik'","rox ik'","ukaj ik'","uro' ik'","uwaq ik'","uwuq ik'","uwajxaq ik'","ub'elej ik'","ulaj ik'","ujulaj ik'","ukab'laj ik'",""],
+				namesAbbr: ["nab'e","ukab","rox","ukaj","uro","uwaq","uwuq","uwajxaq","ub'elej","ulaj","ujulaj","ukab'laj",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-BO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-BO.js
new file mode 100644
index 0000000..313a9ad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-BO.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture quz-BO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "quz-BO", "default", {
+	name: "quz-BO",
+	englishName: "Quechua (Bolivia)",
+	nativeName: "runasimi (Qullasuyu)",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-EC.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-EC.js
new file mode 100644
index 0000000..0b75b40
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-EC.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture quz-EC
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "quz-EC", "default", {
+	name: "quz-EC",
+	englishName: "Quechua (Ecuador)",
+	nativeName: "runasimi (Ecuador)",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-PE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-PE.js
new file mode 100644
index 0000000..5187503
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz-PE.js
@@ -0,0 +1,68 @@
+/*
+ * Globalize Culture quz-PE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "quz-PE", "default", {
+	name: "quz-PE",
+	englishName: "Quechua (Peru)",
+	nativeName: "runasimi (Piruw)",
+	language: "quz",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			symbol: "S/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz.js
new file mode 100644
index 0000000..fef7426
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.quz.js
@@ -0,0 +1,74 @@
+/*
+ * Globalize Culture quz
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "quz", "default", {
+	name: "quz",
+	englishName: "Quechua",
+	nativeName: "runasimi",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm-CH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm-CH.js
new file mode 100644
index 0000000..9191f4b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm-CH.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture rm-CH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "rm-CH", "default", {
+	name: "rm-CH",
+	englishName: "Romansh (Switzerland)",
+	nativeName: "Rumantsch (Svizra)",
+	language: "rm",
+	numberFormat: {
+		",": "'",
+		NaN: "betg def.",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "+infinit",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],
+				namesAbbr: ["du","gli","ma","me","gie","ve","so"],
+				namesShort: ["du","gli","ma","me","gie","ve","so"]
+			},
+			months: {
+				names: ["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december",""],
+				namesAbbr: ["schan","favr","mars","avr","matg","zercl","fan","avust","sett","oct","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"s. Cr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d MMMM yyyy HH:mm",
+				F: "dddd, d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm.js
new file mode 100644
index 0000000..0cbe7d3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rm.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture rm
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "rm", "default", {
+	name: "rm",
+	englishName: "Romansh",
+	nativeName: "Rumantsch",
+	language: "rm",
+	numberFormat: {
+		",": "'",
+		NaN: "betg def.",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "+infinit",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],
+				namesAbbr: ["du","gli","ma","me","gie","ve","so"],
+				namesShort: ["du","gli","ma","me","gie","ve","so"]
+			},
+			months: {
+				names: ["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december",""],
+				namesAbbr: ["schan","favr","mars","avr","matg","zercl","fan","avust","sett","oct","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"s. Cr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d MMMM yyyy HH:mm",
+				F: "dddd, d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro-RO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro-RO.js
new file mode 100644
index 0000000..e36fe53
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro-RO.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture ro-RO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ro-RO", "default", {
+	name: "ro-RO",
+	englishName: "Romanian (Romania)",
+	nativeName: "română (România)",
+	language: "ro",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "lei"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],
+				namesAbbr: ["D","L","Ma","Mi","J","V","S"],
+				namesShort: ["D","L","Ma","Mi","J","V","S"]
+			},
+			months: {
+				names: ["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie",""],
+				namesAbbr: ["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro.js
new file mode 100644
index 0000000..9cbe26a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ro.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture ro
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ro", "default", {
+	name: "ro",
+	englishName: "Romanian",
+	nativeName: "română",
+	language: "ro",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "lei"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],
+				namesAbbr: ["D","L","Ma","Mi","J","V","S"],
+				namesShort: ["D","L","Ma","Mi","J","V","S"]
+			},
+			months: {
+				names: ["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie",""],
+				namesAbbr: ["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru-RU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru-RU.js
new file mode 100644
index 0000000..c44493e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru-RU.js
@@ -0,0 +1,82 @@
+/*
+ * Globalize Culture ru-RU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ru-RU", "default", {
+	name: "ru-RU",
+	englishName: "Russian (Russia)",
+	nativeName: "русский (Россия)",
+	language: "ru",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],
+				namesAbbr: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			monthsGenitive: {
+				names: ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'г.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'г.' H:mm",
+				F: "d MMMM yyyy 'г.' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru.js
new file mode 100644
index 0000000..e3f4750
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ru.js
@@ -0,0 +1,82 @@
+/*
+ * Globalize Culture ru
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ru", "default", {
+	name: "ru",
+	englishName: "Russian",
+	nativeName: "русский",
+	language: "ru",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],
+				namesAbbr: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			monthsGenitive: {
+				names: ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'г.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'г.' H:mm",
+				F: "d MMMM yyyy 'г.' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw-RW.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw-RW.js
new file mode 100644
index 0000000..7aa4cbc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw-RW.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture rw-RW
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "rw-RW", "default", {
+	name: "rw-RW",
+	englishName: "Kinyarwanda (Rwanda)",
+	nativeName: "Kinyarwanda (Rwanda)",
+	language: "rw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "RWF"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Ku cyumweru"],
+				namesAbbr: ["mbe.","kab.","gat.","kan.","gat.","gat.","cyu."],
+				namesShort: ["mb","ka","ga","ka","ga","ga","cy"]
+			},
+			months: {
+				names: ["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza",""],
+				namesAbbr: ["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukwa","Ugu","Uku",""]
+			},
+			AM: ["saa moya z.m.","saa moya z.m.","SAA MOYA Z.M."],
+			PM: ["saa moya z.n.","saa moya z.n.","SAA MOYA Z.N."],
+			eras: [{"name":"AD","start":null,"offset":0}]
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw.js
new file mode 100644
index 0000000..c86c2e9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.rw.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture rw
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "rw", "default", {
+	name: "rw",
+	englishName: "Kinyarwanda",
+	nativeName: "Kinyarwanda",
+	language: "rw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "RWF"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Ku cyumweru"],
+				namesAbbr: ["mbe.","kab.","gat.","kan.","gat.","gat.","cyu."],
+				namesShort: ["mb","ka","ga","ka","ga","ga","cy"]
+			},
+			months: {
+				names: ["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza",""],
+				namesAbbr: ["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukwa","Ugu","Uku",""]
+			},
+			AM: ["saa moya z.m.","saa moya z.m.","SAA MOYA Z.M."],
+			PM: ["saa moya z.n.","saa moya z.n.","SAA MOYA Z.N."],
+			eras: [{"name":"AD","start":null,"offset":0}]
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa-IN.js
new file mode 100644
index 0000000..5408ab5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa-IN.js
@@ -0,0 +1,71 @@
+/*
+ * Globalize Culture sa-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sa-IN", "default", {
+	name: "sa-IN",
+	englishName: "Sanskrit (India)",
+	nativeName: "संस्कृत (भारतम्)",
+	language: "sa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesAbbr: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa.js
new file mode 100644
index 0000000..3fb8cea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sa.js
@@ -0,0 +1,71 @@
+/*
+ * Globalize Culture sa
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sa", "default", {
+	name: "sa",
+	englishName: "Sanskrit",
+	nativeName: "संस्कृत",
+	language: "sa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesAbbr: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah-RU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah-RU.js
new file mode 100644
index 0000000..17f487f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah-RU.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture sah-RU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sah-RU", "default", {
+	name: "sah-RU",
+	englishName: "Yakut (Russia)",
+	nativeName: "саха (Россия)",
+	language: "sah",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NAN",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "с."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],
+				namesAbbr: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"],
+				namesShort: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"]
+			},
+			months: {
+				names: ["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйа","Бэс ыйа","От ыйа","Атырдьах ыйа","Балаҕан ыйа","Алтынньы","Сэтинньи","Ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			monthsGenitive: {
+				names: ["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "MM.dd.yyyy",
+				D: "MMMM d yyyy 'с.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d yyyy 'с.' H:mm",
+				F: "MMMM d yyyy 'с.' H:mm:ss",
+				Y: "MMMM yyyy 'с.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah.js
new file mode 100644
index 0000000..ff1b18e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sah.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture sah
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sah", "default", {
+	name: "sah",
+	englishName: "Yakut",
+	nativeName: "саха",
+	language: "sah",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NAN",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "с."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],
+				namesAbbr: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"],
+				namesShort: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"]
+			},
+			months: {
+				names: ["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйа","Бэс ыйа","От ыйа","Атырдьах ыйа","Балаҕан ыйа","Алтынньы","Сэтинньи","Ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			monthsGenitive: {
+				names: ["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "MM.dd.yyyy",
+				D: "MMMM d yyyy 'с.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d yyyy 'с.' H:mm",
+				F: "MMMM d yyyy 'с.' H:mm:ss",
+				Y: "MMMM yyyy 'с.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-FI.js
new file mode 100644
index 0000000..424df67
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-FI.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture se-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "se-FI", "default", {
+	name: "se-FI",
+	englishName: "Sami, Northern (Finland)",
+	nativeName: "davvisámegiella (Suopma)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. b. 'yyyy H:mm",
+				F: "MMMM d'. b. 'yyyy H:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-NO.js
new file mode 100644
index 0000000..ccdb630
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-NO.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture se-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "se-NO", "default", {
+	name: "se-NO",
+	englishName: "Sami, Northern (Norway)",
+	nativeName: "davvisámegiella (Norga)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-SE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-SE.js
new file mode 100644
index 0000000..b085955
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se-SE.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture se-SE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "se-SE", "default", {
+	name: "se-SE",
+	englishName: "Sami, Northern (Sweden)",
+	nativeName: "davvisámegiella (Ruoŧŧa)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","mánnodat","disdat","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","mán","dis","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se.js
new file mode 100644
index 0000000..c80207b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.se.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture se
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "se", "default", {
+	name: "se",
+	englishName: "Sami (Northern)",
+	nativeName: "davvisámegiella",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si-LK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si-LK.js
new file mode 100644
index 0000000..9a114ed
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si-LK.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture si-LK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "si-LK", "default", {
+	name: "si-LK",
+	englishName: "Sinhala (Sri Lanka)",
+	nativeName: "සිංහල (ශ්‍රී ලංකා)",
+	language: "si",
+	numberFormat: {
+		groupSizes: [3,2],
+		negativeInfinity: "-අනන්තය",
+		positiveInfinity: "අනන්තය",
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "රු."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],
+				namesAbbr: ["ඉරිදා","සඳුදා","කුජදා","බුදදා","ගුරුදා","කිවිදා","ශනිදා"],
+				namesShort: ["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"]
+			},
+			months: {
+				names: ["ජනවාරි","පෙබරවාරි","මාර්තු","අ‌ප්‍රේල්","මැයි","ජූනි","ජූලි","අ‌ගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්",""],
+				namesAbbr: ["ජන.","පෙබ.","මාර්තු.","අප්‍රේල්.","මැයි.","ජූනි.","ජූලි.","අගෝ.","සැප්.","ඔක්.","නොවැ.","දෙසැ.",""]
+			},
+			AM: ["පෙ.ව.","පෙ.ව.","පෙ.ව."],
+			PM: ["ප.ව.","ප.ව.","ප.ව."],
+			eras: [{"name":"ක්‍රි.ව.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy MMMM' මස 'dd' වැනිදා 'dddd",
+				f: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm tt",
+				F: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm:ss tt",
+				Y: "yyyy MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si.js
new file mode 100644
index 0000000..724dc61
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.si.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture si
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "si", "default", {
+	name: "si",
+	englishName: "Sinhala",
+	nativeName: "සිංහල",
+	language: "si",
+	numberFormat: {
+		groupSizes: [3,2],
+		negativeInfinity: "-අනන්තය",
+		positiveInfinity: "අනන්තය",
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "රු."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],
+				namesAbbr: ["ඉරිදා","සඳුදා","කුජදා","බුදදා","ගුරුදා","කිවිදා","ශනිදා"],
+				namesShort: ["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"]
+			},
+			months: {
+				names: ["ජනවාරි","පෙබරවාරි","මාර්තු","අ‌ප්‍රේල්","මැයි","ජූනි","ජූලි","අ‌ගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්",""],
+				namesAbbr: ["ජන.","පෙබ.","මාර්තු.","අප්‍රේල්.","මැයි.","ජූනි.","ජූලි.","අගෝ.","සැප්.","ඔක්.","නොවැ.","දෙසැ.",""]
+			},
+			AM: ["පෙ.ව.","පෙ.ව.","පෙ.ව."],
+			PM: ["ප.ව.","ප.ව.","ප.ව."],
+			eras: [{"name":"ක්‍රි.ව.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy MMMM' මස 'dd' වැනිදා 'dddd",
+				f: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm tt",
+				F: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm:ss tt",
+				Y: "yyyy MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk-SK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk-SK.js
new file mode 100644
index 0000000..6bc1656
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk-SK.js
@@ -0,0 +1,85 @@
+/*
+ * Globalize Culture sk-SK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sk-SK", "default", {
+	name: "sk-SK",
+	englishName: "Slovak (Slovakia)",
+	nativeName: "slovenčina (Slovenská republika)",
+	language: "sk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Nie je číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],
+				namesAbbr: ["ne","po","ut","st","št","pi","so"],
+				namesShort: ["ne","po","ut","st","št","pi","so"]
+			},
+			months: {
+				names: ["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk.js
new file mode 100644
index 0000000..0fd4334
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sk.js
@@ -0,0 +1,85 @@
+/*
+ * Globalize Culture sk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sk", "default", {
+	name: "sk",
+	englishName: "Slovak",
+	nativeName: "slovenčina",
+	language: "sk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Nie je číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],
+				namesAbbr: ["ne","po","ut","st","št","pi","so"],
+				namesShort: ["ne","po","ut","st","št","pi","so"]
+			},
+			months: {
+				names: ["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl-SI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl-SI.js
new file mode 100644
index 0000000..9cfb1f9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl-SI.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture sl-SI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sl-SI", "default", {
+	name: "sl-SI",
+	englishName: "Slovenian (Slovenia)",
+	nativeName: "slovenski (Slovenija)",
+	language: "sl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-neskončnost",
+		positiveInfinity: "neskončnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],
+				namesAbbr: ["ned","pon","tor","sre","čet","pet","sob"],
+				namesShort: ["ne","po","to","sr","če","pe","so"]
+			},
+			months: {
+				names: ["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl.js
new file mode 100644
index 0000000..ebfa588
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sl.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture sl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sl", "default", {
+	name: "sl",
+	englishName: "Slovenian",
+	nativeName: "slovenski",
+	language: "sl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-neskončnost",
+		positiveInfinity: "neskončnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],
+				namesAbbr: ["ned","pon","tor","sre","čet","pet","sob"],
+				namesShort: ["ne","po","to","sr","če","pe","so"]
+			},
+			months: {
+				names: ["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-NO.js
new file mode 100644
index 0000000..80879ff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-NO.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture sma-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sma-NO", "default", {
+	name: "sma-NO",
+	englishName: "Sami, Southern (Norway)",
+	nativeName: "åarjelsaemiengiele (Nöörje)",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-SE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-SE.js
new file mode 100644
index 0000000..36747ff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma-SE.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sma-SE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sma-SE", "default", {
+	name: "sma-SE",
+	englishName: "Sami, Southern (Sweden)",
+	nativeName: "åarjelsaemiengiele (Sveerje)",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma.js
new file mode 100644
index 0000000..284bf37
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sma.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sma
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sma", "default", {
+	name: "sma",
+	englishName: "Sami (Southern)",
+	nativeName: "åarjelsaemiengiele",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-NO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-NO.js
new file mode 100644
index 0000000..d6556e5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-NO.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture smj-NO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smj-NO", "default", {
+	name: "smj-NO",
+	englishName: "Sami, Lule (Norway)",
+	nativeName: "julevusámegiella (Vuodna)",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sådnåbiejvve","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["såd","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-SE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-SE.js
new file mode 100644
index 0000000..4b3f8a2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj-SE.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture smj-SE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smj-SE", "default", {
+	name: "smj-SE",
+	englishName: "Sami, Lule (Sweden)",
+	nativeName: "julevusámegiella (Svierik)",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["ájl","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["á","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj.js
new file mode 100644
index 0000000..fe1e50f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smj.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture smj
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smj", "default", {
+	name: "smj",
+	englishName: "Sami (Lule)",
+	nativeName: "julevusámegiella",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["ájl","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["á","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn-FI.js
new file mode 100644
index 0000000..8226968
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn-FI.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture smn-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smn-FI", "default", {
+	name: "smn-FI",
+	englishName: "Sami, Inari (Finland)",
+	nativeName: "sämikielâ (Suomâ)",
+	language: "smn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],
+				namesAbbr: ["pa","vu","ma","ko","tu","vá","lá"],
+				namesShort: ["p","v","m","k","t","v","l"]
+			},
+			months: {
+				names: ["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu",""],
+				namesAbbr: ["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn.js
new file mode 100644
index 0000000..ce7bcf8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.smn.js
@@ -0,0 +1,76 @@
+/*
+ * Globalize Culture smn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "smn", "default", {
+	name: "smn",
+	englishName: "Sami (Inari)",
+	nativeName: "sämikielâ",
+	language: "smn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],
+				namesAbbr: ["pa","vu","ma","ko","tu","vá","lá"],
+				namesShort: ["p","v","m","k","t","v","l"]
+			},
+			months: {
+				names: ["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu",""],
+				namesAbbr: ["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms-FI.js
new file mode 100644
index 0000000..441c2f3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms-FI.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sms-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sms-FI", "default", {
+	name: "sms-FI",
+	englishName: "Sami, Skolt (Finland)",
+	nativeName: "sääm´ǩiõll (Lää´ddjânnam)",
+	language: "sms",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],
+				namesAbbr: ["pâ","vu","mâ","se","ne","pi","su"],
+				namesShort: ["p","v","m","s","n","p","s"]
+			},
+			months: {
+				names: ["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			monthsGenitive: {
+				names: ["ođđee´jjmannu","tä´lvvmannu","pâ´zzlâšttammannu","njuhččmannu","vue´ssmannu","ǩie´ssmannu","suei´nnmannu","på´rǧǧmannu","čõhččmannu","kålggmannu","skamm´mannu","rosttovmannu",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms.js
new file mode 100644
index 0000000..990e43f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sms.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sms
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sms", "default", {
+	name: "sms",
+	englishName: "Sami (Skolt)",
+	nativeName: "sääm´ǩiõll",
+	language: "sms",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],
+				namesAbbr: ["pâ","vu","mâ","se","ne","pi","su"],
+				namesShort: ["p","v","m","s","n","p","s"]
+			},
+			months: {
+				names: ["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			monthsGenitive: {
+				names: ["ođđee´jjmannu","tä´lvvmannu","pâ´zzlâšttammannu","njuhččmannu","vue´ssmannu","ǩie´ssmannu","suei´nnmannu","på´rǧǧmannu","čõhččmannu","kålggmannu","skamm´mannu","rosttovmannu",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq-AL.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq-AL.js
new file mode 100644
index 0000000..f90be76
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq-AL.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture sq-AL
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sq-AL", "default", {
+	name: "sq-AL",
+	englishName: "Albanian (Albania)",
+	nativeName: "shqipe (Shqipëria)",
+	language: "sq",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": ".",
+			".": ",",
+			symbol: "Lek"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],
+				namesAbbr: ["Die","Hën","Mar","Mër","Enj","Pre","Sht"],
+				namesShort: ["Di","Hë","Ma","Më","En","Pr","Sh"]
+			},
+			months: {
+				names: ["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor",""],
+				namesAbbr: ["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj",""]
+			},
+			AM: ["PD","pd","PD"],
+			PM: ["MD","md","MD"],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy-MM-dd",
+				t: "h:mm.tt",
+				T: "h:mm:ss.tt",
+				f: "yyyy-MM-dd h:mm.tt",
+				F: "yyyy-MM-dd h:mm:ss.tt",
+				Y: "yyyy-MM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq.js
new file mode 100644
index 0000000..0e9c6b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sq.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture sq
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sq", "default", {
+	name: "sq",
+	englishName: "Albanian",
+	nativeName: "shqipe",
+	language: "sq",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": ".",
+			".": ",",
+			symbol: "Lek"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],
+				namesAbbr: ["Die","Hën","Mar","Mër","Enj","Pre","Sht"],
+				namesShort: ["Di","Hë","Ma","Më","En","Pr","Sh"]
+			},
+			months: {
+				names: ["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor",""],
+				namesAbbr: ["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj",""]
+			},
+			AM: ["PD","pd","PD"],
+			PM: ["MD","md","MD"],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy-MM-dd",
+				t: "h:mm.tt",
+				T: "h:mm:ss.tt",
+				f: "yyyy-MM-dd h:mm.tt",
+				F: "yyyy-MM-dd h:mm:ss.tt",
+				Y: "yyyy-MM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-BA.js
new file mode 100644
index 0000000..ea6f27a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-BA.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture sr-Cyrl-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl-BA", "default", {
+	name: "sr-Cyrl-BA",
+	englishName: "Serbian (Cyrillic, Bosnia and Herzegovina)",
+	nativeName: "српски (Босна и Херцеговина)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-CS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-CS.js
new file mode 100644
index 0000000..4a1ad32
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-CS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Cyrl-CS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl-CS", "default", {
+	name: "sr-Cyrl-CS",
+	englishName: "Serbian (Cyrillic, Serbia and Montenegro (Former))",
+	nativeName: "српски (Србија и Црна Гора (Претходно))",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-ME.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-ME.js
new file mode 100644
index 0000000..d791952
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-ME.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Cyrl-ME
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl-ME", "default", {
+	name: "sr-Cyrl-ME",
+	englishName: "Serbian (Cyrillic, Montenegro)",
+	nativeName: "српски (Црна Гора)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-RS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-RS.js
new file mode 100644
index 0000000..9e5367d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl-RS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Cyrl-RS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl-RS", "default", {
+	name: "sr-Cyrl-RS",
+	englishName: "Serbian (Cyrillic, Serbia)",
+	nativeName: "српски (Србија)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl.js
new file mode 100644
index 0000000..cde93e1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Cyrl.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Cyrl", "default", {
+	name: "sr-Cyrl",
+	englishName: "Serbian (Cyrillic)",
+	nativeName: "српски",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-BA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-BA.js
new file mode 100644
index 0000000..ba99cbb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-BA.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture sr-Latn-BA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn-BA", "default", {
+	name: "sr-Latn-BA",
+	englishName: "Serbian (Latin, Bosnia and Herzegovina)",
+	nativeName: "srpski (Bosna i Hercegovina)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-CS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-CS.js
new file mode 100644
index 0000000..02436cb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-CS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Latn-CS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn-CS", "default", {
+	name: "sr-Latn-CS",
+	englishName: "Serbian (Latin, Serbia and Montenegro (Former))",
+	nativeName: "srpski (Srbija i Crna Gora (Prethodno))",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-ME.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-ME.js
new file mode 100644
index 0000000..39ac523
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-ME.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Latn-ME
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn-ME", "default", {
+	name: "sr-Latn-ME",
+	englishName: "Serbian (Latin, Montenegro)",
+	nativeName: "srpski (Crna Gora)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-RS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-RS.js
new file mode 100644
index 0000000..369bcc7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn-RS.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Latn-RS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn-RS", "default", {
+	name: "sr-Latn-RS",
+	englishName: "Serbian (Latin, Serbia)",
+	nativeName: "srpski (Srbija)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn.js
new file mode 100644
index 0000000..ae10f74
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr-Latn.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr-Latn", "default", {
+	name: "sr-Latn",
+	englishName: "Serbian (Latin)",
+	nativeName: "srpski",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr.js
new file mode 100644
index 0000000..b74cd89
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sr.js
@@ -0,0 +1,80 @@
+/*
+ * Globalize Culture sr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sr", "default", {
+	name: "sr",
+	englishName: "Serbian",
+	nativeName: "srpski",
+	language: "sr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-FI.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-FI.js
new file mode 100644
index 0000000..74aeca9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-FI.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture sv-FI
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sv-FI", "default", {
+	name: "sv-FI",
+	englishName: "Swedish (Finland)",
+	nativeName: "svenska (Finland)",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-SE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-SE.js
new file mode 100644
index 0000000..85e5a20
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv-SE.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture sv-SE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sv-SE", "default", {
+	name: "sv-SE",
+	englishName: "Swedish (Sweden)",
+	nativeName: "svenska (Sverige)",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv.js
new file mode 100644
index 0000000..313eaf7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sv.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture sv
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sv", "default", {
+	name: "sv",
+	englishName: "Swedish",
+	nativeName: "svenska",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw-KE.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw-KE.js
new file mode 100644
index 0000000..8df3960
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw-KE.js
@@ -0,0 +1,53 @@
+/*
+ * Globalize Culture sw-KE
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sw-KE", "default", {
+	name: "sw-KE",
+	englishName: "Kiswahili (Kenya)",
+	nativeName: "Kiswahili (Kenya)",
+	language: "sw",
+	numberFormat: {
+		currency: {
+			symbol: "S"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],
+				namesAbbr: ["Jumap.","Jumat.","Juman.","Jumat.","Alh.","Iju.","Jumam."],
+				namesShort: ["P","T","N","T","A","I","M"]
+			},
+			months: {
+				names: ["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Decemba",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec",""]
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw.js
new file mode 100644
index 0000000..c5cfe84
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.sw.js
@@ -0,0 +1,53 @@
+/*
+ * Globalize Culture sw
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "sw", "default", {
+	name: "sw",
+	englishName: "Kiswahili",
+	nativeName: "Kiswahili",
+	language: "sw",
+	numberFormat: {
+		currency: {
+			symbol: "S"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],
+				namesAbbr: ["Jumap.","Jumat.","Juman.","Jumat.","Alh.","Iju.","Jumam."],
+				namesShort: ["P","T","N","T","A","I","M"]
+			},
+			months: {
+				names: ["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Decemba",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec",""]
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr-SY.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr-SY.js
new file mode 100644
index 0000000..1ef86ec
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr-SY.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture syr-SY
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "syr-SY", "default", {
+	name: "syr-SY",
+	englishName: "Syriac (Syria)",
+	nativeName: "ܣܘܪܝܝܐ (سوريا)",
+	language: "syr",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],
+				namesAbbr: ["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],
+				namesShort: ["ܐ","ܒ","ܓ","ܕ","ܗ","ܥ","ܫ"]
+			},
+			months: {
+				names: ["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ",""],
+				namesAbbr: ["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ",""]
+			},
+			AM: ["ܩ.ܛ","ܩ.ܛ","ܩ.ܛ"],
+			PM: ["ܒ.ܛ","ܒ.ܛ","ܒ.ܛ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr.js
new file mode 100644
index 0000000..74ea704
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.syr.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture syr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "syr", "default", {
+	name: "syr",
+	englishName: "Syriac",
+	nativeName: "ܣܘܪܝܝܐ",
+	language: "syr",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],
+				namesAbbr: ["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],
+				namesShort: ["ܐ","ܒ","ܓ","ܕ","ܗ","ܥ","ܫ"]
+			},
+			months: {
+				names: ["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ",""],
+				namesAbbr: ["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ",""]
+			},
+			AM: ["ܩ.ܛ","ܩ.ܛ","ܩ.ܛ"],
+			PM: ["ܒ.ܛ","ܒ.ܛ","ܒ.ܛ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta-IN.js
new file mode 100644
index 0000000..63b16fe
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta-IN.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture ta-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ta-IN", "default", {
+	name: "ta-IN",
+	englishName: "Tamil (India)",
+	nativeName: "தமிழ் (இந்தியா)",
+	language: "ta",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ரூ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ஞாயிற்றுக்கிழமை","திங்கள்கிழமை","செவ்வாய்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],
+				namesAbbr: ["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],
+				namesShort: ["ஞா","தி","செ","பு","வி","வெ","ச"]
+			},
+			months: {
+				names: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""],
+				namesAbbr: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""]
+			},
+			AM: ["காலை","காலை","காலை"],
+			PM: ["மாலை","மாலை","மாலை"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta.js
new file mode 100644
index 0000000..e67c57f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ta.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture ta
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ta", "default", {
+	name: "ta",
+	englishName: "Tamil",
+	nativeName: "தமிழ்",
+	language: "ta",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ரூ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ஞாயிற்றுக்கிழமை","திங்கள்கிழமை","செவ்வாய்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],
+				namesAbbr: ["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],
+				namesShort: ["ஞா","தி","செ","பு","வி","வெ","ச"]
+			},
+			months: {
+				names: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""],
+				namesAbbr: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""]
+			},
+			AM: ["காலை","காலை","காலை"],
+			PM: ["மாலை","மாலை","மாலை"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te-IN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te-IN.js
new file mode 100644
index 0000000..b1b92ee
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te-IN.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture te-IN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "te-IN", "default", {
+	name: "te-IN",
+	englishName: "Telugu (India)",
+	nativeName: "తెలుగు (భారత దేశం)",
+	language: "te",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "రూ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],
+				namesAbbr: ["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],
+				namesShort: ["ఆ","సో","మం","బు","గు","శు","శ"]
+			},
+			months: {
+				names: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""],
+				namesAbbr: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""]
+			},
+			AM: ["పూర్వాహ్న","పూర్వాహ్న","పూర్వాహ్న"],
+			PM: ["అపరాహ్న","అపరాహ్న","అపరాహ్న"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te.js
new file mode 100644
index 0000000..be5becb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.te.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture te
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "te", "default", {
+	name: "te",
+	englishName: "Telugu",
+	nativeName: "తెలుగు",
+	language: "te",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "రూ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],
+				namesAbbr: ["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],
+				namesShort: ["ఆ","సో","మం","బు","గు","శు","శ"]
+			},
+			months: {
+				names: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""],
+				namesAbbr: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""]
+			},
+			AM: ["పూర్వాహ్న","పూర్వాహ్న","పూర్వాహ్న"],
+			PM: ["అపరాహ్న","అపరాహ్న","అపరాహ్న"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl-TJ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl-TJ.js
new file mode 100644
index 0000000..3f0f3eb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl-TJ.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture tg-Cyrl-TJ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tg-Cyrl-TJ", "default", {
+	name: "tg-Cyrl-TJ",
+	englishName: "Tajik (Cyrillic, Tajikistan)",
+	nativeName: "Тоҷикӣ (Тоҷикистон)",
+	language: "tg-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl.js
new file mode 100644
index 0000000..30fa290
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg-Cyrl.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture tg-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tg-Cyrl", "default", {
+	name: "tg-Cyrl",
+	englishName: "Tajik (Cyrillic)",
+	nativeName: "Тоҷикӣ",
+	language: "tg-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg.js
new file mode 100644
index 0000000..df4f26b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tg.js
@@ -0,0 +1,84 @@
+/*
+ * Globalize Culture tg
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tg", "default", {
+	name: "tg",
+	englishName: "Tajik",
+	nativeName: "Тоҷикӣ",
+	language: "tg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th-TH.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th-TH.js
new file mode 100644
index 0000000..3ab70ab
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th-TH.js
@@ -0,0 +1,90 @@
+/*
+ * Globalize Culture th-TH
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "th-TH", "default", {
+	name: "th-TH",
+	englishName: "Thai (Thailand)",
+	nativeName: "ไทย (ไทย)",
+	language: "th",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "฿"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "ThaiBuddhist",
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			eras: [{"name":"พ.ศ.","start":null,"offset":-543}],
+			twoDigitYearMax: 2572,
+			patterns: {
+				d: "d/M/yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "'วัน'dddd'ที่' d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "'วัน'dddd'ที่' d MMMM yyyy H:mm",
+				F: "'วัน'dddd'ที่' d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th.js
new file mode 100644
index 0000000..1294351
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.th.js
@@ -0,0 +1,90 @@
+/*
+ * Globalize Culture th
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "th", "default", {
+	name: "th",
+	englishName: "Thai",
+	nativeName: "ไทย",
+	language: "th",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "฿"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "ThaiBuddhist",
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			eras: [{"name":"พ.ศ.","start":null,"offset":-543}],
+			twoDigitYearMax: 2572,
+			patterns: {
+				d: "d/M/yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "'วัน'dddd'ที่' d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "'วัน'dddd'ที่' d MMMM yyyy H:mm",
+				F: "'วัน'dddd'ที่' d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk-TM.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk-TM.js
new file mode 100644
index 0000000..8abafa0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk-TM.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture tk-TM
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tk-TM", "default", {
+	name: "tk-TM",
+	englishName: "Turkmen (Turkmenistan)",
+	nativeName: "türkmençe (Türkmenistan)",
+	language: "tk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-üznüksizlik",
+		positiveInfinity: "üznüksizlik",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "m."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],
+				namesAbbr: ["Db","Sb","Çb","Pb","An","Şb","Ýb"],
+				namesShort: ["D","S","Ç","P","A","Ş","Ý"]
+			},
+			months: {
+				names: ["Ýanwar","Fewral","Mart","Aprel","Maý","lýun","lýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr",""],
+				namesAbbr: ["Ýan","Few","Mart","Apr","Maý","lýun","lýul","Awg","Sen","Okt","Not","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "yyyy 'ý.' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'ý.' MMMM d H:mm",
+				F: "yyyy 'ý.' MMMM d H:mm:ss",
+				Y: "yyyy 'ý.' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk.js
new file mode 100644
index 0000000..2727041
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tk.js
@@ -0,0 +1,78 @@
+/*
+ * Globalize Culture tk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tk", "default", {
+	name: "tk",
+	englishName: "Turkmen",
+	nativeName: "türkmençe",
+	language: "tk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-üznüksizlik",
+		positiveInfinity: "üznüksizlik",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "m."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],
+				namesAbbr: ["Db","Sb","Çb","Pb","An","Şb","Ýb"],
+				namesShort: ["D","S","Ç","P","A","Ş","Ý"]
+			},
+			months: {
+				names: ["Ýanwar","Fewral","Mart","Aprel","Maý","lýun","lýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr",""],
+				namesAbbr: ["Ýan","Few","Mart","Apr","Maý","lýun","lýul","Awg","Sen","Okt","Not","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "yyyy 'ý.' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'ý.' MMMM d H:mm",
+				F: "yyyy 'ý.' MMMM d H:mm:ss",
+				Y: "yyyy 'ý.' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn-ZA.js
new file mode 100644
index 0000000..32c861d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn-ZA.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture tn-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tn-ZA", "default", {
+	name: "tn-ZA",
+	englishName: "Setswana (South Africa)",
+	nativeName: "Setswana (Aforika Borwa)",
+	language: "tn",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],
+				namesAbbr: ["Ltp.","Mos.","Lbd.","Lbr.","Lbn.","Lbt.","Lmt."],
+				namesShort: ["Lp","Ms","Lb","Lr","Ln","Lt","Lm"]
+			},
+			months: {
+				names: ["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole",""],
+				namesAbbr: ["Fer.","Tlhak.","Mop.","Mor.","Motsh.","Seet.","Phukw.","Phatw.","Lwets.","Diph.","Ngwan.","Sed.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn.js
new file mode 100644
index 0000000..e331578
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tn.js
@@ -0,0 +1,67 @@
+/*
+ * Globalize Culture tn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tn", "default", {
+	name: "tn",
+	englishName: "Setswana",
+	nativeName: "Setswana",
+	language: "tn",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],
+				namesAbbr: ["Ltp.","Mos.","Lbd.","Lbr.","Lbn.","Lbt.","Lmt."],
+				namesShort: ["Lp","Ms","Lb","Lr","Ln","Lt","Lm"]
+			},
+			months: {
+				names: ["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole",""],
+				namesAbbr: ["Fer.","Tlhak.","Mop.","Mor.","Motsh.","Seet.","Phukw.","Phatw.","Lwets.","Diph.","Ngwan.","Sed.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr-TR.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr-TR.js
new file mode 100644
index 0000000..0fb93f8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr-TR.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tr-TR
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tr-TR", "default", {
+	name: "tr-TR",
+	englishName: "Turkish (Turkey)",
+	nativeName: "Türkçe (Türkiye)",
+	language: "tr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "TL"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],
+				namesAbbr: ["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],
+				namesShort: ["Pz","Pt","Sa","Ça","Pe","Cu","Ct"]
+			},
+			months: {
+				names: ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık",""],
+				namesAbbr: ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr.js
new file mode 100644
index 0000000..a2ef8a5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tr.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tr
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tr", "default", {
+	name: "tr",
+	englishName: "Turkish",
+	nativeName: "Türkçe",
+	language: "tr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "TL"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],
+				namesAbbr: ["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],
+				namesShort: ["Pz","Pt","Sa","Ça","Pe","Cu","Ct"]
+			},
+			months: {
+				names: ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık",""],
+				namesAbbr: ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt-RU.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt-RU.js
new file mode 100644
index 0000000..b918faa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt-RU.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture tt-RU
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tt-RU", "default", {
+	name: "tt-RU",
+	englishName: "Tatar (Russia)",
+	nativeName: "Татар (Россия)",
+	language: "tt",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],
+				namesAbbr: ["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],
+				namesShort: ["Я","Д","С","Ч","П","Җ","Ш"]
+			},
+			months: {
+				names: ["Гыйнвар","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Гыйн.","Фев.","Мар.","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Нояб.","Дек.",""]
+			},
+			monthsGenitive: {
+				names: ["Гыйнварның","Февральнең","Мартның","Апрельнең","Майның","Июньнең","Июльнең","Августның","Сентябрьның","Октябрьның","Ноябрьның","Декабрьның",""],
+				namesAbbr: ["Гыйн.-ның","Фев.-нең","Мар.-ның","Апр.-нең","Майның","Июньнең","Июльнең","Авг.-ның","Сен.-ның","Окт.-ның","Нояб.-ның","Дек.-ның",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt.js
new file mode 100644
index 0000000..efefad6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tt.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture tt
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tt", "default", {
+	name: "tt",
+	englishName: "Tatar",
+	nativeName: "Татар",
+	language: "tt",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],
+				namesAbbr: ["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],
+				namesShort: ["Я","Д","С","Ч","П","Җ","Ш"]
+			},
+			months: {
+				names: ["Гыйнвар","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Гыйн.","Фев.","Мар.","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Нояб.","Дек.",""]
+			},
+			monthsGenitive: {
+				names: ["Гыйнварның","Февральнең","Мартның","Апрельнең","Майның","Июньнең","Июльнең","Августның","Сентябрьның","Октябрьның","Ноябрьның","Декабрьның",""],
+				namesAbbr: ["Гыйн.-ның","Фев.-нең","Мар.-ның","Апр.-нең","Майның","Июньнең","Июльнең","Авг.-ның","Сен.-ның","Окт.-ның","Нояб.-ның","Дек.-ның",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn-DZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn-DZ.js
new file mode 100644
index 0000000..a05ff0a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn-DZ.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tzm-Latn-DZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tzm-Latn-DZ", "default", {
+	name: "tzm-Latn-DZ",
+	englishName: "Tamazight (Latin, Algeria)",
+	nativeName: "Tamazight (Djazaïr)",
+	language: "tzm-Latn",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn.js
new file mode 100644
index 0000000..6e30aa6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm-Latn.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tzm-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tzm-Latn", "default", {
+	name: "tzm-Latn",
+	englishName: "Tamazight (Latin)",
+	nativeName: "Tamazight",
+	language: "tzm-Latn",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm.js
new file mode 100644
index 0000000..176f0c9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.tzm.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture tzm
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "tzm", "default", {
+	name: "tzm",
+	englishName: "Tamazight",
+	nativeName: "Tamazight",
+	language: "tzm",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug-CN.js
new file mode 100644
index 0000000..dcfd852
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug-CN.js
@@ -0,0 +1,75 @@
+/*
+ * Globalize Culture ug-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ug-CN", "default", {
+	name: "ug-CN",
+	englishName: "Uyghur (PRC)",
+	nativeName: "ئۇيغۇرچە (جۇڭخۇا خەلق جۇمھۇرىيىتى)",
+	language: "ug",
+	isRTL: true,
+	numberFormat: {
+		NaN: "سان ئەمەس",
+		negativeInfinity: "مەنپىي چەكسىزلىك",
+		positiveInfinity: "مۇسبەت چەكسىزلىك",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],
+				namesAbbr: ["يە","دۈ","سە","چا","پە","جۈ","شە"],
+				namesShort: ["ي","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""],
+				namesAbbr: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""]
+			},
+			AM: ["چۈشتىن بۇرۇن","چۈشتىن بۇرۇن","چۈشتىن بۇرۇن"],
+			PM: ["چۈشتىن كېيىن","چۈشتىن كېيىن","چۈشتىن كېيىن"],
+			eras: [{"name":"مىلادى","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-M-d",
+				D: "yyyy-'يىلى' MMMM d-'كۈنى،'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm",
+				F: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm:ss",
+				M: "MMMM d'-كۈنى'",
+				Y: "yyyy-'يىلى' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug.js
new file mode 100644
index 0000000..5ea5a5a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ug.js
@@ -0,0 +1,75 @@
+/*
+ * Globalize Culture ug
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ug", "default", {
+	name: "ug",
+	englishName: "Uyghur",
+	nativeName: "ئۇيغۇرچە",
+	language: "ug",
+	isRTL: true,
+	numberFormat: {
+		NaN: "سان ئەمەس",
+		negativeInfinity: "مەنپىي چەكسىزلىك",
+		positiveInfinity: "مۇسبەت چەكسىزلىك",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],
+				namesAbbr: ["يە","دۈ","سە","چا","پە","جۈ","شە"],
+				namesShort: ["ي","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""],
+				namesAbbr: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""]
+			},
+			AM: ["چۈشتىن بۇرۇن","چۈشتىن بۇرۇن","چۈشتىن بۇرۇن"],
+			PM: ["چۈشتىن كېيىن","چۈشتىن كېيىن","چۈشتىن كېيىن"],
+			eras: [{"name":"مىلادى","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-M-d",
+				D: "yyyy-'يىلى' MMMM d-'كۈنى،'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm",
+				F: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm:ss",
+				M: "MMMM d'-كۈنى'",
+				Y: "yyyy-'يىلى' MMMM"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk-UA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk-UA.js
new file mode 100644
index 0000000..ffd012a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk-UA.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture uk-UA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uk-UA", "default", {
+	name: "uk-UA",
+	englishName: "Ukrainian (Ukraine)",
+	nativeName: "українська (Україна)",
+	language: "uk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-безмежність",
+		positiveInfinity: "безмежність",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₴"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],
+				namesAbbr: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень",""],
+				namesAbbr: ["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру",""]
+			},
+			monthsGenitive: {
+				names: ["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня",""],
+				namesAbbr: ["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy' р.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy' р.' H:mm",
+				F: "d MMMM yyyy' р.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy' р.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk.js
new file mode 100644
index 0000000..3aba558
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uk.js
@@ -0,0 +1,83 @@
+/*
+ * Globalize Culture uk
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uk", "default", {
+	name: "uk",
+	englishName: "Ukrainian",
+	nativeName: "українська",
+	language: "uk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-безмежність",
+		positiveInfinity: "безмежність",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₴"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],
+				namesAbbr: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень",""],
+				namesAbbr: ["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру",""]
+			},
+			monthsGenitive: {
+				names: ["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня",""],
+				namesAbbr: ["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy' р.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy' р.' H:mm",
+				F: "d MMMM yyyy' р.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy' р.'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur-PK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur-PK.js
new file mode 100644
index 0000000..befd62f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur-PK.js
@@ -0,0 +1,157 @@
+/*
+ * Globalize Culture ur-PK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ur-PK", "default", {
+	name: "ur-PK",
+	englishName: "Urdu (Islamic Republic of Pakistan)",
+	nativeName: "اُردو (پاکستان)",
+	language: "ur",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "Rs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesAbbr: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesShort: ["ا","پ","م","ب","ج","ج","ه"]
+			},
+			months: {
+				names: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""],
+				namesAbbr: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				f: "dd MMMM, yyyy h:mm tt",
+				F: "dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur.js
new file mode 100644
index 0000000..ce12613
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.ur.js
@@ -0,0 +1,157 @@
+/*
+ * Globalize Culture ur
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ur", "default", {
+	name: "ur",
+	englishName: "Urdu",
+	nativeName: "اُردو",
+	language: "ur",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "Rs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesAbbr: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesShort: ["ا","پ","م","ب","ج","ج","ه"]
+			},
+			months: {
+				names: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""],
+				namesAbbr: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				f: "dd MMMM, yyyy h:mm tt",
+				F: "dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl-UZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl-UZ.js
new file mode 100644
index 0000000..69bd196
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl-UZ.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture uz-Cyrl-UZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz-Cyrl-UZ", "default", {
+	name: "uz-Cyrl-UZ",
+	englishName: "Uzbek (Cyrillic, Uzbekistan)",
+	nativeName: "Ўзбек (Ўзбекистон)",
+	language: "uz-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "сўм"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],
+				namesAbbr: ["якш","дш","сш","чш","пш","ж","ш"],
+				namesShort: ["я","д","с","ч","п","ж","ш"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","мая","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'йил' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'йил' d-MMMM HH:mm",
+				F: "yyyy 'йил' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl.js
new file mode 100644
index 0000000..90d5f45
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Cyrl.js
@@ -0,0 +1,81 @@
+/*
+ * Globalize Culture uz-Cyrl
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz-Cyrl", "default", {
+	name: "uz-Cyrl",
+	englishName: "Uzbek (Cyrillic)",
+	nativeName: "Ўзбек",
+	language: "uz-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "сўм"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],
+				namesAbbr: ["якш","дш","сш","чш","пш","ж","ш"],
+				namesShort: ["я","д","с","ч","п","ж","ш"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","мая","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'йил' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'йил' d-MMMM HH:mm",
+				F: "yyyy 'йил' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn-UZ.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn-UZ.js
new file mode 100644
index 0000000..b4b1ea4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn-UZ.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture uz-Latn-UZ
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz-Latn-UZ", "default", {
+	name: "uz-Latn-UZ",
+	englishName: "Uzbek (Latin, Uzbekistan)",
+	nativeName: "U'zbek (U'zbekiston Respublikasi)",
+	language: "uz-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn.js
new file mode 100644
index 0000000..95a717e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz-Latn.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture uz-Latn
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz-Latn", "default", {
+	name: "uz-Latn",
+	englishName: "Uzbek (Latin)",
+	nativeName: "U'zbek",
+	language: "uz-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz.js
new file mode 100644
index 0000000..50bf9ce
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.uz.js
@@ -0,0 +1,77 @@
+/*
+ * Globalize Culture uz
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "uz", "default", {
+	name: "uz",
+	englishName: "Uzbek",
+	nativeName: "U'zbek",
+	language: "uz",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi-VN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi-VN.js
new file mode 100644
index 0000000..bc28d7a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi-VN.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture vi-VN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "vi-VN", "default", {
+	name: "vi-VN",
+	englishName: "Vietnamese (Vietnam)",
+	nativeName: "Tiếng Việt (Việt Nam)",
+	language: "vi",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "₫"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],
+				namesAbbr: ["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],
+				namesShort: ["C","H","B","T","N","S","B"]
+			},
+			months: {
+				names: ["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai",""],
+				namesAbbr: ["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12",""]
+			},
+			AM: ["SA","sa","SA"],
+			PM: ["CH","ch","CH"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				f: "dd MMMM yyyy h:mm tt",
+				F: "dd MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi.js
new file mode 100644
index 0000000..d0cec0b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.vi.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture vi
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "vi", "default", {
+	name: "vi",
+	englishName: "Vietnamese",
+	nativeName: "Tiếng Việt",
+	language: "vi",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "₫"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],
+				namesAbbr: ["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],
+				namesShort: ["C","H","B","T","N","S","B"]
+			},
+			months: {
+				names: ["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai",""],
+				namesAbbr: ["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12",""]
+			},
+			AM: ["SA","sa","SA"],
+			PM: ["CH","ch","CH"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				f: "dd MMMM yyyy h:mm tt",
+				F: "dd MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo-SN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo-SN.js
new file mode 100644
index 0000000..e2def20
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo-SN.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture wo-SN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "wo-SN", "default", {
+	name: "wo-SN",
+	englishName: "Wolof (Senegal)",
+	nativeName: "Wolof (Sénégal)",
+	language: "wo",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "XOF"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo.js
new file mode 100644
index 0000000..f2d4edb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.wo.js
@@ -0,0 +1,79 @@
+/*
+ * Globalize Culture wo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "wo", "default", {
+	name: "wo",
+	englishName: "Wolof",
+	nativeName: "Wolof",
+	language: "wo",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "XOF"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh-ZA.js
new file mode 100644
index 0000000..4101be6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh-ZA.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture xh-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "xh-ZA", "default", {
+	name: "xh-ZA",
+	englishName: "isiXhosa (South Africa)",
+	nativeName: "isiXhosa (uMzantsi Afrika)",
+	language: "xh",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesShort: ["Ca","Mv","Lb","Lt","Ln","Lh","Mg"]
+			},
+			months: {
+				names: ["Mqungu","Mdumba","Kwindla","Tshazimpuzi","Canzibe","Silimela","Khala","Thupha","Msintsi","Dwarha","Nkanga","Mnga",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh.js
new file mode 100644
index 0000000..8325e61
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.xh.js
@@ -0,0 +1,65 @@
+/*
+ * Globalize Culture xh
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "xh", "default", {
+	name: "xh",
+	englishName: "isiXhosa",
+	nativeName: "isiXhosa",
+	language: "xh",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesShort: ["Ca","Mv","Lb","Lt","Ln","Lh","Mg"]
+			},
+			months: {
+				names: ["Mqungu","Mdumba","Kwindla","Tshazimpuzi","Canzibe","Silimela","Khala","Thupha","Msintsi","Dwarha","Nkanga","Mnga",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo-NG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo-NG.js
new file mode 100644
index 0000000..39af5b8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo-NG.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture yo-NG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "yo-NG", "default", {
+	name: "yo-NG",
+	englishName: "Yoruba (Nigeria)",
+	nativeName: "Yoruba (Nigeria)",
+	language: "yo",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Osu kinni","Osu keji","Osu keta","Osu kerin","Osu karun","Osu kefa","Osu keje","Osu kejo","Osu kesan","Osu kewa","Osu kokanla","Osu keresi",""],
+				namesAbbr: ["kin.","kej.","ket.","ker.","kar.","kef.","kej.","kej.","kes.","kew.","kok.","ker.",""]
+			},
+			AM: ["Owuro","owuro","OWURO"],
+			PM: ["Ale","ale","ALE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo.js
new file mode 100644
index 0000000..b5e24cd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.yo.js
@@ -0,0 +1,60 @@
+/*
+ * Globalize Culture yo
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "yo", "default", {
+	name: "yo",
+	englishName: "Yoruba",
+	nativeName: "Yoruba",
+	language: "yo",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Osu kinni","Osu keji","Osu keta","Osu kerin","Osu karun","Osu kefa","Osu keje","Osu kejo","Osu kesan","Osu kewa","Osu kokanla","Osu keresi",""],
+				namesAbbr: ["kin.","kej.","ket.","ker.","kar.","kef.","kej.","kej.","kes.","kew.","kok.","ker.",""]
+			},
+			AM: ["Owuro","owuro","OWURO"],
+			PM: ["Ale","ale","ALE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHS.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHS.js
new file mode 100644
index 0000000..c843bc8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHS.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture zh-CHS
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-CHS", "default", {
+	name: "zh-CHS",
+	englishName: "Chinese (Simplified) Legacy",
+	nativeName: "中文(简体) 旧版",
+	language: "zh-CHS",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHT.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHT.js
new file mode 100644
index 0000000..7ca37c9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CHT.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture zh-CHT
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-CHT", "default", {
+	name: "zh-CHT",
+	englishName: "Chinese (Traditional) Legacy",
+	nativeName: "中文(繁體) 舊版",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CN.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CN.js
new file mode 100644
index 0000000..41e6294
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-CN.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture zh-CN
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-CN", "default", {
+	name: "zh-CN",
+	englishName: "Chinese (Simplified, PRC)",
+	nativeName: "中文(中华人民共和国)",
+	language: "zh-CHS",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-HK.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-HK.js
new file mode 100644
index 0000000..dd769ca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-HK.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture zh-HK
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-HK", "default", {
+	name: "zh-HK",
+	englishName: "Chinese (Traditional, Hong Kong S.A.R.)",
+	nativeName: "中文(香港特別行政區)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hans.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hans.js
new file mode 100644
index 0000000..8569374
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hans.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture zh-Hans
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-Hans", "default", {
+	name: "zh-Hans",
+	englishName: "Chinese (Simplified)",
+	nativeName: "中文(简体)",
+	language: "zh-Hans",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hant.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hant.js
new file mode 100644
index 0000000..44ba865
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-Hant.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture zh-Hant
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-Hant", "default", {
+	name: "zh-Hant",
+	englishName: "Chinese (Traditional)",
+	nativeName: "中文(繁體)",
+	language: "zh-Hant",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-MO.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-MO.js
new file mode 100644
index 0000000..e09274f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-MO.js
@@ -0,0 +1,72 @@
+/*
+ * Globalize Culture zh-MO
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-MO", "default", {
+	name: "zh-MO",
+	englishName: "Chinese (Traditional, Macao S.A.R.)",
+	nativeName: "中文(澳門特別行政區)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "MOP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-SG.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-SG.js
new file mode 100644
index 0000000..8e99e6d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-SG.js
@@ -0,0 +1,63 @@
+/*
+ * Globalize Culture zh-SG
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-SG", "default", {
+	name: "zh-SG",
+	englishName: "Chinese (Simplified, Singapore)",
+	nativeName: "中文(新加坡)",
+	language: "zh-CHS",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt h:mm",
+				F: "yyyy'年'M'月'd'日' tt h:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-TW.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-TW.js
new file mode 100644
index 0000000..22eea14
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh-TW.js
@@ -0,0 +1,99 @@
+/*
+ * Globalize Culture zh-TW
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh-TW", "default", {
+	name: "zh-TW",
+	englishName: "Chinese (Traditional, Taiwan)",
+	nativeName: "中文(台灣)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "不是一個數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "NT$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"西元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt hh:mm",
+				F: "yyyy'年'M'月'd'日' tt hh:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Taiwan: {
+			name: "Taiwan",
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"","start":null,"offset":1911}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt hh:mm",
+				F: "yyyy'年'M'月'd'日' tt hh:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh.js
new file mode 100644
index 0000000..2bab388
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zh.js
@@ -0,0 +1,73 @@
+/*
+ * Globalize Culture zh
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zh", "default", {
+	name: "zh",
+	englishName: "Chinese",
+	nativeName: "中文",
+	language: "zh",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu-ZA.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu-ZA.js
new file mode 100644
index 0000000..348cda6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu-ZA.js
@@ -0,0 +1,66 @@
+/*
+ * Globalize Culture zu-ZA
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zu-ZA", "default", {
+	name: "zu-ZA",
+	englishName: "isiZulu (South Africa)",
+	nativeName: "isiZulu (iNingizimu Afrika)",
+	language: "zu",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesAbbr: ["Son.","Mso.","Bi.","Tha.","Ne.","Hla.","Mgq."]
+			},
+			months: {
+				names: ["uMasingana","uNhlolanja","uNdasa","uMbaso","uNhlaba","uNhlangulana","uNtulikazi","uNcwaba","uMandulo","uMfumfu","uLwezi","uZibandlela",""],
+				namesAbbr: ["Mas.","Nhlo.","Nda.","Mba.","Nhla.","Nhlang.","Ntu.","Ncwa.","Man.","Mfu.","Lwe.","Zib.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu.js
new file mode 100644
index 0000000..78873a5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.culture.zu.js
@@ -0,0 +1,66 @@
+/*
+ * Globalize Culture zu
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "zu", "default", {
+	name: "zu",
+	englishName: "isiZulu",
+	nativeName: "isiZulu",
+	language: "zu",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesAbbr: ["Son.","Mso.","Bi.","Tha.","Ne.","Hla.","Mgq."]
+			},
+			months: {
+				names: ["uMasingana","uNhlolanja","uNdasa","uMbaso","uNhlaba","uNhlangulana","uNtulikazi","uNcwaba","uMandulo","uMfumfu","uLwezi","uZibandlela",""],
+				namesAbbr: ["Mas.","Nhlo.","Nda.","Mba.","Nhla.","Nhlang.","Ntu.","Ncwa.","Man.","Mfu.","Lwe.","Zib.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.cultures.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.cultures.js
new file mode 100644
index 0000000..cf30659
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/cultures/globalize.cultures.js
@@ -0,0 +1,24063 @@
+/*
+ * Globalize Cultures
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * This file was generated by the Globalize Culture Generator
+ * Translation: bugs found in this file need to be fixed in the generator
+ */
+
+(function( window, undefined ) {
+
+var Globalize;
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	Globalize = require( "globalize" );
+} else {
+	// Global variable
+	Globalize = window.Globalize;
+}
+
+Globalize.addCultureInfo( "ar", "default", {
+	name: "ar",
+	englishName: "Arabic",
+	nativeName: "العربية",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bg", "default", {
+	name: "bg",
+	englishName: "Bulgarian",
+	nativeName: "български",
+	language: "bg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "- безкрайност",
+		positiveInfinity: "+ безкрайност",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "лв."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],
+				namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"],
+				namesShort: ["н","п","в","с","ч","п","с"]
+			},
+			months: {
+				names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"след новата ера","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy 'г.'",
+				D: "dd MMMM yyyy 'г.'",
+				t: "HH:mm 'ч.'",
+				T: "HH:mm:ss 'ч.'",
+				f: "dd MMMM yyyy 'г.' HH:mm 'ч.'",
+				F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'",
+				M: "dd MMMM",
+				Y: "MMMM yyyy 'г.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ca", "default", {
+	name: "ca",
+	englishName: "Catalan",
+	nativeName: "català",
+	language: "ca",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "Infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],
+				namesAbbr: ["dg.","dl.","dt.","dc.","dj.","dv.","ds."],
+				namesShort: ["dg","dl","dt","dc","dj","dv","ds"]
+			},
+			months: {
+				names: ["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre",""],
+				namesAbbr: ["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' / 'MMMM' / 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' / 'MMMM' / 'yyyy HH:mm",
+				F: "dddd, d' / 'MMMM' / 'yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' / 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-Hans", "default", {
+	name: "zh-Hans",
+	englishName: "Chinese (Simplified)",
+	nativeName: "中文(简体)",
+	language: "zh-Hans",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "cs", "default", {
+	name: "cs",
+	englishName: "Czech",
+	nativeName: "čeština",
+	language: "cs",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Není číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Kč"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],
+				namesAbbr: ["ne","po","út","st","čt","pá","so"],
+				namesShort: ["ne","po","út","st","čt","pá","so"]
+			},
+			months: {
+				names: ["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["dop.","dop.","DOP."],
+			PM: ["odp.","odp.","ODP."],
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "da", "default", {
+	name: "da",
+	englishName: "Danish",
+	nativeName: "dansk",
+	language: "da",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de", "default", {
+	name: "de",
+	englishName: "German",
+	nativeName: "Deutsch",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "el", "default", {
+	name: "el",
+	englishName: "Greek",
+	nativeName: "Ελληνικά",
+	language: "el",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "μη αριθμός",
+		negativeInfinity: "-Άπειρο",
+		positiveInfinity: "Άπειρο",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],
+				namesAbbr: ["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],
+				namesShort: ["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"]
+			},
+			months: {
+				names: ["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			monthsGenitive: {
+				names: ["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			AM: ["πμ","πμ","ΠΜ"],
+			PM: ["μμ","μμ","ΜΜ"],
+			eras: [{"name":"μ.Χ.","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es", "default", {
+	name: "es",
+	englishName: "Spanish",
+	nativeName: "español",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fi", "default", {
+	name: "fi",
+	englishName: "Finnish",
+	nativeName: "suomi",
+	language: "fi",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],
+				namesAbbr: ["su","ma","ti","ke","to","pe","la"],
+				namesShort: ["su","ma","ti","ke","to","pe","la"]
+			},
+			months: {
+				names: ["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu",""],
+				namesAbbr: ["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM'ta 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM'ta 'yyyy H:mm",
+				F: "d. MMMM'ta 'yyyy H:mm:ss",
+				M: "d. MMMM'ta'",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr", "default", {
+	name: "fr",
+	englishName: "French",
+	nativeName: "français",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "he", "default", {
+	name: "he",
+	englishName: "Hebrew",
+	nativeName: "עברית",
+	language: "he",
+	isRTL: true,
+	numberFormat: {
+		NaN: "לא מספר",
+		negativeInfinity: "אינסוף שלילי",
+		positiveInfinity: "אינסוף חיובי",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "₪"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר",""],
+				namesAbbr: ["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ",""]
+			},
+			eras: [{"name":"לספירה","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Hebrew: {
+			name: "Hebrew",
+			"/": " ",
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["א","ב","ג","ד","ה","ו","ש"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"],
+				namesAbbr: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"]
+			},
+			eras: [{"name":"C.E.","start":null,"offset":0}],
+			twoDigitYearMax: 5790,
+			patterns: {
+				d: "dd MMMM yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hu", "default", {
+	name: "hu",
+	englishName: "Hungarian",
+	nativeName: "magyar",
+	language: "hu",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nem szám",
+		negativeInfinity: "negatív végtelen",
+		positiveInfinity: "végtelen",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Ft"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],
+				namesAbbr: ["V","H","K","Sze","Cs","P","Szo"],
+				namesShort: ["V","H","K","Sze","Cs","P","Szo"]
+			},
+			months: {
+				names: ["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december",""],
+				namesAbbr: ["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec.",""]
+			},
+			AM: ["de.","de.","DE."],
+			PM: ["du.","du.","DU."],
+			eras: [{"name":"i.sz.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "yyyy. MMMM d.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy. MMMM d. H:mm",
+				F: "yyyy. MMMM d. H:mm:ss",
+				M: "MMMM d.",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "is", "default", {
+	name: "is",
+	englishName: "Icelandic",
+	nativeName: "íslenska",
+	language: "is",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],
+				namesAbbr: ["sun.","mán.","þri.","mið.","fim.","fös.","lau."],
+				namesShort: ["su","má","þr","mi","fi","fö","la"]
+			},
+			months: {
+				names: ["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember",""],
+				namesAbbr: ["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "it", "default", {
+	name: "it",
+	englishName: "Italian",
+	nativeName: "italiano",
+	language: "it",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ja", "default", {
+	name: "ja",
+	englishName: "Japanese",
+	nativeName: "日本語",
+	language: "ja",
+	numberFormat: {
+		NaN: "NaN (非数値)",
+		negativeInfinity: "-∞",
+		positiveInfinity: "+∞",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"西暦","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Japanese: {
+			name: "Japanese",
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "gg y/M/d",
+				D: "gg y'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "gg y'年'M'月'd'日' H:mm",
+				F: "gg y'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "gg y'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ko", "default", {
+	name: "ko",
+	englishName: "Korean",
+	nativeName: "한국어",
+	language: "ko",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "₩"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"서기","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "yyyy'년' M'월'"
+			}
+		},
+		Korean: {
+			name: "Korean",
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"단기","start":null,"offset":-2333}],
+			twoDigitYearMax: 4362,
+			patterns: {
+				d: "gg yyyy-MM-dd",
+				D: "gg yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "gg yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "gg yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "gg yyyy'년' M'월'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nl", "default", {
+	name: "nl",
+	englishName: "Dutch",
+	nativeName: "Nederlands",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "no", "default", {
+	name: "no",
+	englishName: "Norwegian",
+	nativeName: "norsk",
+	language: "no",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pl", "default", {
+	name: "pl",
+	englishName: "Polish",
+	nativeName: "polski",
+	language: "pl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nie jest liczbą",
+		negativeInfinity: "-nieskończoność",
+		positiveInfinity: "+nieskończoność",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "zł"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],
+				namesAbbr: ["N","Pn","Wt","Śr","Cz","Pt","So"],
+				namesShort: ["N","Pn","Wt","Śr","Cz","Pt","So"]
+			},
+			months: {
+				names: ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			monthsGenitive: {
+				names: ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pt", "default", {
+	name: "pt",
+	englishName: "Portuguese",
+	nativeName: "Português",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "R$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro",""],
+				namesAbbr: ["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "rm", "default", {
+	name: "rm",
+	englishName: "Romansh",
+	nativeName: "Rumantsch",
+	language: "rm",
+	numberFormat: {
+		",": "'",
+		NaN: "betg def.",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "+infinit",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],
+				namesAbbr: ["du","gli","ma","me","gie","ve","so"],
+				namesShort: ["du","gli","ma","me","gie","ve","so"]
+			},
+			months: {
+				names: ["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december",""],
+				namesAbbr: ["schan","favr","mars","avr","matg","zercl","fan","avust","sett","oct","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"s. Cr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d MMMM yyyy HH:mm",
+				F: "dddd, d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ro", "default", {
+	name: "ro",
+	englishName: "Romanian",
+	nativeName: "română",
+	language: "ro",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "lei"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],
+				namesAbbr: ["D","L","Ma","Mi","J","V","S"],
+				namesShort: ["D","L","Ma","Mi","J","V","S"]
+			},
+			months: {
+				names: ["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie",""],
+				namesAbbr: ["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ru", "default", {
+	name: "ru",
+	englishName: "Russian",
+	nativeName: "русский",
+	language: "ru",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],
+				namesAbbr: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			monthsGenitive: {
+				names: ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'г.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'г.' H:mm",
+				F: "d MMMM yyyy 'г.' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hr", "default", {
+	name: "hr",
+	englishName: "Croatian",
+	nativeName: "hrvatski",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kn"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sk", "default", {
+	name: "sk",
+	englishName: "Slovak",
+	nativeName: "slovenčina",
+	language: "sk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Nie je číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],
+				namesAbbr: ["ne","po","ut","st","št","pi","so"],
+				namesShort: ["ne","po","ut","st","št","pi","so"]
+			},
+			months: {
+				names: ["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sq", "default", {
+	name: "sq",
+	englishName: "Albanian",
+	nativeName: "shqipe",
+	language: "sq",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": ".",
+			".": ",",
+			symbol: "Lek"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],
+				namesAbbr: ["Die","Hën","Mar","Mër","Enj","Pre","Sht"],
+				namesShort: ["Di","Hë","Ma","Më","En","Pr","Sh"]
+			},
+			months: {
+				names: ["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor",""],
+				namesAbbr: ["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj",""]
+			},
+			AM: ["PD","pd","PD"],
+			PM: ["MD","md","MD"],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy-MM-dd",
+				t: "h:mm.tt",
+				T: "h:mm:ss.tt",
+				f: "yyyy-MM-dd h:mm.tt",
+				F: "yyyy-MM-dd h:mm:ss.tt",
+				Y: "yyyy-MM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sv", "default", {
+	name: "sv",
+	englishName: "Swedish",
+	nativeName: "svenska",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "th", "default", {
+	name: "th",
+	englishName: "Thai",
+	nativeName: "ไทย",
+	language: "th",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "฿"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "ThaiBuddhist",
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			eras: [{"name":"พ.ศ.","start":null,"offset":-543}],
+			twoDigitYearMax: 2572,
+			patterns: {
+				d: "d/M/yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "'วัน'dddd'ที่' d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "'วัน'dddd'ที่' d MMMM yyyy H:mm",
+				F: "'วัน'dddd'ที่' d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tr", "default", {
+	name: "tr",
+	englishName: "Turkish",
+	nativeName: "Türkçe",
+	language: "tr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "TL"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],
+				namesAbbr: ["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],
+				namesShort: ["Pz","Pt","Sa","Ça","Pe","Cu","Ct"]
+			},
+			months: {
+				names: ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık",""],
+				namesAbbr: ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ur", "default", {
+	name: "ur",
+	englishName: "Urdu",
+	nativeName: "اُردو",
+	language: "ur",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "Rs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesAbbr: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesShort: ["ا","پ","م","ب","ج","ج","ه"]
+			},
+			months: {
+				names: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""],
+				namesAbbr: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				f: "dd MMMM, yyyy h:mm tt",
+				F: "dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "id", "default", {
+	name: "id",
+	englishName: "Indonesian",
+	nativeName: "Bahasa Indonesia",
+	language: "id",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "Rp"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],
+				namesAbbr: ["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],
+				namesShort: ["M","S","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uk", "default", {
+	name: "uk",
+	englishName: "Ukrainian",
+	nativeName: "українська",
+	language: "uk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-безмежність",
+		positiveInfinity: "безмежність",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₴"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],
+				namesAbbr: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень",""],
+				namesAbbr: ["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру",""]
+			},
+			monthsGenitive: {
+				names: ["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня",""],
+				namesAbbr: ["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy' р.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy' р.' H:mm",
+				F: "d MMMM yyyy' р.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy' р.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "be", "default", {
+	name: "be",
+	englishName: "Belarusian",
+	nativeName: "Беларускі",
+	language: "be",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],
+				namesAbbr: ["нд","пн","аў","ср","чц","пт","сб"],
+				namesShort: ["нд","пн","аў","ср","чц","пт","сб"]
+			},
+			months: {
+				names: ["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			monthsGenitive: {
+				names: ["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sl", "default", {
+	name: "sl",
+	englishName: "Slovenian",
+	nativeName: "slovenski",
+	language: "sl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-neskončnost",
+		positiveInfinity: "neskončnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],
+				namesAbbr: ["ned","pon","tor","sre","čet","pet","sob"],
+				namesShort: ["ne","po","to","sr","če","pe","so"]
+			},
+			months: {
+				names: ["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "et", "default", {
+	name: "et",
+	englishName: "Estonian",
+	nativeName: "eesti",
+	language: "et",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "avaldamatu",
+		negativeInfinity: "miinuslõpmatus",
+		positiveInfinity: "plusslõpmatus",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],
+				namesAbbr: ["P","E","T","K","N","R","L"],
+				namesShort: ["P","E","T","K","N","R","L"]
+			},
+			months: {
+				names: ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember",""],
+				namesAbbr: ["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets",""]
+			},
+			AM: ["EL","el","EL"],
+			PM: ["PL","pl","PL"],
+			patterns: {
+				d: "d.MM.yyyy",
+				D: "d. MMMM yyyy'. a.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy'. a.' H:mm",
+				F: "d. MMMM yyyy'. a.' H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy'. a.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lv", "default", {
+	name: "lv",
+	englishName: "Latvian",
+	nativeName: "latviešu",
+	language: "lv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-bezgalība",
+		positiveInfinity: "bezgalība",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "Ls"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],
+				namesAbbr: ["sv","pr","ot","tr","ce","pk","se"],
+				namesShort: ["sv","pr","ot","tr","ce","pk","se"]
+			},
+			months: {
+				names: ["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			monthsGenitive: {
+				names: ["janvārī","februārī","martā","aprīlī","maijā","jūnijā","jūlijā","augustā","septembrī","oktobrī","novembrī","decembrī",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "dddd, yyyy'. gada 'd. MMMM",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy'. gada 'd. MMMM H:mm",
+				F: "dddd, yyyy'. gada 'd. MMMM H:mm:ss",
+				M: "d. MMMM",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lt", "default", {
+	name: "lt",
+	englishName: "Lithuanian",
+	nativeName: "lietuvių",
+	language: "lt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-begalybė",
+		positiveInfinity: "begalybė",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Lt"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],
+				namesAbbr: ["Sk","Pr","An","Tr","Kt","Pn","Št"],
+				namesShort: ["S","P","A","T","K","Pn","Š"]
+			},
+			months: {
+				names: ["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			monthsGenitive: {
+				names: ["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd",
+				D: "yyyy 'm.' MMMM d 'd.'",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'm.' MMMM d 'd.' HH:mm",
+				F: "yyyy 'm.' MMMM d 'd.' HH:mm:ss",
+				M: "MMMM d 'd.'",
+				Y: "yyyy 'm.' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tg", "default", {
+	name: "tg",
+	englishName: "Tajik",
+	nativeName: "Тоҷикӣ",
+	language: "tg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fa", "default", {
+	name: "fa",
+	englishName: "Persian",
+	nativeName: "فارسى",
+	language: "fa",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		currency: {
+			pattern: ["$n-","$ n"],
+			".": "/",
+			symbol: "ريال"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""],
+				namesAbbr: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy/MM/dd",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "yyyy/MM/dd hh:mm tt",
+				F: "yyyy/MM/dd hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "vi", "default", {
+	name: "vi",
+	englishName: "Vietnamese",
+	nativeName: "Tiếng Việt",
+	language: "vi",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "₫"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],
+				namesAbbr: ["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],
+				namesShort: ["C","H","B","T","N","S","B"]
+			},
+			months: {
+				names: ["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai",""],
+				namesAbbr: ["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12",""]
+			},
+			AM: ["SA","sa","SA"],
+			PM: ["CH","ch","CH"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				f: "dd MMMM yyyy h:mm tt",
+				F: "dd MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hy", "default", {
+	name: "hy",
+	englishName: "Armenian",
+	nativeName: "Հայերեն",
+	language: "hy",
+	numberFormat: {
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "դր."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],
+				namesAbbr: ["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],
+				namesShort: ["Կ","Ե","Ե","Չ","Հ","Ո","Շ"]
+			},
+			months: {
+				names: ["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր",""],
+				namesAbbr: ["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM, yyyy H:mm",
+				F: "d MMMM, yyyy H:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az", "default", {
+	name: "az",
+	englishName: "Azeri",
+	nativeName: "Azərbaycan­ılı",
+	language: "az",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "eu", "default", {
+	name: "eu",
+	englishName: "Basque",
+	nativeName: "euskara",
+	language: "eu",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "EdZ",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "Infinitu",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],
+				namesAbbr: ["ig.","al.","as.","az.","og.","or.","lr."],
+				namesShort: ["ig","al","as","az","og","or","lr"]
+			},
+			months: {
+				names: ["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua",""],
+				namesAbbr: ["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dddd, yyyy.'eko' MMMM'k 'd",
+				t: "HH:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy.'eko' MMMM'k 'd HH:mm",
+				F: "dddd, yyyy.'eko' MMMM'k 'd H:mm:ss",
+				Y: "yyyy.'eko' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hsb", "default", {
+	name: "hsb",
+	englishName: "Upper Sorbian",
+	nativeName: "hornjoserbšćina",
+	language: "hsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekónčne",
+		positiveInfinity: "+njekónčne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],
+				namesAbbr: ["nje","pón","wut","srj","štw","pja","sob"],
+				namesShort: ["n","p","w","s","š","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'hodź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'hodź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mk", "default", {
+	name: "mk",
+	englishName: "Macedonian (FYROM)",
+	nativeName: "македонски јазик",
+	language: "mk",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "ден."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недела","понеделник","вторник","среда","четврток","петок","сабота"],
+				namesAbbr: ["нед","пон","втр","срд","чет","пет","саб"],
+				namesShort: ["не","по","вт","ср","че","пе","са"]
+			},
+			months: {
+				names: ["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd MMMM yyyy HH:mm",
+				F: "dddd, dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tn", "default", {
+	name: "tn",
+	englishName: "Setswana",
+	nativeName: "Setswana",
+	language: "tn",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],
+				namesAbbr: ["Ltp.","Mos.","Lbd.","Lbr.","Lbn.","Lbt.","Lmt."],
+				namesShort: ["Lp","Ms","Lb","Lr","Ln","Lt","Lm"]
+			},
+			months: {
+				names: ["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole",""],
+				namesAbbr: ["Fer.","Tlhak.","Mop.","Mor.","Motsh.","Seet.","Phukw.","Phatw.","Lwets.","Diph.","Ngwan.","Sed.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "xh", "default", {
+	name: "xh",
+	englishName: "isiXhosa",
+	nativeName: "isiXhosa",
+	language: "xh",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesShort: ["Ca","Mv","Lb","Lt","Ln","Lh","Mg"]
+			},
+			months: {
+				names: ["Mqungu","Mdumba","Kwindla","Tshazimpuzi","Canzibe","Silimela","Khala","Thupha","Msintsi","Dwarha","Nkanga","Mnga",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zu", "default", {
+	name: "zu",
+	englishName: "isiZulu",
+	nativeName: "isiZulu",
+	language: "zu",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesAbbr: ["Son.","Mso.","Bi.","Tha.","Ne.","Hla.","Mgq."]
+			},
+			months: {
+				names: ["uMasingana","uNhlolanja","uNdasa","uMbaso","uNhlaba","uNhlangulana","uNtulikazi","uNcwaba","uMandulo","uMfumfu","uLwezi","uZibandlela",""],
+				namesAbbr: ["Mas.","Nhlo.","Nda.","Mba.","Nhla.","Nhlang.","Ntu.","Ncwa.","Man.","Mfu.","Lwe.","Zib.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "af", "default", {
+	name: "af",
+	englishName: "Afrikaans",
+	nativeName: "Afrikaans",
+	language: "af",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
+				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
+				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
+			},
+			months: {
+				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ka", "default", {
+	name: "ka",
+	englishName: "Georgian",
+	nativeName: "ქართული",
+	language: "ka",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Lari"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesAbbr: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesShort: ["კ","ო","ს","ო","ხ","პ","შ"]
+			},
+			months: {
+				names: ["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი",""],
+				namesAbbr: ["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'წლის' dd MM, dddd",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'წლის' dd MM, dddd H:mm",
+				F: "yyyy 'წლის' dd MM, dddd H:mm:ss",
+				M: "dd MM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fo", "default", {
+	name: "fo",
+	englishName: "Faroese",
+	nativeName: "føroyskt",
+	language: "fo",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],
+				namesAbbr: ["sun","mán","týs","mik","hós","frí","leyg"],
+				namesShort: ["su","má","tý","mi","hó","fr","ley"]
+			},
+			months: {
+				names: ["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hi", "default", {
+	name: "hi",
+	englishName: "Hindi",
+	nativeName: "हिंदी",
+	language: "hi",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mt", "default", {
+	name: "mt",
+	englishName: "Maltese",
+	nativeName: "Malti",
+	language: "mt",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],
+				namesAbbr: ["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],
+				namesShort: ["I","I","I","L","I","I","I"]
+			},
+			months: {
+				names: ["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru",""],
+				namesAbbr: ["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' ta\\' 'MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' ta\\' 'MMMM yyyy HH:mm",
+				F: "dddd, d' ta\\' 'MMMM yyyy HH:mm:ss",
+				M: "d' ta\\' 'MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "se", "default", {
+	name: "se",
+	englishName: "Sami (Northern)",
+	nativeName: "davvisámegiella",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ga", "default", {
+	name: "ga",
+	englishName: "Irish",
+	nativeName: "Gaeilge",
+	language: "ga",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],
+				namesAbbr: ["Domh","Luan","Máir","Céad","Déar","Aoi","Sath"],
+				namesShort: ["Do","Lu","Má","Cé","De","Ao","Sa"]
+			},
+			months: {
+				names: ["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig",""],
+				namesAbbr: ["Ean","Feabh","Már","Aib","Bealt","Meith","Iúil","Lún","M.Fómh","D.Fómh","Samh","Noll",""]
+			},
+			AM: ["r.n.","r.n.","R.N."],
+			PM: ["i.n.","i.n.","I.N."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ms", "default", {
+	name: "ms",
+	englishName: "Malay",
+	nativeName: "Bahasa Melayu",
+	language: "ms",
+	numberFormat: {
+		currency: {
+			decimals: 0,
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kk", "default", {
+	name: "kk",
+	englishName: "Kazakh",
+	nativeName: "Қазақ",
+	language: "kk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			",": " ",
+			".": "-",
+			symbol: "Т"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],
+				namesAbbr: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],
+				namesShort: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"]
+			},
+			months: {
+				names: ["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан",""],
+				namesAbbr: ["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'ж.' H:mm",
+				F: "d MMMM yyyy 'ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ky", "default", {
+	name: "ky",
+	englishName: "Kyrgyz",
+	nativeName: "Кыргыз",
+	language: "ky",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": "-",
+			symbol: "сом"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],
+				namesAbbr: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],
+				namesShort: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d'-'MMMM yyyy'-ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d'-'MMMM yyyy'-ж.' H:mm",
+				F: "d'-'MMMM yyyy'-ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy'-ж.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sw", "default", {
+	name: "sw",
+	englishName: "Kiswahili",
+	nativeName: "Kiswahili",
+	language: "sw",
+	numberFormat: {
+		currency: {
+			symbol: "S"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],
+				namesAbbr: ["Jumap.","Jumat.","Juman.","Jumat.","Alh.","Iju.","Jumam."],
+				namesShort: ["P","T","N","T","A","I","M"]
+			},
+			months: {
+				names: ["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Decemba",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec",""]
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tk", "default", {
+	name: "tk",
+	englishName: "Turkmen",
+	nativeName: "türkmençe",
+	language: "tk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-üznüksizlik",
+		positiveInfinity: "üznüksizlik",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "m."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],
+				namesAbbr: ["Db","Sb","Çb","Pb","An","Şb","Ýb"],
+				namesShort: ["D","S","Ç","P","A","Ş","Ý"]
+			},
+			months: {
+				names: ["Ýanwar","Fewral","Mart","Aprel","Maý","lýun","lýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr",""],
+				namesAbbr: ["Ýan","Few","Mart","Apr","Maý","lýun","lýul","Awg","Sen","Okt","Not","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "yyyy 'ý.' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'ý.' MMMM d H:mm",
+				F: "yyyy 'ý.' MMMM d H:mm:ss",
+				Y: "yyyy 'ý.' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz", "default", {
+	name: "uz",
+	englishName: "Uzbek",
+	nativeName: "U'zbek",
+	language: "uz",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tt", "default", {
+	name: "tt",
+	englishName: "Tatar",
+	nativeName: "Татар",
+	language: "tt",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],
+				namesAbbr: ["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],
+				namesShort: ["Я","Д","С","Ч","П","Җ","Ш"]
+			},
+			months: {
+				names: ["Гыйнвар","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Гыйн.","Фев.","Мар.","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Нояб.","Дек.",""]
+			},
+			monthsGenitive: {
+				names: ["Гыйнварның","Февральнең","Мартның","Апрельнең","Майның","Июньнең","Июльнең","Августның","Сентябрьның","Октябрьның","Ноябрьның","Декабрьның",""],
+				namesAbbr: ["Гыйн.-ның","Фев.-нең","Мар.-ның","Апр.-нең","Майның","Июньнең","Июльнең","Авг.-ның","Сен.-ның","Окт.-ның","Нояб.-ның","Дек.-ның",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bn", "default", {
+	name: "bn",
+	englishName: "Bengali",
+	nativeName: "বাংলা",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "টা"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pa", "default", {
+	name: "pa",
+	englishName: "Punjabi",
+	nativeName: "ਪੰਜਾਬੀ",
+	language: "pa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ਰੁ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],
+				namesAbbr: ["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁੱਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨਿੱਚਰ."],
+				namesShort: ["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"]
+			},
+			months: {
+				names: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""],
+				namesAbbr: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""]
+			},
+			AM: ["ਸਵੇਰ","ਸਵੇਰ","ਸਵੇਰ"],
+			PM: ["ਸ਼ਾਮ","ਸ਼ਾਮ","ਸ਼ਾਮ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy dddd",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "dd MMMM yyyy dddd tt hh:mm",
+				F: "dd MMMM yyyy dddd tt hh:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gu", "default", {
+	name: "gu",
+	englishName: "Gujarati",
+	nativeName: "ગુજરાતી",
+	language: "gu",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "રૂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],
+				namesAbbr: ["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],
+				namesShort: ["ર","સ","મ","બ","ગ","શ","શ"]
+			},
+			months: {
+				names: ["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર",""],
+				namesAbbr: ["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે",""]
+			},
+			AM: ["પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન"],
+			PM: ["ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "or", "default", {
+	name: "or",
+	englishName: "Oriya",
+	nativeName: "ଓଡ଼ିଆ",
+	language: "or",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ଟ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],
+				namesAbbr: ["ରବି.","ସୋମ.","ମଙ୍ଗଳ.","ବୁଧ.","ଗୁରୁ.","ଶୁକ୍ର.","ଶନି."],
+				namesShort: ["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"]
+			},
+			months: {
+				names: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""],
+				namesAbbr: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""]
+			},
+			eras: [{"name":"ଖ୍ରୀଷ୍ଟାବ୍ଦ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ta", "default", {
+	name: "ta",
+	englishName: "Tamil",
+	nativeName: "தமிழ்",
+	language: "ta",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ரூ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ஞாயிற்றுக்கிழமை","திங்கள்கிழமை","செவ்வாய்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],
+				namesAbbr: ["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],
+				namesShort: ["ஞா","தி","செ","பு","வி","வெ","ச"]
+			},
+			months: {
+				names: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""],
+				namesAbbr: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""]
+			},
+			AM: ["காலை","காலை","காலை"],
+			PM: ["மாலை","மாலை","மாலை"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "te", "default", {
+	name: "te",
+	englishName: "Telugu",
+	nativeName: "తెలుగు",
+	language: "te",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "రూ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],
+				namesAbbr: ["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],
+				namesShort: ["ఆ","సో","మం","బు","గు","శు","శ"]
+			},
+			months: {
+				names: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""],
+				namesAbbr: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""]
+			},
+			AM: ["పూర్వాహ్న","పూర్వాహ్న","పూర్వాహ్న"],
+			PM: ["అపరాహ్న","అపరాహ్న","అపరాహ్న"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kn", "default", {
+	name: "kn",
+	englishName: "Kannada",
+	nativeName: "ಕನ್ನಡ",
+	language: "kn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ರೂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],
+				namesAbbr: ["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],
+				namesShort: ["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"]
+			},
+			months: {
+				names: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""],
+				namesAbbr: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""]
+			},
+			AM: ["ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ"],
+			PM: ["ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ml", "default", {
+	name: "ml",
+	englishName: "Malayalam",
+	nativeName: "മലയാളം",
+	language: "ml",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ക"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["ഞായറാഴ്ച","തിങ്കളാഴ്ച","ചൊവ്വാഴ്ച","ബുധനാഴ്ച","വ്യാഴാഴ്ച","വെള്ളിയാഴ്ച","ശനിയാഴ്ച"],
+				namesAbbr: ["ഞായർ.","തിങ്കൾ.","ചൊവ്വ.","ബുധൻ.","വ്യാഴം.","വെള്ളി.","ശനി."],
+				namesShort: ["ഞ","ത","ച","ബ","വ","വെ","ശ"]
+			},
+			months: {
+				names: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""],
+				namesAbbr: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""]
+			},
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "as", "default", {
+	name: "as",
+	englishName: "Assamese",
+	nativeName: "অসমীয়া",
+	language: "as",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","n$"],
+			groupSizes: [3,2],
+			symbol: "ট"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্রবাৰ","শনিবাৰ","ৰবিবাৰ"],
+				namesAbbr: ["সোম.","মঙ্গল.","বুধ.","বৃহ.","শুক্র.","শনি.","ৰবি."],
+				namesShort: ["সো","ম","বু","বৃ","শু","শ","র"]
+			},
+			months: {
+				names: ["জানুৱাৰী","ফেব্রুৱাৰী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টেম্বর","অক্টোবর","নবেম্বর","ডিচেম্বর",""],
+				namesAbbr: ["জানু","ফেব্রু","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টে","অক্টো","নবে","ডিচে",""]
+			},
+			AM: ["ৰাতিপু","ৰাতিপু","ৰাতিপু"],
+			PM: ["আবেলি","আবেলি","আবেলি"],
+			eras: [{"name":"খ্রীষ্টাব্দ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "yyyy,MMMM dd, dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy,MMMM dd, dddd tt h:mm",
+				F: "yyyy,MMMM dd, dddd tt h:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM,yy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mr", "default", {
+	name: "mr",
+	englishName: "Marathi",
+	nativeName: "मराठी",
+	language: "mr",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर",""],
+				namesAbbr: ["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें.",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sa", "default", {
+	name: "sa",
+	englishName: "Sanskrit",
+	nativeName: "संस्कृत",
+	language: "sa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesAbbr: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn", "default", {
+	name: "mn",
+	englishName: "Mongolian",
+	nativeName: "Монгол хэл",
+	language: "mn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bo", "default", {
+	name: "bo",
+	englishName: "Tibetan",
+	nativeName: "བོད་ཡིག",
+	language: "bo",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ཨང་ཀི་མིན་པ།",
+		negativeInfinity: "མོ་གྲངས་ཚད་མེད་ཆུང་བ།",
+		positiveInfinity: "ཕོ་གྲངས་ཚད་མེད་ཆེ་བ།",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["གཟའ་ཉི་མ།","གཟའ་ཟླ་བ།","གཟའ་མིག་དམར།","གཟའ་ལྷག་པ།","གཟའ་ཕུར་བུ།","གཟའ་པ་སངས།","གཟའ་སྤེན་པ།"],
+				namesAbbr: ["ཉི་མ།","ཟླ་བ།","མིག་དམར།","ལྷག་པ།","ཕུར་བུ།","པ་སངས།","སྤེན་པ།"],
+				namesShort: ["༧","༡","༢","༣","༤","༥","༦"]
+			},
+			months: {
+				names: ["སྤྱི་ཟླ་དང་པོ།","སྤྱི་ཟླ་གཉིས་པ།","སྤྱི་ཟླ་གསུམ་པ།","སྤྱི་ཟླ་བཞི་པ།","སྤྱི་ཟླ་ལྔ་པ།","སྤྱི་ཟླ་དྲུག་པ།","སྤྱི་ཟླ་བདུན་པ།","སྤྱི་ཟླ་བརྒྱད་པ།","སྤྱི་ཟླ་དགུ་པ།","སྤྱི་ཟླ་བཅུ་པོ།","སྤྱི་ཟླ་བཅུ་གཅིག་པ།","སྤྱི་ཟླ་བཅུ་གཉིས་པ།",""],
+				namesAbbr: ["ཟླ་ ༡","ཟླ་ ༢","ཟླ་ ༣","ཟླ་ ༤","ཟླ་ ༥","ཟླ་ ༦","ཟླ་ ༧","ཟླ་ ༨","ཟླ་ ༩","ཟླ་ ༡༠","ཟླ་ ༡༡","ཟླ་ ༡༢",""]
+			},
+			AM: ["སྔ་དྲོ","སྔ་དྲོ","སྔ་དྲོ"],
+			PM: ["ཕྱི་དྲོ","ཕྱི་དྲོ","ཕྱི་དྲོ"],
+			eras: [{"name":"སྤྱི་ལོ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ལོའི་ཟླ' M'ཚེས' d",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm",
+				F: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm:ss",
+				M: "'ཟླ་' M'ཚེས'd",
+				Y: "yyyy.M"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "cy", "default", {
+	name: "cy",
+	englishName: "Welsh",
+	nativeName: "Cymraeg",
+	language: "cy",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],
+				namesAbbr: ["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],
+				namesShort: ["Su","Ll","Ma","Me","Ia","Gw","Sa"]
+			},
+			months: {
+				names: ["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr",""],
+				namesAbbr: ["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "km", "default", {
+	name: "km",
+	englishName: "Khmer",
+	nativeName: "ខ្មែរ",
+	language: "km",
+	numberFormat: {
+		pattern: ["- n"],
+		groupSizes: [3,0],
+		NaN: "NAN",
+		negativeInfinity: "-- អនន្ត",
+		positiveInfinity: "អនន្ត",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			symbol: "៛"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ថ្ងៃអាទិត្យ","ថ្ងៃច័ន្ទ","ថ្ងៃអង្គារ","ថ្ងៃពុធ","ថ្ងៃព្រហស្បតិ៍","ថ្ងៃសុក្រ","ថ្ងៃសៅរ៍"],
+				namesAbbr: ["អាទិ.","ច.","អ.","ពុ","ព្រហ.","សុ.","ស."],
+				namesShort: ["អា","ច","អ","ពុ","ព្","សុ","ស"]
+			},
+			months: {
+				names: ["មករា","កុម្ភៈ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ",""],
+				namesAbbr: ["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"មុនគ.ស.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy H:mm tt",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "'ថ្ងៃទី' dd 'ខែ' MM",
+				Y: "'ខែ' MM 'ឆ្នាំ' yyyy"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm tt",
+				F: "dddd, MMMM dd, yyyy HH:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lo", "default", {
+	name: "lo",
+	englishName: "Lao",
+	nativeName: "ລາວ",
+	language: "lo",
+	numberFormat: {
+		pattern: ["(n)"],
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["(n$)","n$"],
+			groupSizes: [3,0],
+			symbol: "₭"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],
+				namesAbbr: ["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],
+				namesShort: ["ອ","ຈ","ອ","ພ","ພ","ສ","ເ"]
+			},
+			months: {
+				names: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""],
+				namesAbbr: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""]
+			},
+			AM: ["ເຊົ້າ","ເຊົ້າ","ເຊົ້າ"],
+			PM: ["ແລງ","ແລງ","ແລງ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy H:mm tt",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gl", "default", {
+	name: "gl",
+	englishName: "Galician",
+	nativeName: "galego",
+	language: "gl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","luns","martes","mércores","xoves","venres","sábado"],
+				namesAbbr: ["dom","luns","mar","mér","xov","ven","sáb"],
+				namesShort: ["do","lu","ma","mé","xo","ve","sá"]
+			},
+			months: {
+				names: ["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro",""],
+				namesAbbr: ["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kok", "default", {
+	name: "kok",
+	englishName: "Konkani",
+	nativeName: "कोंकणी",
+	language: "kok",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],
+				namesAbbr: ["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],
+				namesShort: ["आ","स","म","ब","ब","स","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""],
+				namesAbbr: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "syr", "default", {
+	name: "syr",
+	englishName: "Syriac",
+	nativeName: "ܣܘܪܝܝܐ",
+	language: "syr",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],
+				namesAbbr: ["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],
+				namesShort: ["ܐ","ܒ","ܓ","ܕ","ܗ","ܥ","ܫ"]
+			},
+			months: {
+				names: ["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ",""],
+				namesAbbr: ["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ",""]
+			},
+			AM: ["ܩ.ܛ","ܩ.ܛ","ܩ.ܛ"],
+			PM: ["ܒ.ܛ","ܒ.ܛ","ܒ.ܛ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "si", "default", {
+	name: "si",
+	englishName: "Sinhala",
+	nativeName: "සිංහල",
+	language: "si",
+	numberFormat: {
+		groupSizes: [3,2],
+		negativeInfinity: "-අනන්තය",
+		positiveInfinity: "අනන්තය",
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "රු."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],
+				namesAbbr: ["ඉරිදා","සඳුදා","කුජදා","බුදදා","ගුරුදා","කිවිදා","ශනිදා"],
+				namesShort: ["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"]
+			},
+			months: {
+				names: ["ජනවාරි","පෙබරවාරි","මාර්තු","අ‌ප්‍රේල්","මැයි","ජූනි","ජූලි","අ‌ගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්",""],
+				namesAbbr: ["ජන.","පෙබ.","මාර්තු.","අප්‍රේල්.","මැයි.","ජූනි.","ජූලි.","අගෝ.","සැප්.","ඔක්.","නොවැ.","දෙසැ.",""]
+			},
+			AM: ["පෙ.ව.","පෙ.ව.","පෙ.ව."],
+			PM: ["ප.ව.","ප.ව.","ප.ව."],
+			eras: [{"name":"ක්‍රි.ව.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy MMMM' මස 'dd' වැනිදා 'dddd",
+				f: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm tt",
+				F: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm:ss tt",
+				Y: "yyyy MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu", "default", {
+	name: "iu",
+	englishName: "Inuktitut",
+	nativeName: "Inuktitut",
+	language: "iu",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "am", "default", {
+	name: "am",
+	englishName: "Amharic",
+	nativeName: "አማርኛ",
+	language: "am",
+	numberFormat: {
+		decimals: 1,
+		groupSizes: [3,0],
+		NaN: "NAN",
+		percent: {
+			pattern: ["-n%","n%"],
+			decimals: 1,
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			groupSizes: [3,0],
+			symbol: "ETB"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
+			},
+			months: {
+				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
+				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
+			},
+			AM: ["ጡዋት","ጡዋት","ጡዋት"],
+			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
+			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd '፣' MMMM d 'ቀን' yyyy",
+				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
+				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
+				M: "MMMM d ቀን",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tzm", "default", {
+	name: "tzm",
+	englishName: "Tamazight",
+	nativeName: "Tamazight",
+	language: "tzm",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ne", "default", {
+	name: "ne",
+	englishName: "Nepali",
+	nativeName: "नेपाली",
+	language: "ne",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["आइतवार","सोमवार","मङ्गलवार","बुधवार","बिहीवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],
+				namesShort: ["आ","सो","म","बु","बि","शु","श"]
+			},
+			months: {
+				names: ["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जून","जुलाई","अगस्त","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर",""],
+				namesAbbr: ["जन","फेब","मार्च","अप्रिल","मे","जून","जुलाई","अग","सेप्ट","अक्ट","नोभ","डिस",""]
+			},
+			AM: ["विहानी","विहानी","विहानी"],
+			PM: ["बेलुकी","बेलुकी","बेलुकी"],
+			eras: [{"name":"a.d.","start":null,"offset":0}],
+			patterns: {
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fy", "default", {
+	name: "fy",
+	englishName: "Frisian",
+	nativeName: "Frysk",
+	language: "fy",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],
+				namesAbbr: ["Sn","Mo","Ti","Wo","To","Fr","Sn"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["jannewaris","febrewaris","maart","april","maaie","juny","july","augustus","septimber","oktober","novimber","desimber",""],
+				namesAbbr: ["jann","febr","mrt","apr","maaie","jun","jul","aug","sept","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ps", "default", {
+	name: "ps",
+	englishName: "Pashto",
+	nativeName: "پښتو",
+	language: "ps",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": "،",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": "،",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			",": "٬",
+			".": "٫",
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښزمرى","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښ","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fil", "default", {
+	name: "fil",
+	englishName: "Filipino",
+	nativeName: "Filipino",
+	language: "fil",
+	numberFormat: {
+		currency: {
+			symbol: "PhP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Linggo","Lunes","Martes","Mierkoles","Huebes","Biernes","Sabado"],
+				namesAbbr: ["Lin","Lun","Mar","Mier","Hueb","Bier","Saba"],
+				namesShort: ["L","L","M","M","H","B","S"]
+			},
+			months: {
+				names: ["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septyembre","Oktubre","Nobyembre","Disyembre",""],
+				namesAbbr: ["En","Peb","Mar","Abr","Mayo","Hun","Hul","Agos","Sept","Okt","Nob","Dis",""]
+			},
+			eras: [{"name":"Anno Domini","start":null,"offset":0}]
+		}
+	}
+});
+
+Globalize.addCultureInfo( "dv", "default", {
+	name: "dv",
+	englishName: "Divehi",
+	nativeName: "ދިވެހިބަސް",
+	language: "dv",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["n $-","n $"],
+			symbol: "ރ."
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""],
+				namesAbbr: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd/MM/yyyy HH:mm",
+				F: "dd/MM/yyyy HH:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""],
+				namesAbbr: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"މީލާދީ","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yy",
+				D: "ddd, yyyy MMMM dd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "ddd, yyyy MMMM dd HH:mm",
+				F: "ddd, yyyy MMMM dd HH:mm:ss",
+				Y: "yyyy, MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ha", "default", {
+	name: "ha",
+	englishName: "Hausa",
+	nativeName: "Hausa",
+	language: "ha",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "yo", "default", {
+	name: "yo",
+	englishName: "Yoruba",
+	nativeName: "Yoruba",
+	language: "yo",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Osu kinni","Osu keji","Osu keta","Osu kerin","Osu karun","Osu kefa","Osu keje","Osu kejo","Osu kesan","Osu kewa","Osu kokanla","Osu keresi",""],
+				namesAbbr: ["kin.","kej.","ket.","ker.","kar.","kef.","kej.","kej.","kes.","kew.","kok.","ker.",""]
+			},
+			AM: ["Owuro","owuro","OWURO"],
+			PM: ["Ale","ale","ALE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "quz", "default", {
+	name: "quz",
+	englishName: "Quechua",
+	nativeName: "runasimi",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nso", "default", {
+	name: "nso",
+	englishName: "Sesotho sa Leboa",
+	nativeName: "Sesotho sa Leboa",
+	language: "nso",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],
+				namesAbbr: ["Lam","Moš","Lbb","Lbr","Lbn","Lbh","Mok"],
+				namesShort: ["L","M","L","L","L","L","M"]
+			},
+			months: {
+				names: ["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole",""],
+				namesAbbr: ["Pher","Hlak","Mop","Mor","Mos","Ngwat","Phup","Phat","Lew","Dip","Dib","Man",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ba", "default", {
+	name: "ba",
+	englishName: "Bashkir",
+	nativeName: "Башҡорт",
+	language: "ba",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ",",
+			symbol: "һ."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Йәкшәмбе","Дүшәмбе","Шишәмбе","Шаршамбы","Кесаҙна","Йома","Шәмбе"],
+				namesAbbr: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"],
+				namesShort: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"]
+			},
+			months: {
+				names: ["ғинуар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь",""],
+				namesAbbr: ["ғин","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy 'й'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'й' H:mm",
+				F: "d MMMM yyyy 'й' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lb", "default", {
+	name: "lb",
+	englishName: "Luxembourgish",
+	nativeName: "Lëtzebuergesch",
+	language: "lb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "n. num.",
+		negativeInfinity: "-onendlech",
+		positiveInfinity: "+onendlech",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],
+				namesAbbr: ["Son","Méi","Dën","Mët","Don","Fre","Sam"],
+				namesShort: ["So","Mé","Dë","Më","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kl", "default", {
+	name: "kl",
+	englishName: "Greenlandic",
+	nativeName: "kalaallisut",
+	language: "kl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			groupSizes: [3,0],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],
+				namesAbbr: ["sap","ata","mar","ping","sis","tal","arf"],
+				namesShort: ["sa","at","ma","pi","si","ta","ar"]
+			},
+			months: {
+				names: ["januari","februari","martsi","apriili","maaji","juni","juli","aggusti","septembari","oktobari","novembari","decembari",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ig", "default", {
+	name: "ig",
+	englishName: "Igbo",
+	nativeName: "Igbo",
+	language: "ig",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Onwa mbu","Onwa ibua","Onwa ato","Onwa ano","Onwa ise","Onwa isi","Onwa asa","Onwa asato","Onwa itolu","Onwa iri","Onwa iri n'ofu","Onwa iri n'ibua",""],
+				namesAbbr: ["mbu.","ibu.","ato.","ano.","ise","isi","asa","asa.","ito.","iri.","n'of.","n'ib.",""]
+			},
+			AM: ["Ututu","ututu","UTUTU"],
+			PM: ["Efifie","efifie","EFIFIE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ii", "default", {
+	name: "ii",
+	englishName: "Yi",
+	nativeName: "ꆈꌠꁱꂷ",
+	language: "ii",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ꌗꂷꀋꉬ",
+		negativeInfinity: "ꀄꊭꌐꀋꉆ",
+		positiveInfinity: "ꈤꇁꑖꀋꉬ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ꑭꆏꑍ","ꆏꊂ꒔","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],
+				namesAbbr: ["ꑭꆏ","ꆏ꒔","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],
+				namesShort: ["ꆏ","꒔","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"]
+			},
+			months: {
+				names: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""],
+				namesAbbr: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""]
+			},
+			AM: ["ꂵꆪꈌꈐ","ꂵꆪꈌꈐ","ꂵꆪꈌꈐ"],
+			PM: ["ꂵꆪꈌꉈ","ꂵꆪꈌꉈ","ꂵꆪꈌꉈ"],
+			eras: [{"name":"ꇬꑼ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ꈎ' M'ꆪ' d'ꑍ'",
+				t: "tt h:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ꈎ' M'ꆪ' d'ꑍ' tt h:mm",
+				F: "yyyy'ꈎ' M'ꆪ' d'ꑍ' H:mm:ss",
+				M: "M'ꆪ' d'ꑍ'",
+				Y: "yyyy'ꈎ' M'ꆪ'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "arn", "default", {
+	name: "arn",
+	englishName: "Mapudungun",
+	nativeName: "Mapudungun",
+	language: "arn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "moh", "default", {
+	name: "moh",
+	englishName: "Mohawk",
+	nativeName: "Kanien'kéha",
+	language: "moh",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Awentatokentì:ke","Awentataón'ke","Ratironhia'kehronòn:ke","Soséhne","Okaristiiáhne","Ronwaia'tanentaktonhne","Entákta"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["Tsothohrkó:Wa","Enniska","Enniskó:Wa","Onerahtókha","Onerahtohkó:Wa","Ohiari:Ha","Ohiarihkó:Wa","Seskéha","Seskehkó:Wa","Kenténha","Kentenhkó:Wa","Tsothóhrha",""]
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "br", "default", {
+	name: "br",
+	englishName: "Breton",
+	nativeName: "brezhoneg",
+	language: "br",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NkN",
+		negativeInfinity: "-Anfin",
+		positiveInfinity: "+Anfin",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],
+				namesAbbr: ["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],
+				namesShort: ["Su","Lu","Mz","Mc","Ya","Gw","Sa"]
+			},
+			months: {
+				names: ["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu",""],
+				namesAbbr: ["Gen.","C'hwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"g. J.-K.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ug", "default", {
+	name: "ug",
+	englishName: "Uyghur",
+	nativeName: "ئۇيغۇرچە",
+	language: "ug",
+	isRTL: true,
+	numberFormat: {
+		NaN: "سان ئەمەس",
+		negativeInfinity: "مەنپىي چەكسىزلىك",
+		positiveInfinity: "مۇسبەت چەكسىزلىك",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],
+				namesAbbr: ["يە","دۈ","سە","چا","پە","جۈ","شە"],
+				namesShort: ["ي","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""],
+				namesAbbr: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""]
+			},
+			AM: ["چۈشتىن بۇرۇن","چۈشتىن بۇرۇن","چۈشتىن بۇرۇن"],
+			PM: ["چۈشتىن كېيىن","چۈشتىن كېيىن","چۈشتىن كېيىن"],
+			eras: [{"name":"مىلادى","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-M-d",
+				D: "yyyy-'يىلى' MMMM d-'كۈنى،'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm",
+				F: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm:ss",
+				M: "MMMM d'-كۈنى'",
+				Y: "yyyy-'يىلى' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mi", "default", {
+	name: "mi",
+	englishName: "Maori",
+	nativeName: "Reo Māori",
+	language: "mi",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],
+				namesAbbr: ["Ta","Hi","Tū","Apa","Pa","Me","Ho"],
+				namesShort: ["Ta","Hi","Tū","Aa","Pa","Me","Ho"]
+			},
+			months: {
+				names: ["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngongoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea",""],
+				namesAbbr: ["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM, yyyy",
+				f: "dddd, dd MMMM, yyyy h:mm tt",
+				F: "dddd, dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM, yy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "oc", "default", {
+	name: "oc",
+	englishName: "Occitan",
+	nativeName: "Occitan",
+	language: "oc",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numeric",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "+Infinit",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],
+				namesAbbr: ["dim.","lun.","mar.","mèc.","jòu.","ven.","sab."],
+				namesShort: ["di","lu","ma","mè","jò","ve","sa"]
+			},
+			months: {
+				names: ["genier","febrier","març","abril","mai","junh","julh","agost","setembre","octobre","novembre","desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			monthsGenitive: {
+				names: ["de genier","de febrier","de març","d'abril","de mai","de junh","de julh","d'agost","de setembre","d'octobre","de novembre","de desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"après Jèsus-Crist","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd,' lo 'd MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd,' lo 'd MMMM' de 'yyyy HH:mm",
+				F: "dddd,' lo 'd MMMM' de 'yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "co", "default", {
+	name: "co",
+	englishName: "Corsican",
+	nativeName: "Corsu",
+	language: "co",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Mica numericu",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "+Infinitu",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumenica","luni","marti","mercuri","ghjovi","venderi","sabbatu"],
+				namesAbbr: ["dum.","lun.","mar.","mer.","ghj.","ven.","sab."],
+				namesShort: ["du","lu","ma","me","gh","ve","sa"]
+			},
+			months: {
+				names: ["ghjennaghju","ferraghju","marzu","aprile","maghju","ghjunghju","lugliu","aostu","settembre","ottobre","nuvembre","dicembre",""],
+				namesAbbr: ["ghje","ferr","marz","apri","magh","ghju","lugl","aost","sett","otto","nuve","dice",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"dopu J-C","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gsw", "default", {
+	name: "gsw",
+	englishName: "Alsatian",
+	nativeName: "Elsässisch",
+	language: "gsw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Ohne Nummer",
+		negativeInfinity: "-Unendlich",
+		positiveInfinity: "+Unendlich",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sundàà","Mondàà","Dienschdàà","Mittwuch","Dunnerschdàà","Fridàà","Sàmschdàà"],
+				namesAbbr: ["Su.","Mo.","Di.","Mi.","Du.","Fr.","Sà."],
+				namesShort: ["Su","Mo","Di","Mi","Du","Fr","Sà"]
+			},
+			months: {
+				names: ["Jänner","Feverje","März","Àpril","Mai","Jüni","Jüli","Augscht","September","Oktower","Nowember","Dezember",""],
+				namesAbbr: ["Jän.","Fev.","März","Apr.","Mai","Jüni","Jüli","Aug.","Sept.","Okt.","Now.","Dez.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"Vor J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sah", "default", {
+	name: "sah",
+	englishName: "Yakut",
+	nativeName: "саха",
+	language: "sah",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NAN",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "с."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],
+				namesAbbr: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"],
+				namesShort: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"]
+			},
+			months: {
+				names: ["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйа","Бэс ыйа","От ыйа","Атырдьах ыйа","Балаҕан ыйа","Алтынньы","Сэтинньи","Ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			monthsGenitive: {
+				names: ["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "MM.dd.yyyy",
+				D: "MMMM d yyyy 'с.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d yyyy 'с.' H:mm",
+				F: "MMMM d yyyy 'с.' H:mm:ss",
+				Y: "MMMM yyyy 'с.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "qut", "default", {
+	name: "qut",
+	englishName: "K'iche",
+	nativeName: "K'iche",
+	language: "qut",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["juq'ij","kaq'ij","oxq'ij","kajq'ij","joq'ij","waqq'ij","wuqq'ij"],
+				namesAbbr: ["juq","kaq","oxq","kajq","joq","waqq","wuqq"],
+				namesShort: ["ju","ka","ox","ka","jo","wa","wu"]
+			},
+			months: {
+				names: ["nab'e ik'","ukab' ik'","rox ik'","ukaj ik'","uro' ik'","uwaq ik'","uwuq ik'","uwajxaq ik'","ub'elej ik'","ulaj ik'","ujulaj ik'","ukab'laj ik'",""],
+				namesAbbr: ["nab'e","ukab","rox","ukaj","uro","uwaq","uwuq","uwajxaq","ub'elej","ulaj","ujulaj","ukab'laj",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "rw", "default", {
+	name: "rw",
+	englishName: "Kinyarwanda",
+	nativeName: "Kinyarwanda",
+	language: "rw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "RWF"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Ku cyumweru"],
+				namesAbbr: ["mbe.","kab.","gat.","kan.","gat.","gat.","cyu."],
+				namesShort: ["mb","ka","ga","ka","ga","ga","cy"]
+			},
+			months: {
+				names: ["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza",""],
+				namesAbbr: ["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukwa","Ugu","Uku",""]
+			},
+			AM: ["saa moya z.m.","saa moya z.m.","SAA MOYA Z.M."],
+			PM: ["saa moya z.n.","saa moya z.n.","SAA MOYA Z.N."],
+			eras: [{"name":"AD","start":null,"offset":0}]
+		}
+	}
+});
+
+Globalize.addCultureInfo( "wo", "default", {
+	name: "wo",
+	englishName: "Wolof",
+	nativeName: "Wolof",
+	language: "wo",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "XOF"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "prs", "default", {
+	name: "prs",
+	englishName: "Dari",
+	nativeName: "درى",
+	language: "prs",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 5,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 5,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gd", "default", {
+	name: "gd",
+	englishName: "Scottish Gaelic",
+	nativeName: "Gàidhlig",
+	language: "gd",
+	numberFormat: {
+		negativeInfinity: "-Neo-chrìochnachd",
+		positiveInfinity: "Neo-chrìochnachd",
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],
+				namesAbbr: ["Dòm","Lua","Mài","Cia","Ard","Hao","Sat"],
+				namesShort: ["D","L","M","C","A","H","S"]
+			},
+			months: {
+				names: ["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd",""],
+				namesAbbr: ["Fao","Gea","Màr","Gib","Cèi","Ògm","Iuc","Lùn","Sul","Dàm","Sam","Dùb",""]
+			},
+			AM: ["m","m","M"],
+			PM: ["f","f","F"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-SA", "default", {
+	name: "ar-SA",
+	englishName: "Arabic (Saudi Arabia)",
+	nativeName: "العربية (المملكة العربية السعودية)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bg-BG", "default", {
+	name: "bg-BG",
+	englishName: "Bulgarian (Bulgaria)",
+	nativeName: "български (България)",
+	language: "bg",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "- безкрайност",
+		positiveInfinity: "+ безкрайност",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "лв."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],
+				namesAbbr: ["нед","пон","вт","ср","четв","пет","съб"],
+				namesShort: ["н","п","в","с","ч","п","с"]
+			},
+			months: {
+				names: ["януари","февруари","март","април","май","юни","юли","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["ян","февр","март","апр","май","юни","юли","авг","септ","окт","ноември","дек",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"след новата ера","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy 'г.'",
+				D: "dd MMMM yyyy 'г.'",
+				t: "HH:mm 'ч.'",
+				T: "HH:mm:ss 'ч.'",
+				f: "dd MMMM yyyy 'г.' HH:mm 'ч.'",
+				F: "dd MMMM yyyy 'г.' HH:mm:ss 'ч.'",
+				M: "dd MMMM",
+				Y: "MMMM yyyy 'г.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ca-ES", "default", {
+	name: "ca-ES",
+	englishName: "Catalan (Catalan)",
+	nativeName: "català (català)",
+	language: "ca",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "Infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],
+				namesAbbr: ["dg.","dl.","dt.","dc.","dj.","dv.","ds."],
+				namesShort: ["dg","dl","dt","dc","dj","dv","ds"]
+			},
+			months: {
+				names: ["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre",""],
+				namesAbbr: ["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' / 'MMMM' / 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' / 'MMMM' / 'yyyy HH:mm",
+				F: "dddd, d' / 'MMMM' / 'yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' / 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-TW", "default", {
+	name: "zh-TW",
+	englishName: "Chinese (Traditional, Taiwan)",
+	nativeName: "中文(台灣)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "不是一個數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "NT$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"西元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt hh:mm",
+				F: "yyyy'年'M'月'd'日' tt hh:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Taiwan: {
+			name: "Taiwan",
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"","start":null,"offset":1911}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt hh:mm",
+				F: "yyyy'年'M'月'd'日' tt hh:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "cs-CZ", "default", {
+	name: "cs-CZ",
+	englishName: "Czech (Czech Republic)",
+	nativeName: "čeština (Česká republika)",
+	language: "cs",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Není číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Kč"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],
+				namesAbbr: ["ne","po","út","st","čt","pá","so"],
+				namesShort: ["ne","po","út","st","čt","pá","so"]
+			},
+			months: {
+				names: ["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["ledna","února","března","dubna","května","června","července","srpna","září","října","listopadu","prosince",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["dop.","dop.","DOP."],
+			PM: ["odp.","odp.","ODP."],
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "da-DK", "default", {
+	name: "da-DK",
+	englishName: "Danish (Denmark)",
+	nativeName: "dansk (Danmark)",
+	language: "da",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-DE", "default", {
+	name: "de-DE",
+	englishName: "German (Germany)",
+	nativeName: "Deutsch (Deutschland)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "el-GR", "default", {
+	name: "el-GR",
+	englishName: "Greek (Greece)",
+	nativeName: "Ελληνικά (Ελλάδα)",
+	language: "el",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "μη αριθμός",
+		negativeInfinity: "-Άπειρο",
+		positiveInfinity: "Άπειρο",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],
+				namesAbbr: ["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],
+				namesShort: ["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"]
+			},
+			months: {
+				names: ["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			monthsGenitive: {
+				names: ["Ιανουαρίου","Φεβρουαρίου","Μαρτίου","Απριλίου","Μαΐου","Ιουνίου","Ιουλίου","Αυγούστου","Σεπτεμβρίου","Οκτωβρίου","Νοεμβρίου","Δεκεμβρίου",""],
+				namesAbbr: ["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ",""]
+			},
+			AM: ["πμ","πμ","ΠΜ"],
+			PM: ["μμ","μμ","ΜΜ"],
+			eras: [{"name":"μ.Χ.","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-US", "default", {
+	name: "en-US",
+	englishName: "English (United States)"
+});
+
+Globalize.addCultureInfo( "fi-FI", "default", {
+	name: "fi-FI",
+	englishName: "Finnish (Finland)",
+	nativeName: "suomi (Suomi)",
+	language: "fi",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],
+				namesAbbr: ["su","ma","ti","ke","to","pe","la"],
+				namesShort: ["su","ma","ti","ke","to","pe","la"]
+			},
+			months: {
+				names: ["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu",""],
+				namesAbbr: ["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM'ta 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM'ta 'yyyy H:mm",
+				F: "d. MMMM'ta 'yyyy H:mm:ss",
+				M: "d. MMMM'ta'",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-FR", "default", {
+	name: "fr-FR",
+	englishName: "French (France)",
+	nativeName: "français (France)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "he-IL", "default", {
+	name: "he-IL",
+	englishName: "Hebrew (Israel)",
+	nativeName: "עברית (ישראל)",
+	language: "he",
+	isRTL: true,
+	numberFormat: {
+		NaN: "לא מספר",
+		negativeInfinity: "אינסוף שלילי",
+		positiveInfinity: "אינסוף חיובי",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "₪"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר",""],
+				namesAbbr: ["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ",""]
+			},
+			eras: [{"name":"לספירה","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Hebrew: {
+			name: "Hebrew",
+			"/": " ",
+			days: {
+				names: ["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],
+				namesAbbr: ["א","ב","ג","ד","ה","ו","ש"],
+				namesShort: ["א","ב","ג","ד","ה","ו","ש"]
+			},
+			months: {
+				names: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"],
+				namesAbbr: ["תשרי","חשון","כסלו","טבת","שבט","אדר","אדר ב","ניסן","אייר","סיון","תמוז","אב","אלול"]
+			},
+			eras: [{"name":"C.E.","start":null,"offset":0}],
+			twoDigitYearMax: 5790,
+			patterns: {
+				d: "dd MMMM yyyy",
+				D: "dddd dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd dd MMMM yyyy HH:mm",
+				F: "dddd dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hu-HU", "default", {
+	name: "hu-HU",
+	englishName: "Hungarian (Hungary)",
+	nativeName: "magyar (Magyarország)",
+	language: "hu",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nem szám",
+		negativeInfinity: "negatív végtelen",
+		positiveInfinity: "végtelen",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Ft"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],
+				namesAbbr: ["V","H","K","Sze","Cs","P","Szo"],
+				namesShort: ["V","H","K","Sze","Cs","P","Szo"]
+			},
+			months: {
+				names: ["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december",""],
+				namesAbbr: ["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec.",""]
+			},
+			AM: ["de.","de.","DE."],
+			PM: ["du.","du.","DU."],
+			eras: [{"name":"i.sz.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "yyyy. MMMM d.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy. MMMM d. H:mm",
+				F: "yyyy. MMMM d. H:mm:ss",
+				M: "MMMM d.",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "is-IS", "default", {
+	name: "is-IS",
+	englishName: "Icelandic (Iceland)",
+	nativeName: "íslenska (Ísland)",
+	language: "is",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],
+				namesAbbr: ["sun.","mán.","þri.","mið.","fim.","fös.","lau."],
+				namesShort: ["su","má","þr","mi","fi","fö","la"]
+			},
+			months: {
+				names: ["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember",""],
+				namesAbbr: ["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "it-IT", "default", {
+	name: "it-IT",
+	englishName: "Italian (Italy)",
+	nativeName: "italiano (Italia)",
+	language: "it",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ja-JP", "default", {
+	name: "ja-JP",
+	englishName: "Japanese (Japan)",
+	nativeName: "日本語 (日本)",
+	language: "ja",
+	numberFormat: {
+		NaN: "NaN (非数値)",
+		negativeInfinity: "-∞",
+		positiveInfinity: "+∞",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"西暦","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		},
+		Japanese: {
+			name: "Japanese",
+			days: {
+				names: ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],
+				namesAbbr: ["日","月","火","水","木","金","土"],
+				namesShort: ["日","月","火","水","木","金","土"]
+			},
+			months: {
+				names: ["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["午前","午前","午前"],
+			PM: ["午後","午後","午後"],
+			eras: [{"name":"平成","start":null,"offset":1867},{"name":"昭和","start":-1812153600000,"offset":1911},{"name":"大正","start":-1357603200000,"offset":1925},{"name":"明治","start":60022080000,"offset":1988}],
+			twoDigitYearMax: 99,
+			patterns: {
+				d: "gg y/M/d",
+				D: "gg y'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "gg y'年'M'月'd'日' H:mm",
+				F: "gg y'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "gg y'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ko-KR", "default", {
+	name: "ko-KR",
+	englishName: "Korean (Korea)",
+	nativeName: "한국어 (대한민국)",
+	language: "ko",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			decimals: 0,
+			symbol: "₩"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"서기","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "yyyy'년' M'월'"
+			}
+		},
+		Korean: {
+			name: "Korean",
+			"/": "-",
+			days: {
+				names: ["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],
+				namesAbbr: ["일","월","화","수","목","금","토"],
+				namesShort: ["일","월","화","수","목","금","토"]
+			},
+			months: {
+				names: ["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: ["오전","오전","오전"],
+			PM: ["오후","오후","오후"],
+			eras: [{"name":"단기","start":null,"offset":-2333}],
+			twoDigitYearMax: 4362,
+			patterns: {
+				d: "gg yyyy-MM-dd",
+				D: "gg yyyy'년' M'월' d'일' dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "gg yyyy'년' M'월' d'일' dddd tt h:mm",
+				F: "gg yyyy'년' M'월' d'일' dddd tt h:mm:ss",
+				M: "M'월' d'일'",
+				Y: "gg yyyy'년' M'월'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nl-NL", "default", {
+	name: "nl-NL",
+	englishName: "Dutch (Netherlands)",
+	nativeName: "Nederlands (Nederland)",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nb-NO", "default", {
+	name: "nb-NO",
+	englishName: "Norwegian, Bokmål (Norway)",
+	nativeName: "norsk, bokmål (Norge)",
+	language: "nb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pl-PL", "default", {
+	name: "pl-PL",
+	englishName: "Polish (Poland)",
+	nativeName: "polski (Polska)",
+	language: "pl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "nie jest liczbą",
+		negativeInfinity: "-nieskończoność",
+		positiveInfinity: "+nieskończoność",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "zł"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],
+				namesAbbr: ["N","Pn","Wt","Śr","Cz","Pt","So"],
+				namesShort: ["N","Pn","Wt","Śr","Cz","Pt","So"]
+			},
+			months: {
+				names: ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			monthsGenitive: {
+				names: ["stycznia","lutego","marca","kwietnia","maja","czerwca","lipca","sierpnia","września","października","listopada","grudnia",""],
+				namesAbbr: ["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pt-BR", "default", {
+	name: "pt-BR",
+	englishName: "Portuguese (Brazil)",
+	nativeName: "Português (Brasil)",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "R$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro",""],
+				namesAbbr: ["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "rm-CH", "default", {
+	name: "rm-CH",
+	englishName: "Romansh (Switzerland)",
+	nativeName: "Rumantsch (Svizra)",
+	language: "rm",
+	numberFormat: {
+		",": "'",
+		NaN: "betg def.",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "+infinit",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumengia","glindesdi","mardi","mesemna","gievgia","venderdi","sonda"],
+				namesAbbr: ["du","gli","ma","me","gie","ve","so"],
+				namesShort: ["du","gli","ma","me","gie","ve","so"]
+			},
+			months: {
+				names: ["schaner","favrer","mars","avrigl","matg","zercladur","fanadur","avust","settember","october","november","december",""],
+				namesAbbr: ["schan","favr","mars","avr","matg","zercl","fan","avust","sett","oct","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"s. Cr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d MMMM yyyy HH:mm",
+				F: "dddd, d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ro-RO", "default", {
+	name: "ro-RO",
+	englishName: "Romanian (Romania)",
+	nativeName: "română (România)",
+	language: "ro",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "lei"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],
+				namesAbbr: ["D","L","Ma","Mi","J","V","S"],
+				namesShort: ["D","L","Ma","Mi","J","V","S"]
+			},
+			months: {
+				names: ["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie",""],
+				namesAbbr: ["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec.",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ru-RU", "default", {
+	name: "ru-RU",
+	englishName: "Russian (Russia)",
+	nativeName: "русский (Россия)",
+	language: "ru",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],
+				namesAbbr: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Вс","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			monthsGenitive: {
+				names: ["января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря",""],
+				namesAbbr: ["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'г.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'г.' H:mm",
+				F: "d MMMM yyyy 'г.' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hr-HR", "default", {
+	name: "hr-HR",
+	englishName: "Croatian (Croatia)",
+	nativeName: "hrvatski (Hrvatska)",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kn"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sk-SK", "default", {
+	name: "sk-SK",
+	englishName: "Slovak (Slovakia)",
+	nativeName: "slovenčina (Slovenská republika)",
+	language: "sk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Nie je číslo",
+		negativeInfinity: "-nekonečno",
+		positiveInfinity: "+nekonečno",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],
+				namesAbbr: ["ne","po","ut","st","št","pi","so"],
+				namesShort: ["ne","po","ut","st","št","pi","so"]
+			},
+			months: {
+				names: ["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			monthsGenitive: {
+				names: ["januára","februára","marca","apríla","mája","júna","júla","augusta","septembra","októbra","novembra","decembra",""],
+				namesAbbr: ["1","2","3","4","5","6","7","8","9","10","11","12",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. l.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sq-AL", "default", {
+	name: "sq-AL",
+	englishName: "Albanian (Albania)",
+	nativeName: "shqipe (Shqipëria)",
+	language: "sq",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-infinit",
+		positiveInfinity: "infinit",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": ".",
+			".": ",",
+			symbol: "Lek"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],
+				namesAbbr: ["Die","Hën","Mar","Mër","Enj","Pre","Sht"],
+				namesShort: ["Di","Hë","Ma","Më","En","Pr","Sh"]
+			},
+			months: {
+				names: ["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor",""],
+				namesAbbr: ["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj",""]
+			},
+			AM: ["PD","pd","PD"],
+			PM: ["MD","md","MD"],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy-MM-dd",
+				t: "h:mm.tt",
+				T: "h:mm:ss.tt",
+				f: "yyyy-MM-dd h:mm.tt",
+				F: "yyyy-MM-dd h:mm:ss.tt",
+				Y: "yyyy-MM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sv-SE", "default", {
+	name: "sv-SE",
+	englishName: "Swedish (Sweden)",
+	nativeName: "svenska (Sverige)",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "th-TH", "default", {
+	name: "th-TH",
+	englishName: "Thai (Thailand)",
+	nativeName: "ไทย (ไทย)",
+	language: "th",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "฿"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "ThaiBuddhist",
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			eras: [{"name":"พ.ศ.","start":null,"offset":-543}],
+			twoDigitYearMax: 2572,
+			patterns: {
+				d: "d/M/yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 1,
+			days: {
+				names: ["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],
+				namesAbbr: ["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],
+				namesShort: ["อ","จ","อ","พ","พ","ศ","ส"]
+			},
+			months: {
+				names: ["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม",""],
+				namesAbbr: ["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค.",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "'วัน'dddd'ที่' d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "'วัน'dddd'ที่' d MMMM yyyy H:mm",
+				F: "'วัน'dddd'ที่' d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tr-TR", "default", {
+	name: "tr-TR",
+	englishName: "Turkish (Turkey)",
+	nativeName: "Türkçe (Türkiye)",
+	language: "tr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "TL"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],
+				namesAbbr: ["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],
+				namesShort: ["Pz","Pt","Sa","Ça","Pe","Cu","Ct"]
+			},
+			months: {
+				names: ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık",""],
+				namesAbbr: ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ur-PK", "default", {
+	name: "ur-PK",
+	englishName: "Urdu (Islamic Republic of Pakistan)",
+	nativeName: "اُردو (پاکستان)",
+	language: "ur",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "Rs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesAbbr: ["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],
+				namesShort: ["ا","پ","م","ب","ج","ج","ه"]
+			},
+			months: {
+				names: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""],
+				namesAbbr: ["جنوری","فروری","مارچ","اپریل","مئی","جون","جولائی","اگست","ستمبر","اکتوبر","نومبر","دسمبر",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				f: "dd MMMM, yyyy h:mm tt",
+				F: "dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "id-ID", "default", {
+	name: "id-ID",
+	englishName: "Indonesian (Indonesia)",
+	nativeName: "Bahasa Indonesia (Indonesia)",
+	language: "id",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ",",
+			symbol: "Rp"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],
+				namesAbbr: ["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],
+				namesShort: ["M","S","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uk-UA", "default", {
+	name: "uk-UA",
+	englishName: "Ukrainian (Ukraine)",
+	nativeName: "українська (Україна)",
+	language: "uk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-безмежність",
+		positiveInfinity: "безмежність",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₴"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["неділя","понеділок","вівторок","середа","четвер","п'ятниця","субота"],
+				namesAbbr: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],
+				namesShort: ["Нд","Пн","Вт","Ср","Чт","Пт","Сб"]
+			},
+			months: {
+				names: ["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень",""],
+				namesAbbr: ["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру",""]
+			},
+			monthsGenitive: {
+				names: ["січня","лютого","березня","квітня","травня","червня","липня","серпня","вересня","жовтня","листопада","грудня",""],
+				namesAbbr: ["січ","лют","бер","кві","тра","чер","лип","сер","вер","жов","лис","гру",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy' р.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy' р.' H:mm",
+				F: "d MMMM yyyy' р.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy' р.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "be-BY", "default", {
+	name: "be-BY",
+	englishName: "Belarusian (Belarus)",
+	nativeName: "Беларускі (Беларусь)",
+	language: "be",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],
+				namesAbbr: ["нд","пн","аў","ср","чц","пт","сб"],
+				namesShort: ["нд","пн","аў","ср","чц","пт","сб"]
+			},
+			months: {
+				names: ["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			monthsGenitive: {
+				names: ["студзеня","лютага","сакавіка","красавіка","мая","чэрвеня","ліпеня","жніўня","верасня","кастрычніка","лістапада","снежня",""],
+				namesAbbr: ["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sl-SI", "default", {
+	name: "sl-SI",
+	englishName: "Slovenian (Slovenia)",
+	nativeName: "slovenski (Slovenija)",
+	language: "sl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-neskončnost",
+		positiveInfinity: "neskončnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],
+				namesAbbr: ["ned","pon","tor","sre","čet","pet","sob"],
+				namesShort: ["ne","po","to","sr","če","pe","so"]
+			},
+			months: {
+				names: ["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "et-EE", "default", {
+	name: "et-EE",
+	englishName: "Estonian (Estonia)",
+	nativeName: "eesti (Eesti)",
+	language: "et",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "avaldamatu",
+		negativeInfinity: "miinuslõpmatus",
+		positiveInfinity: "plusslõpmatus",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],
+				namesAbbr: ["P","E","T","K","N","R","L"],
+				namesShort: ["P","E","T","K","N","R","L"]
+			},
+			months: {
+				names: ["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember",""],
+				namesAbbr: ["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets",""]
+			},
+			AM: ["EL","el","EL"],
+			PM: ["PL","pl","PL"],
+			patterns: {
+				d: "d.MM.yyyy",
+				D: "d. MMMM yyyy'. a.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy'. a.' H:mm",
+				F: "d. MMMM yyyy'. a.' H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy'. a.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lv-LV", "default", {
+	name: "lv-LV",
+	englishName: "Latvian (Latvia)",
+	nativeName: "latviešu (Latvija)",
+	language: "lv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-bezgalība",
+		positiveInfinity: "bezgalība",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "Ls"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],
+				namesAbbr: ["sv","pr","ot","tr","ce","pk","se"],
+				namesShort: ["sv","pr","ot","tr","ce","pk","se"]
+			},
+			months: {
+				names: ["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			monthsGenitive: {
+				names: ["janvārī","februārī","martā","aprīlī","maijā","jūnijā","jūlijā","augustā","septembrī","oktobrī","novembrī","decembrī",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jūn","jūl","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd.",
+				D: "dddd, yyyy'. gada 'd. MMMM",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy'. gada 'd. MMMM H:mm",
+				F: "dddd, yyyy'. gada 'd. MMMM H:mm:ss",
+				M: "d. MMMM",
+				Y: "yyyy. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lt-LT", "default", {
+	name: "lt-LT",
+	englishName: "Lithuanian (Lithuania)",
+	nativeName: "lietuvių (Lietuva)",
+	language: "lt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-begalybė",
+		positiveInfinity: "begalybė",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Lt"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],
+				namesAbbr: ["Sk","Pr","An","Tr","Kt","Pn","Št"],
+				namesShort: ["S","P","A","T","K","Pn","Š"]
+			},
+			months: {
+				names: ["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			monthsGenitive: {
+				names: ["sausio","vasario","kovo","balandžio","gegužės","birželio","liepos","rugpjūčio","rugsėjo","spalio","lapkričio","gruodžio",""],
+				namesAbbr: ["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy.MM.dd",
+				D: "yyyy 'm.' MMMM d 'd.'",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'm.' MMMM d 'd.' HH:mm",
+				F: "yyyy 'm.' MMMM d 'd.' HH:mm:ss",
+				M: "MMMM d 'd.'",
+				Y: "yyyy 'm.' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tg-Cyrl-TJ", "default", {
+	name: "tg-Cyrl-TJ",
+	englishName: "Tajik (Cyrillic, Tajikistan)",
+	nativeName: "Тоҷикӣ (Тоҷикистон)",
+	language: "tg-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fa-IR", "default", {
+	name: "fa-IR",
+	englishName: "Persian",
+	nativeName: "فارسى (ایران)",
+	language: "fa",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		currency: {
+			pattern: ["$n-","$ n"],
+			".": "/",
+			symbol: "ريال"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["يكشنبه","دوشنبه","سه شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""],
+				namesAbbr: ["ژانويه","فوريه","مارس","آوريل","مى","ژوئن","ژوئيه","اوت","سپتامبر","اُكتبر","نوامبر","دسامبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "yyyy/MM/dd",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "yyyy/MM/dd hh:mm tt",
+				F: "yyyy/MM/dd hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ق.ظ","ق.ظ","ق.ظ"],
+			PM: ["ب.ظ","ب.ظ","ب.ظ"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "vi-VN", "default", {
+	name: "vi-VN",
+	englishName: "Vietnamese (Vietnam)",
+	nativeName: "Tiếng Việt (Việt Nam)",
+	language: "vi",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "₫"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],
+				namesAbbr: ["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],
+				namesShort: ["C","H","B","T","N","S","B"]
+			},
+			months: {
+				names: ["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai",""],
+				namesAbbr: ["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12",""]
+			},
+			AM: ["SA","sa","SA"],
+			PM: ["CH","ch","CH"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				f: "dd MMMM yyyy h:mm tt",
+				F: "dd MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hy-AM", "default", {
+	name: "hy-AM",
+	englishName: "Armenian (Armenia)",
+	nativeName: "Հայերեն (Հայաստան)",
+	language: "hy",
+	numberFormat: {
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "դր."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],
+				namesAbbr: ["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],
+				namesShort: ["Կ","Ե","Ե","Չ","Հ","Ո","Շ"]
+			},
+			months: {
+				names: ["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր",""],
+				namesAbbr: ["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM, yyyy H:mm",
+				F: "d MMMM, yyyy H:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az-Latn-AZ", "default", {
+	name: "az-Latn-AZ",
+	englishName: "Azeri (Latin, Azerbaijan)",
+	nativeName: "Azərbaycan­ılı (Azərbaycan)",
+	language: "az-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "eu-ES", "default", {
+	name: "eu-ES",
+	englishName: "Basque (Basque)",
+	nativeName: "euskara (euskara)",
+	language: "eu",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "EdZ",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "Infinitu",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],
+				namesAbbr: ["ig.","al.","as.","az.","og.","or.","lr."],
+				namesShort: ["ig","al","as","az","og","or","lr"]
+			},
+			months: {
+				names: ["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua",""],
+				namesAbbr: ["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dddd, yyyy.'eko' MMMM'k 'd",
+				t: "HH:mm",
+				T: "H:mm:ss",
+				f: "dddd, yyyy.'eko' MMMM'k 'd HH:mm",
+				F: "dddd, yyyy.'eko' MMMM'k 'd H:mm:ss",
+				Y: "yyyy.'eko' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hsb-DE", "default", {
+	name: "hsb-DE",
+	englishName: "Upper Sorbian (Germany)",
+	nativeName: "hornjoserbšćina (Němska)",
+	language: "hsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekónčne",
+		positiveInfinity: "+njekónčne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njedźela","póndźela","wutora","srjeda","štwórtk","pjatk","sobota"],
+				namesAbbr: ["nje","pón","wut","srj","štw","pja","sob"],
+				namesShort: ["n","p","w","s","š","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","meja","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","meje","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","mej","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'hodź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'hodź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mk-MK", "default", {
+	name: "mk-MK",
+	englishName: "Macedonian (Former Yugoslav Republic of Macedonia)",
+	nativeName: "македонски јазик (Македонија)",
+	language: "mk",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "ден."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недела","понеделник","вторник","среда","четврток","петок","сабота"],
+				namesAbbr: ["нед","пон","втр","срд","чет","пет","саб"],
+				namesShort: ["не","по","вт","ср","че","пе","са"]
+			},
+			months: {
+				names: ["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември",""],
+				namesAbbr: ["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd MMMM yyyy HH:mm",
+				F: "dddd, dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tn-ZA", "default", {
+	name: "tn-ZA",
+	englishName: "Setswana (South Africa)",
+	nativeName: "Setswana (Aforika Borwa)",
+	language: "tn",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],
+				namesAbbr: ["Ltp.","Mos.","Lbd.","Lbr.","Lbn.","Lbt.","Lmt."],
+				namesShort: ["Lp","Ms","Lb","Lr","Ln","Lt","Lm"]
+			},
+			months: {
+				names: ["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole",""],
+				namesAbbr: ["Fer.","Tlhak.","Mop.","Mor.","Motsh.","Seet.","Phukw.","Phatw.","Lwets.","Diph.","Ngwan.","Sed.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "xh-ZA", "default", {
+	name: "xh-ZA",
+	englishName: "isiXhosa (South Africa)",
+	nativeName: "isiXhosa (uMzantsi Afrika)",
+	language: "xh",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesShort: ["Ca","Mv","Lb","Lt","Ln","Lh","Mg"]
+			},
+			months: {
+				names: ["Mqungu","Mdumba","Kwindla","Tshazimpuzi","Canzibe","Silimela","Khala","Thupha","Msintsi","Dwarha","Nkanga","Mnga",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zu-ZA", "default", {
+	name: "zu-ZA",
+	englishName: "isiZulu (South Africa)",
+	nativeName: "isiZulu (iNingizimu Afrika)",
+	language: "zu",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],
+				namesAbbr: ["Son.","Mso.","Bi.","Tha.","Ne.","Hla.","Mgq."]
+			},
+			months: {
+				names: ["uMasingana","uNhlolanja","uNdasa","uMbaso","uNhlaba","uNhlangulana","uNtulikazi","uNcwaba","uMandulo","uMfumfu","uLwezi","uZibandlela",""],
+				namesAbbr: ["Mas.","Nhlo.","Nda.","Mba.","Nhla.","Nhlang.","Ntu.","Ncwa.","Man.","Mfu.","Lwe.","Zib.",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "af-ZA", "default", {
+	name: "af-ZA",
+	englishName: "Afrikaans (South Africa)",
+	nativeName: "Afrikaans (Suid Afrika)",
+	language: "af",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],
+				namesAbbr: ["Son","Maan","Dins","Woen","Dond","Vry","Sat"],
+				namesShort: ["So","Ma","Di","Wo","Do","Vr","Sa"]
+			},
+			months: {
+				names: ["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember",""],
+				namesAbbr: ["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ka-GE", "default", {
+	name: "ka-GE",
+	englishName: "Georgian (Georgia)",
+	nativeName: "ქართული (საქართველო)",
+	language: "ka",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "Lari"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesAbbr: ["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],
+				namesShort: ["კ","ო","ს","ო","ხ","პ","შ"]
+			},
+			months: {
+				names: ["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი",""],
+				namesAbbr: ["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'წლის' dd MM, dddd",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'წლის' dd MM, dddd H:mm",
+				F: "yyyy 'წლის' dd MM, dddd H:mm:ss",
+				M: "dd MM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fo-FO", "default", {
+	name: "fo-FO",
+	englishName: "Faroese (Faroe Islands)",
+	nativeName: "føroyskt (Føroyar)",
+	language: "fo",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],
+				namesAbbr: ["sun","mán","týs","mik","hós","frí","leyg"],
+				namesShort: ["su","má","tý","mi","hó","fr","ley"]
+			},
+			months: {
+				names: ["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hi-IN", "default", {
+	name: "hi-IN",
+	englishName: "Hindi (India)",
+	nativeName: "हिंदी (भारत)",
+	language: "hi",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mt-MT", "default", {
+	name: "mt-MT",
+	englishName: "Maltese (Malta)",
+	nativeName: "Malti (Malta)",
+	language: "mt",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],
+				namesAbbr: ["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],
+				namesShort: ["I","I","I","L","I","I","I"]
+			},
+			months: {
+				names: ["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru",""],
+				namesAbbr: ["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ",""]
+			},
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, d' ta\\' 'MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' ta\\' 'MMMM yyyy HH:mm",
+				F: "dddd, d' ta\\' 'MMMM yyyy HH:mm:ss",
+				M: "d' ta\\' 'MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "se-NO", "default", {
+	name: "se-NO",
+	englishName: "Sami, Northern (Norway)",
+	nativeName: "davvisámegiella (Norga)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ms-MY", "default", {
+	name: "ms-MY",
+	englishName: "Malay (Malaysia)",
+	nativeName: "Bahasa Melayu (Malaysia)",
+	language: "ms",
+	numberFormat: {
+		currency: {
+			decimals: 0,
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kk-KZ", "default", {
+	name: "kk-KZ",
+	englishName: "Kazakh (Kazakhstan)",
+	nativeName: "Қазақ (Қазақстан)",
+	language: "kk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			",": " ",
+			".": "-",
+			symbol: "Т"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],
+				namesAbbr: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],
+				namesShort: ["Жк","Дс","Сс","Ср","Бс","Жм","Сн"]
+			},
+			months: {
+				names: ["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан",""],
+				namesAbbr: ["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy 'ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'ж.' H:mm",
+				F: "d MMMM yyyy 'ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ky-KG", "default", {
+	name: "ky-KG",
+	englishName: "Kyrgyz (Kyrgyzstan)",
+	nativeName: "Кыргыз (Кыргызстан)",
+	language: "ky",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": "-",
+			symbol: "сом"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],
+				namesAbbr: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],
+				namesShort: ["Жш","Дш","Шш","Шр","Бш","Жм","Иш"]
+			},
+			months: {
+				names: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d'-'MMMM yyyy'-ж.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d'-'MMMM yyyy'-ж.' H:mm",
+				F: "d'-'MMMM yyyy'-ж.' H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy'-ж.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sw-KE", "default", {
+	name: "sw-KE",
+	englishName: "Kiswahili (Kenya)",
+	nativeName: "Kiswahili (Kenya)",
+	language: "sw",
+	numberFormat: {
+		currency: {
+			symbol: "S"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Jumapili","Jumatatu","Jumanne","Jumatano","Alhamisi","Ijumaa","Jumamosi"],
+				namesAbbr: ["Jumap.","Jumat.","Juman.","Jumat.","Alh.","Iju.","Jumam."],
+				namesShort: ["P","T","N","T","A","I","M"]
+			},
+			months: {
+				names: ["Januari","Februari","Machi","Aprili","Mei","Juni","Julai","Agosti","Septemba","Oktoba","Novemba","Decemba",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ago","Sep","Okt","Nov","Dec",""]
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tk-TM", "default", {
+	name: "tk-TM",
+	englishName: "Turkmen (Turkmenistan)",
+	nativeName: "türkmençe (Türkmenistan)",
+	language: "tk",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-üznüksizlik",
+		positiveInfinity: "üznüksizlik",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "m."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Duşenbe","Sişenbe","Çarşenbe","Penşenbe","Anna","Şenbe","Ýekşenbe"],
+				namesAbbr: ["Db","Sb","Çb","Pb","An","Şb","Ýb"],
+				namesShort: ["D","S","Ç","P","A","Ş","Ý"]
+			},
+			months: {
+				names: ["Ýanwar","Fewral","Mart","Aprel","Maý","lýun","lýul","Awgust","Sentýabr","Oktýabr","Noýabr","Dekabr",""],
+				namesAbbr: ["Ýan","Few","Mart","Apr","Maý","lýun","lýul","Awg","Sen","Okt","Not","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "yyyy 'ý.' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'ý.' MMMM d H:mm",
+				F: "yyyy 'ý.' MMMM d H:mm:ss",
+				Y: "yyyy 'ý.' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz-Latn-UZ", "default", {
+	name: "uz-Latn-UZ",
+	englishName: "Uzbek (Latin, Uzbekistan)",
+	nativeName: "U'zbek (U'zbekiston Respublikasi)",
+	language: "uz-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tt-RU", "default", {
+	name: "tt-RU",
+	englishName: "Tatar (Russia)",
+	nativeName: "Татар (Россия)",
+	language: "tt",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],
+				namesAbbr: ["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],
+				namesShort: ["Я","Д","С","Ч","П","Җ","Ш"]
+			},
+			months: {
+				names: ["Гыйнвар","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь",""],
+				namesAbbr: ["Гыйн.","Фев.","Мар.","Апр.","Май","Июнь","Июль","Авг.","Сен.","Окт.","Нояб.","Дек.",""]
+			},
+			monthsGenitive: {
+				names: ["Гыйнварның","Февральнең","Мартның","Апрельнең","Майның","Июньнең","Июльнең","Августның","Сентябрьның","Октябрьның","Ноябрьның","Декабрьның",""],
+				namesAbbr: ["Гыйн.-ның","Фев.-нең","Мар.-ның","Апр.-нең","Майның","Июньнең","Июльнең","Авг.-ның","Сен.-ның","Окт.-ның","Нояб.-ның","Дек.-ның",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bn-IN", "default", {
+	name: "bn-IN",
+	englishName: "Bengali (India)",
+	nativeName: "বাংলা (ভারত)",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "টা"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pa-IN", "default", {
+	name: "pa-IN",
+	englishName: "Punjabi (India)",
+	nativeName: "ਪੰਜਾਬੀ (ਭਾਰਤ)",
+	language: "pa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ਰੁ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁੱਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨਿੱਚਰਵਾਰ"],
+				namesAbbr: ["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁੱਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨਿੱਚਰ."],
+				namesShort: ["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"]
+			},
+			months: {
+				names: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""],
+				namesAbbr: ["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ",""]
+			},
+			AM: ["ਸਵੇਰ","ਸਵੇਰ","ਸਵੇਰ"],
+			PM: ["ਸ਼ਾਮ","ਸ਼ਾਮ","ਸ਼ਾਮ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy dddd",
+				t: "tt hh:mm",
+				T: "tt hh:mm:ss",
+				f: "dd MMMM yyyy dddd tt hh:mm",
+				F: "dd MMMM yyyy dddd tt hh:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gu-IN", "default", {
+	name: "gu-IN",
+	englishName: "Gujarati (India)",
+	nativeName: "ગુજરાતી (ભારત)",
+	language: "gu",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "રૂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],
+				namesAbbr: ["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],
+				namesShort: ["ર","સ","મ","બ","ગ","શ","શ"]
+			},
+			months: {
+				names: ["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર",""],
+				namesAbbr: ["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે",""]
+			},
+			AM: ["પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન","પૂર્વ મધ્યાહ્ન"],
+			PM: ["ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન","ઉત્તર મધ્યાહ્ન"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "or-IN", "default", {
+	name: "or-IN",
+	englishName: "Oriya (India)",
+	nativeName: "ଓଡ଼ିଆ (ଭାରତ)",
+	language: "or",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ଟ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ରବିବାର","ସୋମବାର","ମଙ୍ଗଳବାର","ବୁଧବାର","ଗୁରୁବାର","ଶୁକ୍ରବାର","ଶନିବାର"],
+				namesAbbr: ["ରବି.","ସୋମ.","ମଙ୍ଗଳ.","ବୁଧ.","ଗୁରୁ.","ଶୁକ୍ର.","ଶନି."],
+				namesShort: ["ର","ସୋ","ମ","ବୁ","ଗୁ","ଶୁ","ଶ"]
+			},
+			months: {
+				names: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""],
+				namesAbbr: ["ଜାନୁୟାରୀ","ଫ୍ରେବୃୟାରୀ","ମାର୍ଚ୍ଚ","ଏପ୍ରିଲ୍‌","ମେ","ଜୁନ୍‌","ଜୁଲାଇ","ଅଗଷ୍ଟ","ସେପ୍ଟେମ୍ବର","ଅକ୍ଟୋବର","ନଭେମ୍ବର","(ଡିସେମ୍ବର",""]
+			},
+			eras: [{"name":"ଖ୍ରୀଷ୍ଟାବ୍ଦ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ta-IN", "default", {
+	name: "ta-IN",
+	englishName: "Tamil (India)",
+	nativeName: "தமிழ் (இந்தியா)",
+	language: "ta",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ரூ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ஞாயிற்றுக்கிழமை","திங்கள்கிழமை","செவ்வாய்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],
+				namesAbbr: ["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],
+				namesShort: ["ஞா","தி","செ","பு","வி","வெ","ச"]
+			},
+			months: {
+				names: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""],
+				namesAbbr: ["ஜனவரி","பிப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்",""]
+			},
+			AM: ["காலை","காலை","காலை"],
+			PM: ["மாலை","மாலை","மாலை"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "te-IN", "default", {
+	name: "te-IN",
+	englishName: "Telugu (India)",
+	nativeName: "తెలుగు (భారత దేశం)",
+	language: "te",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "రూ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],
+				namesAbbr: ["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],
+				namesShort: ["ఆ","సో","మం","బు","గు","శు","శ"]
+			},
+			months: {
+				names: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""],
+				namesAbbr: ["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్",""]
+			},
+			AM: ["పూర్వాహ్న","పూర్వాహ్న","పూర్వాహ్న"],
+			PM: ["అపరాహ్న","అపరాహ్న","అపరాహ్న"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kn-IN", "default", {
+	name: "kn-IN",
+	englishName: "Kannada (India)",
+	nativeName: "ಕನ್ನಡ (ಭಾರತ)",
+	language: "kn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ರೂ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],
+				namesAbbr: ["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],
+				namesShort: ["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"]
+			},
+			months: {
+				names: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""],
+				namesAbbr: ["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್",""]
+			},
+			AM: ["ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ","ಪೂರ್ವಾಹ್ನ"],
+			PM: ["ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ","ಅಪರಾಹ್ನ"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ml-IN", "default", {
+	name: "ml-IN",
+	englishName: "Malayalam (India)",
+	nativeName: "മലയാളം (ഭാരതം)",
+	language: "ml",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "ക"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["ഞായറാഴ്ച","തിങ്കളാഴ്ച","ചൊവ്വാഴ്ച","ബുധനാഴ്ച","വ്യാഴാഴ്ച","വെള്ളിയാഴ്ച","ശനിയാഴ്ച"],
+				namesAbbr: ["ഞായർ.","തിങ്കൾ.","ചൊവ്വ.","ബുധൻ.","വ്യാഴം.","വെള്ളി.","ശനി."],
+				namesShort: ["ഞ","ത","ച","ബ","വ","വെ","ശ"]
+			},
+			months: {
+				names: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""],
+				namesAbbr: ["ജനുവരി","ഫെബ്റുവരി","മാറ്ച്ച്","ഏപ്റില്","മെയ്","ജൂണ്","ജൂലൈ","ഓഗസ്ററ്","സെപ്ററംബറ്","ഒക്ടോബറ്","നവംബറ്","ഡിസംബറ്",""]
+			},
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "as-IN", "default", {
+	name: "as-IN",
+	englishName: "Assamese (India)",
+	nativeName: "অসমীয়া (ভাৰত)",
+	language: "as",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","n$"],
+			groupSizes: [3,2],
+			symbol: "ট"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["সোমবাৰ","মঙ্গলবাৰ","বুধবাৰ","বৃহস্পতিবাৰ","শুক্রবাৰ","শনিবাৰ","ৰবিবাৰ"],
+				namesAbbr: ["সোম.","মঙ্গল.","বুধ.","বৃহ.","শুক্র.","শনি.","ৰবি."],
+				namesShort: ["সো","ম","বু","বৃ","শু","শ","র"]
+			},
+			months: {
+				names: ["জানুৱাৰী","ফেব্রুৱাৰী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টেম্বর","অক্টোবর","নবেম্বর","ডিচেম্বর",""],
+				namesAbbr: ["জানু","ফেব্রু","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগষ্ট","চেপ্টে","অক্টো","নবে","ডিচে",""]
+			},
+			AM: ["ৰাতিপু","ৰাতিপু","ৰাতিপু"],
+			PM: ["আবেলি","আবেলি","আবেলি"],
+			eras: [{"name":"খ্রীষ্টাব্দ","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "yyyy,MMMM dd, dddd",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy,MMMM dd, dddd tt h:mm",
+				F: "yyyy,MMMM dd, dddd tt h:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM,yy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mr-IN", "default", {
+	name: "mr-IN",
+	englishName: "Marathi (India)",
+	nativeName: "मराठी (भारत)",
+	language: "mr",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर",""],
+				namesAbbr: ["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें.",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sa-IN", "default", {
+	name: "sa-IN",
+	englishName: "Sanskrit (India)",
+	nativeName: "संस्कृत (भारतम्)",
+	language: "sa",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesAbbr: ["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],
+				namesShort: ["र","स","म","ब","ग","श","श"]
+			},
+			months: {
+				names: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""],
+				namesAbbr: ["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर",""]
+			},
+			AM: ["पूर्वाह्न","पूर्वाह्न","पूर्वाह्न"],
+			PM: ["अपराह्न","अपराह्न","अपराह्न"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy dddd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy dddd HH:mm",
+				F: "dd MMMM yyyy dddd HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn-MN", "default", {
+	name: "mn-MN",
+	englishName: "Mongolian (Cyrillic, Mongolia)",
+	nativeName: "Монгол хэл (Монгол улс)",
+	language: "mn-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bo-CN", "default", {
+	name: "bo-CN",
+	englishName: "Tibetan (PRC)",
+	nativeName: "བོད་ཡིག (ཀྲུང་ཧྭ་མི་དམངས་སྤྱི་མཐུན་རྒྱལ་ཁབ།)",
+	language: "bo",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ཨང་ཀི་མིན་པ།",
+		negativeInfinity: "མོ་གྲངས་ཚད་མེད་ཆུང་བ།",
+		positiveInfinity: "ཕོ་གྲངས་ཚད་མེད་ཆེ་བ།",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["གཟའ་ཉི་མ།","གཟའ་ཟླ་བ།","གཟའ་མིག་དམར།","གཟའ་ལྷག་པ།","གཟའ་ཕུར་བུ།","གཟའ་པ་སངས།","གཟའ་སྤེན་པ།"],
+				namesAbbr: ["ཉི་མ།","ཟླ་བ།","མིག་དམར།","ལྷག་པ།","ཕུར་བུ།","པ་སངས།","སྤེན་པ།"],
+				namesShort: ["༧","༡","༢","༣","༤","༥","༦"]
+			},
+			months: {
+				names: ["སྤྱི་ཟླ་དང་པོ།","སྤྱི་ཟླ་གཉིས་པ།","སྤྱི་ཟླ་གསུམ་པ།","སྤྱི་ཟླ་བཞི་པ།","སྤྱི་ཟླ་ལྔ་པ།","སྤྱི་ཟླ་དྲུག་པ།","སྤྱི་ཟླ་བདུན་པ།","སྤྱི་ཟླ་བརྒྱད་པ།","སྤྱི་ཟླ་དགུ་པ།","སྤྱི་ཟླ་བཅུ་པོ།","སྤྱི་ཟླ་བཅུ་གཅིག་པ།","སྤྱི་ཟླ་བཅུ་གཉིས་པ།",""],
+				namesAbbr: ["ཟླ་ ༡","ཟླ་ ༢","ཟླ་ ༣","ཟླ་ ༤","ཟླ་ ༥","ཟླ་ ༦","ཟླ་ ༧","ཟླ་ ༨","ཟླ་ ༩","ཟླ་ ༡༠","ཟླ་ ༡༡","ཟླ་ ༡༢",""]
+			},
+			AM: ["སྔ་དྲོ","སྔ་དྲོ","སྔ་དྲོ"],
+			PM: ["ཕྱི་དྲོ","ཕྱི་དྲོ","ཕྱི་དྲོ"],
+			eras: [{"name":"སྤྱི་ལོ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ལོའི་ཟླ' M'ཚེས' d",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm",
+				F: "yyyy'ལོའི་ཟླ' M'ཚེས' d HH:mm:ss",
+				M: "'ཟླ་' M'ཚེས'd",
+				Y: "yyyy.M"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "cy-GB", "default", {
+	name: "cy-GB",
+	englishName: "Welsh (United Kingdom)",
+	nativeName: "Cymraeg (y Deyrnas Unedig)",
+	language: "cy",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],
+				namesAbbr: ["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],
+				namesShort: ["Su","Ll","Ma","Me","Ia","Gw","Sa"]
+			},
+			months: {
+				names: ["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr",""],
+				namesAbbr: ["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "km-KH", "default", {
+	name: "km-KH",
+	englishName: "Khmer (Cambodia)",
+	nativeName: "ខ្មែរ (កម្ពុជា)",
+	language: "km",
+	numberFormat: {
+		pattern: ["- n"],
+		groupSizes: [3,0],
+		NaN: "NAN",
+		negativeInfinity: "-- អនន្ត",
+		positiveInfinity: "អនន្ត",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			symbol: "៛"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["ថ្ងៃអាទិត្យ","ថ្ងៃច័ន្ទ","ថ្ងៃអង្គារ","ថ្ងៃពុធ","ថ្ងៃព្រហស្បតិ៍","ថ្ងៃសុក្រ","ថ្ងៃសៅរ៍"],
+				namesAbbr: ["អាទិ.","ច.","អ.","ពុ","ព្រហ.","សុ.","ស."],
+				namesShort: ["អា","ច","អ","ពុ","ព្","សុ","ស"]
+			},
+			months: {
+				names: ["មករា","កុម្ភៈ","មិនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ",""],
+				namesAbbr: ["១","២","៣","៤","៥","៦","៧","៨","៩","១០","១១","១២",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"មុនគ.ស.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy H:mm tt",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "'ថ្ងៃទី' dd 'ខែ' MM",
+				Y: "'ខែ' MM 'ឆ្នាំ' yyyy"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ព្រឹក","ព្រឹក","ព្រឹក"],
+			PM: ["ល្ងាច","ល្ងាច","ល្ងាច"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm tt",
+				F: "dddd, MMMM dd, yyyy HH:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lo-LA", "default", {
+	name: "lo-LA",
+	englishName: "Lao (Lao P.D.R.)",
+	nativeName: "ລາວ (ສ.ປ.ປ. ລາວ)",
+	language: "lo",
+	numberFormat: {
+		pattern: ["(n)"],
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["(n$)","n$"],
+			groupSizes: [3,0],
+			symbol: "₭"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ວັນອາທິດ","ວັນຈັນ","ວັນອັງຄານ","ວັນພຸດ","ວັນພະຫັດ","ວັນສຸກ","ວັນເສົາ"],
+				namesAbbr: ["ອາທິດ","ຈັນ","ອັງຄານ","ພຸດ","ພະຫັດ","ສຸກ","ເສົາ"],
+				namesShort: ["ອ","ຈ","ອ","ພ","ພ","ສ","ເ"]
+			},
+			months: {
+				names: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""],
+				namesAbbr: ["ມັງກອນ","ກຸມພາ","ມີນາ","ເມສາ","ພຶດສະພາ","ມິຖຸນາ","ກໍລະກົດ","ສິງຫາ","ກັນຍາ","ຕຸລາ","ພະຈິກ","ທັນວາ",""]
+			},
+			AM: ["ເຊົ້າ","ເຊົ້າ","ເຊົ້າ"],
+			PM: ["ແລງ","ແລງ","ແລງ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm tt",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy H:mm tt",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gl-ES", "default", {
+	name: "gl-ES",
+	englishName: "Galician (Galician)",
+	nativeName: "galego (galego)",
+	language: "gl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","luns","martes","mércores","xoves","venres","sábado"],
+				namesAbbr: ["dom","luns","mar","mér","xov","ven","sáb"],
+				namesShort: ["do","lu","ma","mé","xo","ve","sá"]
+			},
+			months: {
+				names: ["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro",""],
+				namesAbbr: ["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kok-IN", "default", {
+	name: "kok-IN",
+	englishName: "Konkani (India)",
+	nativeName: "कोंकणी (भारत)",
+	language: "kok",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],
+				namesAbbr: ["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],
+				namesShort: ["आ","स","म","ब","ब","स","श"]
+			},
+			months: {
+				names: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""],
+				namesAbbr: ["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर",""]
+			},
+			AM: ["म.पू.","म.पू.","म.पू."],
+			PM: ["म.नं.","म.नं.","म.नं."],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "syr-SY", "default", {
+	name: "syr-SY",
+	englishName: "Syriac (Syria)",
+	nativeName: "ܣܘܪܝܝܐ (سوريا)",
+	language: "syr",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],
+				namesAbbr: ["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],
+				namesShort: ["ܐ","ܒ","ܓ","ܕ","ܗ","ܥ","ܫ"]
+			},
+			months: {
+				names: ["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ",""],
+				namesAbbr: ["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ",""]
+			},
+			AM: ["ܩ.ܛ","ܩ.ܛ","ܩ.ܛ"],
+			PM: ["ܒ.ܛ","ܒ.ܛ","ܒ.ܛ"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "si-LK", "default", {
+	name: "si-LK",
+	englishName: "Sinhala (Sri Lanka)",
+	nativeName: "සිංහල (ශ්‍රී ලංකා)",
+	language: "si",
+	numberFormat: {
+		groupSizes: [3,2],
+		negativeInfinity: "-අනන්තය",
+		positiveInfinity: "අනන්තය",
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "රු."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ඉරිදා","සඳුදා","අඟහරුවාදා","බදාදා","බ්‍රහස්පතින්දා","සිකුරාදා","සෙනසුරාදා"],
+				namesAbbr: ["ඉරිදා","සඳුදා","කුජදා","බුදදා","ගුරුදා","කිවිදා","ශනිදා"],
+				namesShort: ["ඉ","ස","අ","බ","බ්‍ර","සි","සෙ"]
+			},
+			months: {
+				names: ["ජනවාරි","පෙබරවාරි","මාර්තු","අ‌ප්‍රේල්","මැයි","ජූනි","ජූලි","අ‌ගෝස්තු","සැප්තැම්බර්","ඔක්තෝබර්","නොවැම්බර්","දෙසැම්බර්",""],
+				namesAbbr: ["ජන.","පෙබ.","මාර්තු.","අප්‍රේල්.","මැයි.","ජූනි.","ජූලි.","අගෝ.","සැප්.","ඔක්.","නොවැ.","දෙසැ.",""]
+			},
+			AM: ["පෙ.ව.","පෙ.ව.","පෙ.ව."],
+			PM: ["ප.ව.","ප.ව.","ප.ව."],
+			eras: [{"name":"ක්‍රි.ව.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "yyyy MMMM' මස 'dd' වැනිදා 'dddd",
+				f: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm tt",
+				F: "yyyy MMMM' මස 'dd' වැනිදා 'dddd h:mm:ss tt",
+				Y: "yyyy MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu-Cans-CA", "default", {
+	name: "iu-Cans-CA",
+	englishName: "Inuktitut (Syllabics, Canada)",
+	nativeName: "ᐃᓄᒃᑎᑐᑦ (ᑲᓇᑕᒥ)",
+	language: "iu-Cans",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ᓈᑦᑏᖑᔭ","ᓇᒡᒐᔾᔭᐅ","ᐊᐃᑉᐱᖅ","ᐱᖓᑦᓯᖅ","ᓯᑕᒻᒥᖅ","ᑕᓪᓕᕐᒥᖅ","ᓯᕙᑖᕐᕕᒃ"],
+				namesAbbr: ["ᓈᑦᑏ","ᓇᒡᒐ","ᐊᐃᑉᐱ","ᐱᖓᑦᓯ","ᓯᑕ","ᑕᓪᓕ","ᓯᕙᑖᕐᕕᒃ"],
+				namesShort: ["ᓈ","ᓇ","ᐊ","ᐱ","ᓯ","ᑕ","ᓯ"]
+			},
+			months: {
+				names: ["ᔮᓐᓄᐊᕆ","ᕖᕝᕗᐊᕆ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌᓯ","ᓯᑎᐱᕆ","ᐅᑐᐱᕆ","ᓄᕕᐱᕆ","ᑎᓯᐱᕆ",""],
+				namesAbbr: ["ᔮᓐᓄ","ᕖᕝᕗ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌ","ᓯᑎᐱ","ᐅᑐᐱ","ᓄᕕᐱ","ᑎᓯᐱ",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd,MMMM dd,yyyy",
+				f: "dddd,MMMM dd,yyyy h:mm tt",
+				F: "dddd,MMMM dd,yyyy h:mm:ss tt",
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "am-ET", "default", {
+	name: "am-ET",
+	englishName: "Amharic (Ethiopia)",
+	nativeName: "አማርኛ (ኢትዮጵያ)",
+	language: "am",
+	numberFormat: {
+		decimals: 1,
+		groupSizes: [3,0],
+		NaN: "NAN",
+		percent: {
+			pattern: ["-n%","n%"],
+			decimals: 1,
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			groupSizes: [3,0],
+			symbol: "ETB"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["እሑድ","ሰኞ","ማክሰኞ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesAbbr: ["እሑድ","ሰኞ","ማክሰ","ረቡዕ","ሐሙስ","ዓርብ","ቅዳሜ"],
+				namesShort: ["እ","ሰ","ማ","ረ","ሐ","ዓ","ቅ"]
+			},
+			months: {
+				names: ["ጃንዩወሪ","ፌብሩወሪ","ማርች","ኤፕረል","ሜይ","ጁን","ጁላይ","ኦገስት","ሴፕቴምበር","ኦክተውበር","ኖቬምበር","ዲሴምበር",""],
+				namesAbbr: ["ጃንዩ","ፌብሩ","ማርች","ኤፕረ","ሜይ","ጁን","ጁላይ","ኦገስ","ሴፕቴ","ኦክተ","ኖቬም","ዲሴም",""]
+			},
+			AM: ["ጡዋት","ጡዋት","ጡዋት"],
+			PM: ["ከሰዓት","ከሰዓት","ከሰዓት"],
+			eras: [{"name":"ዓመተ  ምሕረት","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd '፣' MMMM d 'ቀን' yyyy",
+				f: "dddd '፣' MMMM d 'ቀን' yyyy h:mm tt",
+				F: "dddd '፣' MMMM d 'ቀን' yyyy h:mm:ss tt",
+				M: "MMMM d ቀን",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ne-NP", "default", {
+	name: "ne-NP",
+	englishName: "Nepali (Nepal)",
+	nativeName: "नेपाली (नेपाल)",
+	language: "ne",
+	numberFormat: {
+		groupSizes: [3,2],
+		NaN: "nan",
+		negativeInfinity: "-infinity",
+		positiveInfinity: "infinity",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "रु"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["आइतवार","सोमवार","मङ्गलवार","बुधवार","बिहीवार","शुक्रवार","शनिवार"],
+				namesAbbr: ["आइत","सोम","मङ्गल","बुध","बिही","शुक्र","शनि"],
+				namesShort: ["आ","सो","म","बु","बि","शु","श"]
+			},
+			months: {
+				names: ["जनवरी","फेब्रुअरी","मार्च","अप्रिल","मे","जून","जुलाई","अगस्त","सेप्टेम्बर","अक्टोबर","नोभेम्बर","डिसेम्बर",""],
+				namesAbbr: ["जन","फेब","मार्च","अप्रिल","मे","जून","जुलाई","अग","सेप्ट","अक्ट","नोभ","डिस",""]
+			},
+			AM: ["विहानी","विहानी","विहानी"],
+			PM: ["बेलुकी","बेलुकी","बेलुकी"],
+			eras: [{"name":"a.d.","start":null,"offset":0}],
+			patterns: {
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fy-NL", "default", {
+	name: "fy-NL",
+	englishName: "Frisian (Netherlands)",
+	nativeName: "Frysk (Nederlân)",
+	language: "fy",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["Snein","Moandei","Tiisdei","Woansdei","Tongersdei","Freed","Sneon"],
+				namesAbbr: ["Sn","Mo","Ti","Wo","To","Fr","Sn"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["jannewaris","febrewaris","maart","april","maaie","juny","july","augustus","septimber","oktober","novimber","desimber",""],
+				namesAbbr: ["jann","febr","mrt","apr","maaie","jun","jul","aug","sept","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d-M-yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ps-AF", "default", {
+	name: "ps-AF",
+	englishName: "Pashto (Afghanistan)",
+	nativeName: "پښتو (افغانستان)",
+	language: "ps",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": "،",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": "،",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			",": "٬",
+			".": "٫",
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 6,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښزمرى","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګا ښ","زمرى","وږى","تله","لړم","لنڈ ۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fil-PH", "default", {
+	name: "fil-PH",
+	englishName: "Filipino (Philippines)",
+	nativeName: "Filipino (Pilipinas)",
+	language: "fil",
+	numberFormat: {
+		currency: {
+			symbol: "PhP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Linggo","Lunes","Martes","Mierkoles","Huebes","Biernes","Sabado"],
+				namesAbbr: ["Lin","Lun","Mar","Mier","Hueb","Bier","Saba"],
+				namesShort: ["L","L","M","M","H","B","S"]
+			},
+			months: {
+				names: ["Enero","Pebrero","Marso","Abril","Mayo","Hunyo","Hulyo","Agosto","Septyembre","Oktubre","Nobyembre","Disyembre",""],
+				namesAbbr: ["En","Peb","Mar","Abr","Mayo","Hun","Hul","Agos","Sept","Okt","Nob","Dis",""]
+			},
+			eras: [{"name":"Anno Domini","start":null,"offset":0}]
+		}
+	}
+});
+
+Globalize.addCultureInfo( "dv-MV", "default", {
+	name: "dv-MV",
+	englishName: "Divehi (Maldives)",
+	nativeName: "ދިވެހިބަސް (ދިވެހި ރާއްޖެ)",
+	language: "dv",
+	isRTL: true,
+	numberFormat: {
+		currency: {
+			pattern: ["n $-","n $"],
+			symbol: "ރ."
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""],
+				namesAbbr: ["މުޙައްރަމް","ޞަފަރު","ރަބީޢުލްއައްވަލް","ރަބީޢުލްއާޚިރު","ޖުމާދަލްއޫލާ","ޖުމާދަލްއާޚިރާ","ރަޖަބް","ޝަޢްބާން","ރަމަޟާން","ޝައްވާލް","ޛުލްޤަޢިދާ","ޛުލްޙިއްޖާ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"ހިޖްރީ","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd/MM/yyyy HH:mm",
+				F: "dd/MM/yyyy HH:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			days: {
+				names: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesAbbr: ["އާދީއްތަ","ހޯމަ","އަންގާރަ","ބުދަ","ބުރާސްފަތި","ހުކުރު","ހޮނިހިރު"],
+				namesShort: ["އާ","ހޯ","އަ","ބު","ބު","ހު","ހޮ"]
+			},
+			months: {
+				names: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""],
+				namesAbbr: ["ޖަނަވަރީ","ފެބްރުއަރީ","މާޗް","އޭޕްރިލް","މެއި","ޖޫން","ޖުލައި","އޯގަސްޓް","ސެޕްޓެމްބަރ","އޮކްޓޯބަރ","ނޮވެމްބަރ","ޑިސެމްބަރ",""]
+			},
+			AM: ["މކ","މކ","މކ"],
+			PM: ["މފ","މފ","މފ"],
+			eras: [{"name":"މީލާދީ","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yy",
+				D: "ddd, yyyy MMMM dd",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "ddd, yyyy MMMM dd HH:mm",
+				F: "ddd, yyyy MMMM dd HH:mm:ss",
+				Y: "yyyy, MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ha-Latn-NG", "default", {
+	name: "ha-Latn-NG",
+	englishName: "Hausa (Latin, Nigeria)",
+	nativeName: "Hausa (Nigeria)",
+	language: "ha-Latn",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "yo-NG", "default", {
+	name: "yo-NG",
+	englishName: "Yoruba (Nigeria)",
+	nativeName: "Yoruba (Nigeria)",
+	language: "yo",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Osu kinni","Osu keji","Osu keta","Osu kerin","Osu karun","Osu kefa","Osu keje","Osu kejo","Osu kesan","Osu kewa","Osu kokanla","Osu keresi",""],
+				namesAbbr: ["kin.","kej.","ket.","ker.","kar.","kef.","kej.","kej.","kes.","kew.","kok.","ker.",""]
+			},
+			AM: ["Owuro","owuro","OWURO"],
+			PM: ["Ale","ale","ALE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "quz-BO", "default", {
+	name: "quz-BO",
+	englishName: "Quechua (Bolivia)",
+	nativeName: "runasimi (Qullasuyu)",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nso-ZA", "default", {
+	name: "nso-ZA",
+	englishName: "Sesotho sa Leboa (South Africa)",
+	nativeName: "Sesotho sa Leboa (Afrika Borwa)",
+	language: "nso",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],
+				namesAbbr: ["Lam","Moš","Lbb","Lbr","Lbn","Lbh","Mok"],
+				namesShort: ["L","M","L","L","L","L","M"]
+			},
+			months: {
+				names: ["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole",""],
+				namesAbbr: ["Pher","Hlak","Mop","Mor","Mos","Ngwat","Phup","Phat","Lew","Dip","Dib","Man",""]
+			},
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ba-RU", "default", {
+	name: "ba-RU",
+	englishName: "Bashkir (Russia)",
+	nativeName: "Башҡорт (Россия)",
+	language: "ba",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ",",
+			symbol: "һ."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Йәкшәмбе","Дүшәмбе","Шишәмбе","Шаршамбы","Кесаҙна","Йома","Шәмбе"],
+				namesAbbr: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"],
+				namesShort: ["Йш","Дш","Шш","Шр","Кс","Йм","Шб"]
+			},
+			months: {
+				names: ["ғинуар","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь",""],
+				namesAbbr: ["ғин","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy 'й'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy 'й' H:mm",
+				F: "d MMMM yyyy 'й' H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "lb-LU", "default", {
+	name: "lb-LU",
+	englishName: "Luxembourgish (Luxembourg)",
+	nativeName: "Lëtzebuergesch (Luxembourg)",
+	language: "lb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "n. num.",
+		negativeInfinity: "-onendlech",
+		positiveInfinity: "+onendlech",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],
+				namesAbbr: ["Son","Méi","Dën","Mët","Don","Fre","Sam"],
+				namesShort: ["So","Mé","Dë","Më","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "kl-GL", "default", {
+	name: "kl-GL",
+	englishName: "Greenlandic (Greenland)",
+	nativeName: "kalaallisut (Kalaallit Nunaat)",
+	language: "kl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			groupSizes: [3,0],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			",": ".",
+			".": ",",
+			symbol: "kr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sapaat","ataasinngorneq","marlunngorneq","pingasunngorneq","sisamanngorneq","tallimanngorneq","arfininngorneq"],
+				namesAbbr: ["sap","ata","mar","ping","sis","tal","arf"],
+				namesShort: ["sa","at","ma","pi","si","ta","ar"]
+			},
+			months: {
+				names: ["januari","februari","martsi","apriili","maaji","juni","juli","aggusti","septembari","oktobari","novembari","decembari",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ig-NG", "default", {
+	name: "ig-NG",
+	englishName: "Igbo (Nigeria)",
+	nativeName: "Igbo (Nigeria)",
+	language: "ig",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Aiku","Aje","Isegun","Ojo'ru","Ojo'bo","Eti","Abameta"],
+				namesAbbr: ["Aik","Aje","Ise","Ojo","Ojo","Eti","Aba"],
+				namesShort: ["A","A","I","O","O","E","A"]
+			},
+			months: {
+				names: ["Onwa mbu","Onwa ibua","Onwa ato","Onwa ano","Onwa ise","Onwa isi","Onwa asa","Onwa asato","Onwa itolu","Onwa iri","Onwa iri n'ofu","Onwa iri n'ibua",""],
+				namesAbbr: ["mbu.","ibu.","ato.","ano.","ise","isi","asa","asa.","ito.","iri.","n'of.","n'ib.",""]
+			},
+			AM: ["Ututu","ututu","UTUTU"],
+			PM: ["Efifie","efifie","EFIFIE"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ii-CN", "default", {
+	name: "ii-CN",
+	englishName: "Yi (PRC)",
+	nativeName: "ꆈꌠꁱꂷ (ꍏꉸꏓꂱꇭꉼꇩ)",
+	language: "ii",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ꌗꂷꀋꉬ",
+		negativeInfinity: "ꀄꊭꌐꀋꉆ",
+		positiveInfinity: "ꈤꇁꑖꀋꉬ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ꑭꆏꑍ","ꆏꊂ꒔","ꆏꊂꑍ","ꆏꊂꌕ","ꆏꊂꇖ","ꆏꊂꉬ","ꆏꊂꃘ"],
+				namesAbbr: ["ꑭꆏ","ꆏ꒔","ꆏꑍ","ꆏꌕ","ꆏꇖ","ꆏꉬ","ꆏꃘ"],
+				namesShort: ["ꆏ","꒔","ꑍ","ꌕ","ꇖ","ꉬ","ꃘ"]
+			},
+			months: {
+				names: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""],
+				namesAbbr: ["ꋍꆪ","ꑍꆪ","ꌕꆪ","ꇖꆪ","ꉬꆪ","ꃘꆪ","ꏃꆪ","ꉆꆪ","ꈬꆪ","ꊰꆪ","ꊯꊪꆪ","ꊰꑋꆪ",""]
+			},
+			AM: ["ꂵꆪꈌꈐ","ꂵꆪꈌꈐ","ꂵꆪꈌꈐ"],
+			PM: ["ꂵꆪꈌꉈ","ꂵꆪꈌꉈ","ꂵꆪꈌꉈ"],
+			eras: [{"name":"ꇬꑼ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ꈎ' M'ꆪ' d'ꑍ'",
+				t: "tt h:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ꈎ' M'ꆪ' d'ꑍ' tt h:mm",
+				F: "yyyy'ꈎ' M'ꆪ' d'ꑍ' H:mm:ss",
+				M: "M'ꆪ' d'ꑍ'",
+				Y: "yyyy'ꈎ' M'ꆪ'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "arn-CL", "default", {
+	name: "arn-CL",
+	englishName: "Mapudungun (Chile)",
+	nativeName: "Mapudungun (Chile)",
+	language: "arn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "moh-CA", "default", {
+	name: "moh-CA",
+	englishName: "Mohawk (Mohawk)",
+	nativeName: "Kanien'kéha",
+	language: "moh",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Awentatokentì:ke","Awentataón'ke","Ratironhia'kehronòn:ke","Soséhne","Okaristiiáhne","Ronwaia'tanentaktonhne","Entákta"],
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			months: {
+				names: ["Tsothohrkó:Wa","Enniska","Enniskó:Wa","Onerahtókha","Onerahtohkó:Wa","Ohiari:Ha","Ohiarihkó:Wa","Seskéha","Seskehkó:Wa","Kenténha","Kentenhkó:Wa","Tsothóhrha",""]
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "br-FR", "default", {
+	name: "br-FR",
+	englishName: "Breton (France)",
+	nativeName: "brezhoneg (Frañs)",
+	language: "br",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NkN",
+		negativeInfinity: "-Anfin",
+		positiveInfinity: "+Anfin",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sul","Lun","Meurzh","Merc'her","Yaou","Gwener","Sadorn"],
+				namesAbbr: ["Sul","Lun","Meu.","Mer.","Yaou","Gwe.","Sad."],
+				namesShort: ["Su","Lu","Mz","Mc","Ya","Gw","Sa"]
+			},
+			months: {
+				names: ["Genver","C'hwevrer","Meurzh","Ebrel","Mae","Mezheven","Gouere","Eost","Gwengolo","Here","Du","Kerzu",""],
+				namesAbbr: ["Gen.","C'hwe.","Meur.","Ebr.","Mae","Mezh.","Goue.","Eost","Gwen.","Here","Du","Kzu",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"g. J.-K.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ug-CN", "default", {
+	name: "ug-CN",
+	englishName: "Uyghur (PRC)",
+	nativeName: "ئۇيغۇرچە (جۇڭخۇا خەلق جۇمھۇرىيىتى)",
+	language: "ug",
+	isRTL: true,
+	numberFormat: {
+		NaN: "سان ئەمەس",
+		negativeInfinity: "مەنپىي چەكسىزلىك",
+		positiveInfinity: "مۇسبەت چەكسىزلىك",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["يەكشەنبە","دۈشەنبە","سەيشەنبە","چارشەنبە","پەيشەنبە","جۈمە","شەنبە"],
+				namesAbbr: ["يە","دۈ","سە","چا","پە","جۈ","شە"],
+				namesShort: ["ي","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""],
+				namesAbbr: ["1-ئاي","2-ئاي","3-ئاي","4-ئاي","5-ئاي","6-ئاي","7-ئاي","8-ئاي","9-ئاي","10-ئاي","11-ئاي","12-ئاي",""]
+			},
+			AM: ["چۈشتىن بۇرۇن","چۈشتىن بۇرۇن","چۈشتىن بۇرۇن"],
+			PM: ["چۈشتىن كېيىن","چۈشتىن كېيىن","چۈشتىن كېيىن"],
+			eras: [{"name":"مىلادى","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-M-d",
+				D: "yyyy-'يىلى' MMMM d-'كۈنى،'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm",
+				F: "yyyy-'يىلى' MMMM d-'كۈنى،' H:mm:ss",
+				M: "MMMM d'-كۈنى'",
+				Y: "yyyy-'يىلى' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mi-NZ", "default", {
+	name: "mi-NZ",
+	englishName: "Maori (New Zealand)",
+	nativeName: "Reo Māori (Aotearoa)",
+	language: "mi",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Rātapu","Rāhina","Rātū","Rāapa","Rāpare","Rāmere","Rāhoroi"],
+				namesAbbr: ["Ta","Hi","Tū","Apa","Pa","Me","Ho"],
+				namesShort: ["Ta","Hi","Tū","Aa","Pa","Me","Ho"]
+			},
+			months: {
+				names: ["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngongoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea",""],
+				namesAbbr: ["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngo","Here","Mahu","Nuku","Rangi","Haki",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM, yyyy",
+				f: "dddd, dd MMMM, yyyy h:mm tt",
+				F: "dddd, dd MMMM, yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM, yy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "oc-FR", "default", {
+	name: "oc-FR",
+	englishName: "Occitan (France)",
+	nativeName: "Occitan (França)",
+	language: "oc",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numeric",
+		negativeInfinity: "-Infinit",
+		positiveInfinity: "+Infinit",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimenge","diluns","dimars","dimècres","dijòus","divendres","dissabte"],
+				namesAbbr: ["dim.","lun.","mar.","mèc.","jòu.","ven.","sab."],
+				namesShort: ["di","lu","ma","mè","jò","ve","sa"]
+			},
+			months: {
+				names: ["genier","febrier","març","abril","mai","junh","julh","agost","setembre","octobre","novembre","desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			monthsGenitive: {
+				names: ["de genier","de febrier","de març","d'abril","de mai","de junh","de julh","d'agost","de setembre","d'octobre","de novembre","de desembre",""],
+				namesAbbr: ["gen.","feb.","mar.","abr.","mai.","jun.","jul.","ag.","set.","oct.","nov.","des.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"après Jèsus-Crist","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd,' lo 'd MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd,' lo 'd MMMM' de 'yyyy HH:mm",
+				F: "dddd,' lo 'd MMMM' de 'yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "co-FR", "default", {
+	name: "co-FR",
+	englishName: "Corsican (France)",
+	nativeName: "Corsu (France)",
+	language: "co",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Mica numericu",
+		negativeInfinity: "-Infinitu",
+		positiveInfinity: "+Infinitu",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dumenica","luni","marti","mercuri","ghjovi","venderi","sabbatu"],
+				namesAbbr: ["dum.","lun.","mar.","mer.","ghj.","ven.","sab."],
+				namesShort: ["du","lu","ma","me","gh","ve","sa"]
+			},
+			months: {
+				names: ["ghjennaghju","ferraghju","marzu","aprile","maghju","ghjunghju","lugliu","aostu","settembre","ottobre","nuvembre","dicembre",""],
+				namesAbbr: ["ghje","ferr","marz","apri","magh","ghju","lugl","aost","sett","otto","nuve","dice",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"dopu J-C","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gsw-FR", "default", {
+	name: "gsw-FR",
+	englishName: "Alsatian (France)",
+	nativeName: "Elsässisch (Frànkrisch)",
+	language: "gsw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Ohne Nummer",
+		negativeInfinity: "-Unendlich",
+		positiveInfinity: "+Unendlich",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Sundàà","Mondàà","Dienschdàà","Mittwuch","Dunnerschdàà","Fridàà","Sàmschdàà"],
+				namesAbbr: ["Su.","Mo.","Di.","Mi.","Du.","Fr.","Sà."],
+				namesShort: ["Su","Mo","Di","Mi","Du","Fr","Sà"]
+			},
+			months: {
+				names: ["Jänner","Feverje","März","Àpril","Mai","Jüni","Jüli","Augscht","September","Oktower","Nowember","Dezember",""],
+				namesAbbr: ["Jän.","Fev.","März","Apr.","Mai","Jüni","Jüli","Aug.","Sept.","Okt.","Now.","Dez.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"Vor J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sah-RU", "default", {
+	name: "sah-RU",
+	englishName: "Yakut (Russia)",
+	nativeName: "саха (Россия)",
+	language: "sah",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "NAN",
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "с."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["баскыһыанньа","бэнидиэнньик","оптуорунньук","сэрэдэ","чэппиэр","бээтинсэ","субуота"],
+				namesAbbr: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"],
+				namesShort: ["Бс","Бн","Оп","Ср","Чп","Бт","Сб"]
+			},
+			months: {
+				names: ["Тохсунньу","Олунньу","Кулун тутар","Муус устар","Ыам ыйа","Бэс ыйа","От ыйа","Атырдьах ыйа","Балаҕан ыйа","Алтынньы","Сэтинньи","Ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			monthsGenitive: {
+				names: ["тохсунньу","олунньу","кулун тутар","муус устар","ыам ыйын","бэс ыйын","от ыйын","атырдьах ыйын","балаҕан ыйын","алтынньы","сэтинньи","ахсынньы",""],
+				namesAbbr: ["тхс","олн","кул","мст","ыам","бэс","отй","атр","блҕ","алт","стн","ахс",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "MM.dd.yyyy",
+				D: "MMMM d yyyy 'с.'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d yyyy 'с.' H:mm",
+				F: "MMMM d yyyy 'с.' H:mm:ss",
+				Y: "MMMM yyyy 'с.'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "qut-GT", "default", {
+	name: "qut-GT",
+	englishName: "K'iche (Guatemala)",
+	nativeName: "K'iche (Guatemala)",
+	language: "qut",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["juq'ij","kaq'ij","oxq'ij","kajq'ij","joq'ij","waqq'ij","wuqq'ij"],
+				namesAbbr: ["juq","kaq","oxq","kajq","joq","waqq","wuqq"],
+				namesShort: ["ju","ka","ox","ka","jo","wa","wu"]
+			},
+			months: {
+				names: ["nab'e ik'","ukab' ik'","rox ik'","ukaj ik'","uro' ik'","uwaq ik'","uwuq ik'","uwajxaq ik'","ub'elej ik'","ulaj ik'","ujulaj ik'","ukab'laj ik'",""],
+				namesAbbr: ["nab'e","ukab","rox","ukaj","uro","uwaq","uwuq","uwajxaq","ub'elej","ulaj","ujulaj","ukab'laj",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "rw-RW", "default", {
+	name: "rw-RW",
+	englishName: "Kinyarwanda (Rwanda)",
+	nativeName: "Kinyarwanda (Rwanda)",
+	language: "rw",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "RWF"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Ku wa mbere","Ku wa kabiri","Ku wa gatatu","Ku wa kane","Ku wa gatanu","Ku wa gatandatu","Ku cyumweru"],
+				namesAbbr: ["mbe.","kab.","gat.","kan.","gat.","gat.","cyu."],
+				namesShort: ["mb","ka","ga","ka","ga","ga","cy"]
+			},
+			months: {
+				names: ["Mutarama","Gashyantare","Werurwe","Mata","Gicurasi","Kamena","Nyakanga","Kanama","Nzeli","Ukwakira","Ugushyingo","Ukuboza",""],
+				namesAbbr: ["Mut","Gas","Wer","Mat","Gic","Kam","Nya","Kan","Nze","Ukwa","Ugu","Uku",""]
+			},
+			AM: ["saa moya z.m.","saa moya z.m.","SAA MOYA Z.M."],
+			PM: ["saa moya z.n.","saa moya z.n.","SAA MOYA Z.N."],
+			eras: [{"name":"AD","start":null,"offset":0}]
+		}
+	}
+});
+
+Globalize.addCultureInfo( "wo-SN", "default", {
+	name: "wo-SN",
+	englishName: "Wolof (Senegal)",
+	nativeName: "Wolof (Sénégal)",
+	language: "wo",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "XOF"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "prs-AF", "default", {
+	name: "prs-AF",
+	englishName: "Dari (Afghanistan)",
+	nativeName: "درى (افغانستان)",
+	language: "prs",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "غ ع",
+		negativeInfinity: "-∞",
+		positiveInfinity: "∞",
+		percent: {
+			pattern: ["%n-","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			symbol: "؋"
+		}
+	},
+	calendars: {
+		standard: {
+			name: "Hijri",
+			firstDay: 5,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				f: "dd/MM/yyyy h:mm tt",
+				F: "dd/MM/yyyy h:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_Localized: {
+			firstDay: 5,
+			days: {
+				names: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesAbbr: ["یکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],
+				namesShort: ["ی","د","س","چ","پ","ج","ش"]
+			},
+			months: {
+				names: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""],
+				namesAbbr: ["سلواغه","كب","ورى","غويى","غبرګولى","چنګاښ","زمرى","وږى","تله","لړم","ليندۍ","مرغومى",""]
+			},
+			AM: ["غ.م","غ.م","غ.م"],
+			PM: ["غ.و","غ.و","غ.و"],
+			eras: [{"name":"ل.ه","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy, dd, MMMM, dddd",
+				f: "yyyy, dd, MMMM, dddd h:mm tt",
+				F: "yyyy, dd, MMMM, dddd h:mm:ss tt",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "gd-GB", "default", {
+	name: "gd-GB",
+	englishName: "Scottish Gaelic (United Kingdom)",
+	nativeName: "Gàidhlig (An Rìoghachd Aonaichte)",
+	language: "gd",
+	numberFormat: {
+		negativeInfinity: "-Neo-chrìochnachd",
+		positiveInfinity: "Neo-chrìochnachd",
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Didòmhnaich","Diluain","Dimàirt","Diciadain","Diardaoin","Dihaoine","Disathairne"],
+				namesAbbr: ["Dòm","Lua","Mài","Cia","Ard","Hao","Sat"],
+				namesShort: ["D","L","M","C","A","H","S"]
+			},
+			months: {
+				names: ["Am Faoilleach","An Gearran","Am Màrt","An Giblean","An Cèitean","An t-Ògmhios","An t-Iuchar","An Lùnastal","An t-Sultain","An Dàmhair","An t-Samhain","An Dùbhlachd",""],
+				namesAbbr: ["Fao","Gea","Màr","Gib","Cèi","Ògm","Iuc","Lùn","Sul","Dàm","Sam","Dùb",""]
+			},
+			AM: ["m","m","M"],
+			PM: ["f","f","F"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-IQ", "default", {
+	name: "ar-IQ",
+	englishName: "Arabic (Iraq)",
+	nativeName: "العربية (العراق)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.ع.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-CN", "default", {
+	name: "zh-CN",
+	englishName: "Chinese (Simplified, PRC)",
+	nativeName: "中文(中华人民共和国)",
+	language: "zh-CHS",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-CH", "default", {
+	name: "de-CH",
+	englishName: "German (Switzerland)",
+	nativeName: "Deutsch (Schweiz)",
+	language: "de",
+	numberFormat: {
+		",": "'",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "Fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-GB", "default", {
+	name: "en-GB",
+	englishName: "English (United Kingdom)",
+	nativeName: "English (United Kingdom)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "£"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-MX", "default", {
+	name: "es-MX",
+	englishName: "Spanish (Mexico)",
+	nativeName: "Español (México)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-BE", "default", {
+	name: "fr-BE",
+	englishName: "French (Belgium)",
+	nativeName: "français (Belgique)",
+	language: "fr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "it-CH", "default", {
+	name: "it-CH",
+	englishName: "Italian (Switzerland)",
+	nativeName: "italiano (Svizzera)",
+	language: "it",
+	numberFormat: {
+		",": "'",
+		NaN: "Non un numero reale",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],
+				namesAbbr: ["dom","lun","mar","mer","gio","ven","sab"],
+				namesShort: ["do","lu","ma","me","gi","ve","sa"]
+			},
+			months: {
+				names: ["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre",""],
+				namesAbbr: ["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nl-BE", "default", {
+	name: "nl-BE",
+	englishName: "Dutch (Belgium)",
+	nativeName: "Nederlands (België)",
+	language: "nl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Niet-een-getal)",
+		negativeInfinity: "-oneindig",
+		positiveInfinity: "oneindig",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],
+				namesAbbr: ["zo","ma","di","wo","do","vr","za"],
+				namesShort: ["zo","ma","di","wo","do","vr","za"]
+			},
+			months: {
+				names: ["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd d MMMM yyyy H:mm",
+				F: "dddd d MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nn-NO", "default", {
+	name: "nn-NO",
+	englishName: "Norwegian, Nynorsk (Norway)",
+	nativeName: "norsk, nynorsk (Noreg)",
+	language: "nn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],
+				namesAbbr: ["sø","må","ty","on","to","fr","la"],
+				namesShort: ["sø","må","ty","on","to","fr","la"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "pt-PT", "default", {
+	name: "pt-PT",
+	englishName: "Portuguese (Portugal)",
+	nativeName: "português (Portugal)",
+	language: "pt",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NaN (Não é um número)",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "+Infinito",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],
+				namesAbbr: ["dom","seg","ter","qua","qui","sex","sáb"],
+				namesShort: ["D","S","T","Q","Q","S","S"]
+			},
+			months: {
+				names: ["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro",""],
+				namesAbbr: ["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, d' de 'MMMM' de 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d' de 'MMMM' de 'yyyy HH:mm",
+				F: "dddd, d' de 'MMMM' de 'yyyy HH:mm:ss",
+				M: "d/M",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn-CS", "default", {
+	name: "sr-Latn-CS",
+	englishName: "Serbian (Latin, Serbia and Montenegro (Former))",
+	nativeName: "srpski (Srbija i Crna Gora (Prethodno))",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sv-FI", "default", {
+	name: "sv-FI",
+	englishName: "Swedish (Finland)",
+	nativeName: "svenska (Finland)",
+	language: "sv",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],
+				namesAbbr: ["sö","må","ti","on","to","fr","lö"],
+				namesShort: ["sö","må","ti","on","to","fr","lö"]
+			},
+			months: {
+				names: ["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "'den 'd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "'den 'd MMMM yyyy HH:mm",
+				F: "'den 'd MMMM yyyy HH:mm:ss",
+				M: "'den 'd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az-Cyrl-AZ", "default", {
+	name: "az-Cyrl-AZ",
+	englishName: "Azeri (Cyrillic, Azerbaijan)",
+	nativeName: "Азәрбајҹан (Азәрбајҹан)",
+	language: "az-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "ман."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],
+				namesAbbr: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],
+				namesShort: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"]
+			},
+			months: {
+				names: ["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["јанвар","феврал","март","апрел","мај","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","мая","ијун","ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "dsb-DE", "default", {
+	name: "dsb-DE",
+	englishName: "Lower Sorbian (Germany)",
+	nativeName: "dolnoserbšćina (Nimska)",
+	language: "dsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekońcne",
+		positiveInfinity: "+njekońcne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njeźela","ponjeźele","wałtora","srjoda","stwortk","pětk","sobota"],
+				namesAbbr: ["nje","pon","wał","srj","stw","pět","sob"],
+				namesShort: ["n","p","w","s","s","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'goź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'goź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "se-SE", "default", {
+	name: "se-SE",
+	englishName: "Sami, Northern (Sweden)",
+	nativeName: "davvisámegiella (Ruoŧŧa)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","mánnodat","disdat","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","mán","dis","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ga-IE", "default", {
+	name: "ga-IE",
+	englishName: "Irish (Ireland)",
+	nativeName: "Gaeilge (Éire)",
+	language: "ga",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Dé Domhnaigh","Dé Luain","Dé Máirt","Dé Céadaoin","Déardaoin","Dé hAoine","Dé Sathairn"],
+				namesAbbr: ["Domh","Luan","Máir","Céad","Déar","Aoi","Sath"],
+				namesShort: ["Do","Lu","Má","Cé","De","Ao","Sa"]
+			},
+			months: {
+				names: ["Eanáir","Feabhra","Márta","Aibreán","Bealtaine","Meitheamh","Iúil","Lúnasa","Meán Fómhair","Deireadh Fómhair","Samhain","Nollaig",""],
+				namesAbbr: ["Ean","Feabh","Már","Aib","Bealt","Meith","Iúil","Lún","M.Fómh","D.Fómh","Samh","Noll",""]
+			},
+			AM: ["r.n.","r.n.","R.N."],
+			PM: ["i.n.","i.n.","I.N."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ms-BN", "default", {
+	name: "ms-BN",
+	englishName: "Malay (Brunei Darussalam)",
+	nativeName: "Bahasa Melayu (Brunei Darussalam)",
+	language: "ms",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			decimals: 0,
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],
+				namesAbbr: ["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],
+				namesShort: ["A","I","S","R","K","J","S"]
+			},
+			months: {
+				names: ["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember",""],
+				namesAbbr: ["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM yyyy H:mm",
+				F: "dd MMMM yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz-Cyrl-UZ", "default", {
+	name: "uz-Cyrl-UZ",
+	englishName: "Uzbek (Cyrillic, Uzbekistan)",
+	nativeName: "Ўзбек (Ўзбекистон)",
+	language: "uz-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "сўм"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],
+				namesAbbr: ["якш","дш","сш","чш","пш","ж","ш"],
+				namesShort: ["я","д","с","ч","п","ж","ш"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","мая","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'йил' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'йил' d-MMMM HH:mm",
+				F: "yyyy 'йил' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bn-BD", "default", {
+	name: "bn-BD",
+	englishName: "Bengali (Bangladesh)",
+	nativeName: "বাংলা (বাংলাদেশ)",
+	language: "bn",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			pattern: ["-%n","%n"],
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "৳"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			":": ".",
+			firstDay: 1,
+			days: {
+				names: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
+				namesAbbr: ["রবি.","সোম.","মঙ্গল.","বুধ.","বৃহস্পতি.","শুক্র.","শনি."],
+				namesShort: ["র","স","ম","ব","ব","শ","শ"]
+			},
+			months: {
+				names: ["জানুয়ারী","ফেব্রুয়ারী","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর",""],
+				namesAbbr: ["জানু.","ফেব্রু.","মার্চ","এপ্রিল","মে","জুন","জুলাই","আগ.","সেপ্টে.","অক্টো.","নভে.","ডিসে.",""]
+			},
+			AM: ["পুর্বাহ্ন","পুর্বাহ্ন","পুর্বাহ্ন"],
+			PM: ["অপরাহ্ন","অপরাহ্ন","অপরাহ্ন"],
+			patterns: {
+				d: "dd-MM-yy",
+				D: "dd MMMM yyyy",
+				t: "HH.mm",
+				T: "HH.mm.ss",
+				f: "dd MMMM yyyy HH.mm",
+				F: "dd MMMM yyyy HH.mm.ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn-Mong-CN", "default", {
+	name: "mn-Mong-CN",
+	englishName: "Mongolian (Traditional Mongolian, PRC)",
+	nativeName: "ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ (ᠪᠦᠭᠦᠳᠡ ᠨᠠᠢᠷᠠᠮᠳᠠᠬᠤ ᠳᠤᠮᠳᠠᠳᠤ ᠠᠷᠠᠳ ᠣᠯᠣᠰ)",
+	language: "mn-Mong",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ᠲᠤᠭᠠᠠ ᠪᠤᠰᠤ",
+		negativeInfinity: "ᠰᠦᠬᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠡᠬᠡ",
+		positiveInfinity: "ᠡᠶ᠋ᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠠᠬᠡ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesAbbr: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesShort: ["ᠡ‍","ᠨᠢ‍","ᠬᠣ‍","ᠭᠤ‍","ᠳᠥ‍","ᠲᠠ‍","ᠵᠢ‍"]
+			},
+			months: {
+				names: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""],
+				namesAbbr: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ᠣᠨ ᠲᠣᠭᠠᠯᠠᠯ ᠤᠨ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm",
+				F: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm:ss",
+				M: "M'ᠰᠠᠷ᠎ᠠ' d'ᠡᠳᠦᠷ'",
+				Y: "yyyy'ᠣᠨ' M'ᠰᠠᠷ᠎ᠠ'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu-Latn-CA", "default", {
+	name: "iu-Latn-CA",
+	englishName: "Inuktitut (Latin, Canada)",
+	nativeName: "Inuktitut (Kanatami)",
+	language: "iu-Latn",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tzm-Latn-DZ", "default", {
+	name: "tzm-Latn-DZ",
+	englishName: "Tamazight (Latin, Algeria)",
+	nativeName: "Tamazight (Djazaïr)",
+	language: "tzm-Latn",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "quz-EC", "default", {
+	name: "quz-EC",
+	englishName: "Quechua (Ecuador)",
+	nativeName: "runasimi (Ecuador)",
+	language: "quz",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-EG", "default", {
+	name: "ar-EG",
+	englishName: "Arabic (Egypt)",
+	nativeName: "العربية (مصر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ج.م.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-HK", "default", {
+	name: "zh-HK",
+	englishName: "Chinese (Traditional, Hong Kong S.A.R.)",
+	nativeName: "中文(香港特別行政區)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-AT", "default", {
+	name: "de-AT",
+	englishName: "German (Austria)",
+	nativeName: "Deutsch (Österreich)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, dd. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, dd. MMMM yyyy HH:mm",
+				F: "dddd, dd. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-AU", "default", {
+	name: "en-AU",
+	englishName: "English (Australia)",
+	nativeName: "English (Australia)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-ES", "default", {
+	name: "es-ES",
+	englishName: "Spanish (Spain, International Sort)",
+	nativeName: "Español (España, alfabetización internacional)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-CA", "default", {
+	name: "fr-CA",
+	englishName: "French (Canada)",
+	nativeName: "français (Canada)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["(n $)","n $"],
+			",": " ",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d MMMM yyyy HH:mm",
+				F: "d MMMM yyyy HH:mm:ss",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl-CS", "default", {
+	name: "sr-Cyrl-CS",
+	englishName: "Serbian (Cyrillic, Serbia and Montenegro (Former))",
+	nativeName: "српски (Србија и Црна Гора (Претходно))",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "se-FI", "default", {
+	name: "se-FI",
+	englishName: "Sami, Northern (Finland)",
+	nativeName: "davvisámegiella (Suopma)",
+	language: "se",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],
+				namesAbbr: ["sotn","vuos","maŋ","gask","duor","bear","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			monthsGenitive: {
+				names: ["ođđajagimánu","guovvamánu","njukčamánu","cuoŋománu","miessemánu","geassemánu","suoidnemánu","borgemánu","čakčamánu","golggotmánu","skábmamánu","juovlamánu",""],
+				namesAbbr: ["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. b. 'yyyy H:mm",
+				F: "MMMM d'. b. 'yyyy H:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "quz-PE", "default", {
+	name: "quz-PE",
+	englishName: "Quechua (Peru)",
+	nativeName: "runasimi (Piruw)",
+	language: "quz",
+	numberFormat: {
+		percent: {
+			pattern: ["-%n","%n"]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			symbol: "S/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["intichaw","killachaw","atipachaw","quyllurchaw","Ch' askachaw","Illapachaw","k'uychichaw"],
+				namesAbbr: ["int","kil","ati","quy","Ch'","Ill","k'u"],
+				namesShort: ["d","k","a","m","h","b","k"]
+			},
+			months: {
+				names: ["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq'a","Kapaq Raymi",""],
+				namesAbbr: ["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-LY", "default", {
+	name: "ar-LY",
+	englishName: "Arabic (Libya)",
+	nativeName: "العربية (ليبيا)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$n"],
+			decimals: 3,
+			symbol: "د.ل.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-SG", "default", {
+	name: "zh-SG",
+	englishName: "Chinese (Simplified, Singapore)",
+	nativeName: "中文(新加坡)",
+	language: "zh-CHS",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "tt h:mm",
+				T: "tt h:mm:ss",
+				f: "yyyy'年'M'月'd'日' tt h:mm",
+				F: "yyyy'年'M'月'd'日' tt h:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-LU", "default", {
+	name: "de-LU",
+	englishName: "German (Luxembourg)",
+	nativeName: "Deutsch (Luxemburg)",
+	language: "de",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-CA", "default", {
+	name: "en-CA",
+	englishName: "English (Canada)",
+	nativeName: "English (Canada)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "MMMM-dd-yy",
+				f: "MMMM-dd-yy h:mm tt",
+				F: "MMMM-dd-yy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-GT", "default", {
+	name: "es-GT",
+	englishName: "Spanish (Guatemala)",
+	nativeName: "Español (Guatemala)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "Q"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-CH", "default", {
+	name: "fr-CH",
+	englishName: "French (Switzerland)",
+	nativeName: "français (Suisse)",
+	language: "fr",
+	numberFormat: {
+		",": "'",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "fr."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "hr-BA", "default", {
+	name: "hr-BA",
+	englishName: "Croatian (Latin, Bosnia and Herzegovina)",
+	nativeName: "hrvatski (Bosna i Hercegovina)",
+	language: "hr",
+	numberFormat: {
+		pattern: ["- n"],
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			monthsGenitive: {
+				names: ["siječnja","veljače","ožujka","travnja","svibnja","lipnja","srpnja","kolovoza","rujna","listopada","studenog","prosinca",""],
+				namesAbbr: ["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy.",
+				D: "d. MMMM yyyy.",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy. H:mm",
+				F: "d. MMMM yyyy. H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smj-NO", "default", {
+	name: "smj-NO",
+	englishName: "Sami, Lule (Norway)",
+	nativeName: "julevusámegiella (Vuodna)",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["sådnåbiejvve","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["såd","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["s","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-DZ", "default", {
+	name: "ar-DZ",
+	englishName: "Arabic (Algeria)",
+	nativeName: "العربية (الجزائر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.ج.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-MO", "default", {
+	name: "zh-MO",
+	englishName: "Chinese (Traditional, Macao S.A.R.)",
+	nativeName: "中文(澳門特別行政區)",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "MOP"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "de-LI", "default", {
+	name: "de-LI",
+	englishName: "German (Liechtenstein)",
+	nativeName: "Deutsch (Liechtenstein)",
+	language: "de",
+	numberFormat: {
+		",": "'",
+		NaN: "n. def.",
+		negativeInfinity: "-unendlich",
+		positiveInfinity: "+unendlich",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": "'"
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": "'",
+			symbol: "CHF"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],
+				namesAbbr: ["So","Mo","Di","Mi","Do","Fr","Sa"],
+				namesShort: ["So","Mo","Di","Mi","Do","Fr","Sa"]
+			},
+			months: {
+				names: ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember",""],
+				namesAbbr: ["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n. Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "dddd, d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd, d. MMMM yyyy HH:mm",
+				F: "dddd, d. MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-NZ", "default", {
+	name: "en-NZ",
+	englishName: "English (New Zealand)",
+	nativeName: "English (New Zealand)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "dddd, d MMMM yyyy",
+				f: "dddd, d MMMM yyyy h:mm tt",
+				F: "dddd, d MMMM yyyy h:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-CR", "default", {
+	name: "es-CR",
+	englishName: "Spanish (Costa Rica)",
+	nativeName: "Español (Costa Rica)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			",": ".",
+			".": ",",
+			symbol: "₡"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-LU", "default", {
+	name: "fr-LU",
+	englishName: "French (Luxembourg)",
+	nativeName: "français (Luxembourg)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs-Latn-BA", "default", {
+	name: "bs-Latn-BA",
+	englishName: "Bosnian (Latin, Bosnia and Herzegovina)",
+	nativeName: "bosanski (Bosna i Hercegovina)",
+	language: "bs-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smj-SE", "default", {
+	name: "smj-SE",
+	englishName: "Sami, Lule (Sweden)",
+	nativeName: "julevusámegiella (Svierik)",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["ájl","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["á","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-MA", "default", {
+	name: "ar-MA",
+	englishName: "Arabic (Morocco)",
+	nativeName: "العربية (المملكة المغربية)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.م.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","ماي","يونيو","يوليوز","غشت","شتنبر","أكتوبر","نونبر","دجنبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-IE", "default", {
+	name: "en-IE",
+	englishName: "English (Ireland)",
+	nativeName: "English (Ireland)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-PA", "default", {
+	name: "es-PA",
+	englishName: "Spanish (Panama)",
+	nativeName: "Español (Panamá)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			symbol: "B/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "fr-MC", "default", {
+	name: "fr-MC",
+	englishName: "French (Monaco)",
+	nativeName: "français (Principauté de Monaco)",
+	language: "fr",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd d MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dddd d MMMM yyyy HH:mm",
+				F: "dddd d MMMM yyyy HH:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn-BA", "default", {
+	name: "sr-Latn-BA",
+	englishName: "Serbian (Latin, Bosnia and Herzegovina)",
+	nativeName: "srpski (Bosna i Hercegovina)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sma-NO", "default", {
+	name: "sma-NO",
+	englishName: "Sami, Southern (Norway)",
+	nativeName: "åarjelsaemiengiele (Nöörje)",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-%n","%n"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-TN", "default", {
+	name: "ar-TN",
+	englishName: "Arabic (Tunisia)",
+	nativeName: "العربية (تونس)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ت.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MM/yyyy H:mm",
+				F: "dd/MM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd/MMMM/yyyy H:mm",
+				F: "dd/MMMM/yyyy H:mm:ss",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, MMMM dd, yyyy H:mm",
+				F: "dddd, MMMM dd, yyyy H:mm:ss"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-ZA", "default", {
+	name: "en-ZA",
+	englishName: "English (South Africa)",
+	nativeName: "English (South Africa)",
+	numberFormat: {
+		",": " ",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " "
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "R"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "yyyy/MM/dd",
+				D: "dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM yyyy hh:mm tt",
+				F: "dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-DO", "default", {
+	name: "es-DO",
+	englishName: "Spanish (Dominican Republic)",
+	nativeName: "Español (República Dominicana)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			symbol: "RD$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl-BA", "default", {
+	name: "sr-Cyrl-BA",
+	englishName: "Serbian (Cyrillic, Bosnia and Herzegovina)",
+	nativeName: "српски (Босна и Херцеговина)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sma-SE", "default", {
+	name: "sma-SE",
+	englishName: "Sami, Southern (Sweden)",
+	nativeName: "åarjelsaemiengiele (Sveerje)",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-OM", "default", {
+	name: "ar-OM",
+	englishName: "Arabic (Oman)",
+	nativeName: "العربية (عمان)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "ر.ع.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-JM", "default", {
+	name: "en-JM",
+	englishName: "English (Jamaica)",
+	nativeName: "English (Jamaica)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"],
+			symbol: "J$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-VE", "default", {
+	name: "es-VE",
+	englishName: "Spanish (Bolivarian Republic of Venezuela)",
+	nativeName: "Español (Republica Bolivariana de Venezuela)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "Bs. F."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs-Cyrl-BA", "default", {
+	name: "bs-Cyrl-BA",
+	englishName: "Bosnian (Cyrillic, Bosnia and Herzegovina)",
+	nativeName: "босански (Босна и Херцеговина)",
+	language: "bs-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sms-FI", "default", {
+	name: "sms-FI",
+	englishName: "Sami, Skolt (Finland)",
+	nativeName: "sääm´ǩiõll (Lää´ddjânnam)",
+	language: "sms",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],
+				namesAbbr: ["pâ","vu","mâ","se","ne","pi","su"],
+				namesShort: ["p","v","m","s","n","p","s"]
+			},
+			months: {
+				names: ["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			monthsGenitive: {
+				names: ["ođđee´jjmannu","tä´lvvmannu","pâ´zzlâšttammannu","njuhččmannu","vue´ssmannu","ǩie´ssmannu","suei´nnmannu","på´rǧǧmannu","čõhččmannu","kålggmannu","skamm´mannu","rosttovmannu",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-YE", "default", {
+	name: "ar-YE",
+	englishName: "Arabic (Yemen)",
+	nativeName: "العربية (اليمن)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.ي.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-029", "default", {
+	name: "en-029",
+	englishName: "English (Caribbean)",
+	nativeName: "English (Caribbean)",
+	numberFormat: {
+		currency: {
+			pattern: ["-$n","$n"]
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			patterns: {
+				d: "MM/dd/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-CO", "default", {
+	name: "es-CO",
+	englishName: "Spanish (Colombia)",
+	nativeName: "Español (Colombia)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn-RS", "default", {
+	name: "sr-Latn-RS",
+	englishName: "Serbian (Latin, Serbia)",
+	nativeName: "srpski (Srbija)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smn-FI", "default", {
+	name: "smn-FI",
+	englishName: "Sami, Inari (Finland)",
+	nativeName: "sämikielâ (Suomâ)",
+	language: "smn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],
+				namesAbbr: ["pa","vu","ma","ko","tu","vá","lá"],
+				namesShort: ["p","v","m","k","t","v","l"]
+			},
+			months: {
+				names: ["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu",""],
+				namesAbbr: ["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-SY", "default", {
+	name: "ar-SY",
+	englishName: "Arabic (Syria)",
+	nativeName: "العربية (سوريا)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.س.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-BZ", "default", {
+	name: "en-BZ",
+	englishName: "English (Belize)",
+	nativeName: "English (Belize)",
+	numberFormat: {
+		currency: {
+			groupSizes: [3,0],
+			symbol: "BZ$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd MMMM yyyy hh:mm tt",
+				F: "dddd, dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-PE", "default", {
+	name: "es-PE",
+	englishName: "Spanish (Peru)",
+	nativeName: "Español (Perú)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["$ -n","$ n"],
+			symbol: "S/."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl-RS", "default", {
+	name: "sr-Cyrl-RS",
+	englishName: "Serbian (Cyrillic, Serbia)",
+	nativeName: "српски (Србија)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-JO", "default", {
+	name: "ar-JO",
+	englishName: "Arabic (Jordan)",
+	nativeName: "العربية (الأردن)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ا.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-TT", "default", {
+	name: "en-TT",
+	englishName: "English (Trinidad and Tobago)",
+	nativeName: "English (Trinidad y Tobago)",
+	numberFormat: {
+		currency: {
+			groupSizes: [3,0],
+			symbol: "TT$"
+		}
+	},
+	calendars: {
+		standard: {
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd MMMM yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd MMMM yyyy hh:mm tt",
+				F: "dddd, dd MMMM yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-AR", "default", {
+	name: "es-AR",
+	englishName: "Spanish (Argentina)",
+	nativeName: "Español (Argentina)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["$-n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn-ME", "default", {
+	name: "sr-Latn-ME",
+	englishName: "Serbian (Latin, Montenegro)",
+	nativeName: "srpski (Crna Gora)",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-LB", "default", {
+	name: "ar-LB",
+	englishName: "Arabic (Lebanon)",
+	nativeName: "العربية (لبنان)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ل.ل.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 1,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_TransliteratedEnglish: {
+			name: "Gregorian_TransliteratedEnglish",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["أ","ا","ث","أ","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 1,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-ZW", "default", {
+	name: "en-ZW",
+	englishName: "English (Zimbabwe)",
+	nativeName: "English (Zimbabwe)",
+	numberFormat: {
+		currency: {
+			symbol: "Z$"
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-EC", "default", {
+	name: "es-EC",
+	englishName: "Spanish (Ecuador)",
+	nativeName: "Español (Ecuador)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl-ME", "default", {
+	name: "sr-Cyrl-ME",
+	englishName: "Serbian (Cyrillic, Montenegro)",
+	nativeName: "српски (Црна Гора)",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-KW", "default", {
+	name: "ar-KW",
+	englishName: "Arabic (Kuwait)",
+	nativeName: "العربية (الكويت)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ك.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-PH", "default", {
+	name: "en-PH",
+	englishName: "English (Republic of the Philippines)",
+	nativeName: "English (Philippines)",
+	numberFormat: {
+		currency: {
+			symbol: "Php"
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-CL", "default", {
+	name: "es-CL",
+	englishName: "Spanish (Chile)",
+	nativeName: "Español (Chile)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-$ n","$ n"],
+			",": ".",
+			".": ","
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dddd, dd' de 'MMMM' de 'yyyy H:mm",
+				F: "dddd, dd' de 'MMMM' de 'yyyy H:mm:ss",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-AE", "default", {
+	name: "ar-AE",
+	englishName: "Arabic (U.A.E.)",
+	nativeName: "العربية (الإمارات العربية المتحدة)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "د.إ.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-UY", "default", {
+	name: "es-UY",
+	englishName: "Spanish (Uruguay)",
+	nativeName: "Español (Uruguay)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$U"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-BH", "default", {
+	name: "ar-BH",
+	englishName: "Arabic (Bahrain)",
+	nativeName: "العربية (البحرين)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		decimals: 3,
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		percent: {
+			decimals: 3
+		},
+		currency: {
+			pattern: ["$n-","$ n"],
+			decimals: 3,
+			symbol: "د.ب.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-PY", "default", {
+	name: "es-PY",
+	englishName: "Spanish (Paraguay)",
+	nativeName: "Español (Paraguay)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "Gs"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ar-QA", "default", {
+	name: "ar-QA",
+	englishName: "Arabic (Qatar)",
+	nativeName: "العربية (قطر)",
+	language: "ar",
+	isRTL: true,
+	numberFormat: {
+		pattern: ["n-"],
+		NaN: "ليس برقم",
+		negativeInfinity: "-لا نهاية",
+		positiveInfinity: "+لا نهاية",
+		currency: {
+			pattern: ["$n-","$ n"],
+			symbol: "ر.ق.‏"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dd MMMM, yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd MMMM, yyyy hh:mm tt",
+				F: "dd MMMM, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		UmAlQura: {
+			name: "UmAlQura",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MMMM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MMMM/yyyy hh:mm tt",
+				F: "dd/MMMM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    _yearInfo: [
+                        // MonthLengthFlags, Gregorian Date
+                        [746, -2198707200000],
+                        [1769, -2168121600000],
+                        [3794, -2137449600000],
+                        [3748, -2106777600000],
+                        [3402, -2076192000000],
+                        [2710, -2045606400000],
+                        [1334, -2015020800000],
+                        [2741, -1984435200000],
+                        [3498, -1953763200000],
+                        [2980, -1923091200000],
+                        [2889, -1892505600000],
+                        [2707, -1861920000000],
+                        [1323, -1831334400000],
+                        [2647, -1800748800000],
+                        [1206, -1770076800000],
+                        [2741, -1739491200000],
+                        [1450, -1708819200000],
+                        [3413, -1678233600000],
+                        [3370, -1647561600000],
+                        [2646, -1616976000000],
+                        [1198, -1586390400000],
+                        [2397, -1555804800000],
+                        [748, -1525132800000],
+                        [1749, -1494547200000],
+                        [1706, -1463875200000],
+                        [1365, -1433289600000],
+                        [1195, -1402704000000],
+                        [2395, -1372118400000],
+                        [698, -1341446400000],
+                        [1397, -1310860800000],
+                        [2994, -1280188800000],
+                        [1892, -1249516800000],
+                        [1865, -1218931200000],
+                        [1621, -1188345600000],
+                        [683, -1157760000000],
+                        [1371, -1127174400000],
+                        [2778, -1096502400000],
+                        [1748, -1065830400000],
+                        [3785, -1035244800000],
+                        [3474, -1004572800000],
+                        [3365, -973987200000],
+                        [2637, -943401600000],
+                        [685, -912816000000],
+                        [1389, -882230400000],
+                        [2922, -851558400000],
+                        [2898, -820886400000],
+                        [2725, -790300800000],
+                        [2635, -759715200000],
+                        [1175, -729129600000],
+                        [2359, -698544000000],
+                        [694, -667872000000],
+                        [1397, -637286400000],
+                        [3434, -606614400000],
+                        [3410, -575942400000],
+                        [2710, -545356800000],
+                        [2349, -514771200000],
+                        [605, -484185600000],
+                        [1245, -453600000000],
+                        [2778, -422928000000],
+                        [1492, -392256000000],
+                        [3497, -361670400000],
+                        [3410, -330998400000],
+                        [2730, -300412800000],
+                        [1238, -269827200000],
+                        [2486, -239241600000],
+                        [884, -208569600000],
+                        [1897, -177984000000],
+                        [1874, -147312000000],
+                        [1701, -116726400000],
+                        [1355, -86140800000],
+                        [2731, -55555200000],
+                        [1370, -24883200000],
+                        [2773, 5702400000],
+                        [3538, 36374400000],
+                        [3492, 67046400000],
+                        [3401, 97632000000],
+                        [2709, 128217600000],
+                        [1325, 158803200000],
+                        [2653, 189388800000],
+                        [1370, 220060800000],
+                        [2773, 250646400000],
+                        [1706, 281318400000],
+                        [1685, 311904000000],
+                        [1323, 342489600000],
+                        [2647, 373075200000],
+                        [1198, 403747200000],
+                        [2422, 434332800000],
+                        [1388, 465004800000],
+                        [2901, 495590400000],
+                        [2730, 526262400000],
+                        [2645, 556848000000],
+                        [1197, 587433600000],
+                        [2397, 618019200000],
+                        [730, 648691200000],
+                        [1497, 679276800000],
+                        [3506, 709948800000],
+                        [2980, 740620800000],
+                        [2890, 771206400000],
+                        [2645, 801792000000],
+                        [693, 832377600000],
+                        [1397, 862963200000],
+                        [2922, 893635200000],
+                        [3026, 924307200000],
+                        [3012, 954979200000],
+                        [2953, 985564800000],
+                        [2709, 1016150400000],
+                        [1325, 1046736000000],
+                        [1453, 1077321600000],
+                        [2922, 1107993600000],
+                        [1748, 1138665600000],
+                        [3529, 1169251200000],
+                        [3474, 1199923200000],
+                        [2726, 1230508800000],
+                        [2390, 1261094400000],
+                        [686, 1291680000000],
+                        [1389, 1322265600000],
+                        [874, 1352937600000],
+                        [2901, 1383523200000],
+                        [2730, 1414195200000],
+                        [2381, 1444780800000],
+                        [1181, 1475366400000],
+                        [2397, 1505952000000],
+                        [698, 1536624000000],
+                        [1461, 1567209600000],
+                        [1450, 1597881600000],
+                        [3413, 1628467200000],
+                        [2714, 1659139200000],
+                        [2350, 1689724800000],
+                        [622, 1720310400000],
+                        [1373, 1750896000000],
+                        [2778, 1781568000000],
+                        [1748, 1812240000000],
+                        [1701, 1842825600000],
+                        [0, 1873411200000]
+                    ],
+                    minDate: -2198707200000,
+                    maxDate: 1873411199999,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var days = hday - 1,
+                            gyear = hyear - 1318;
+                        if (gyear < 0 || gyear >= this._yearInfo.length) return null;
+                        var info = this._yearInfo[gyear],
+                            gdate = new Date(info[1]),
+                            monthLength = info[0];
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the gregorian date in the same timezone,
+                        // not what the gregorian date was at GMT time, so we adjust for the offset.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        for (var i = 0; i < hmonth; i++) {
+                            days += 29 + (monthLength & 1);
+                            monthLength = monthLength >> 1;
+                        }
+                        gdate.setDate(gdate.getDate() + days);
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        // Date's ticks in javascript are always from the GMT time,
+                        // but we are interested in the hijri date in the same timezone,
+                        // not what the hijri date was at GMT time, so we adjust for the offset.
+                        var ticks = gdate - gdate.getTimezoneOffset() * 60000;
+                        if (ticks < this.minDate || ticks > this.maxDate) return null;
+                        var hyear = 0,
+                            hmonth = 1;
+                        // find the earliest gregorian date in the array that is greater than or equal to the given date
+                        while (ticks > this._yearInfo[++hyear][1]) { }
+                        if (ticks !== this._yearInfo[hyear][1]) {
+                            hyear--;
+                        }
+                        var info = this._yearInfo[hyear],
+                            // how many days has it been since the date we found in the array?
+                            // 86400000 = ticks per day
+                            days = Math.floor((ticks - info[1]) / 86400000),
+                            monthLength = info[0];
+                        hyear += 1318; // the Nth array entry corresponds to hijri year 1318+N
+                        // now increment day/month based on the total days, considering
+                        // how many days are in each month. We cannot run past the year
+                        // mark since we would have found a different array entry in that case.
+                        var daysInMonth = 29 + (monthLength & 1);
+                        while (days >= daysInMonth) {
+                            days -= daysInMonth;
+                            monthLength = monthLength >> 1;
+                            daysInMonth = 29 + (monthLength & 1);
+                            hmonth++;
+                        }
+                        // remaining days is less than is in one month, thus is the day of the month we landed on
+                        // hmonth-1 because in javascript months are zero based, stay consistent with that.
+                        return [hyear, hmonth - 1, days + 1];
+                    }
+			}
+		},
+		Hijri: {
+			name: "Hijri",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""],
+				namesAbbr: ["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"بعد الهجرة","start":null,"offset":0}],
+			twoDigitYearMax: 1451,
+			patterns: {
+				d: "dd/MM/yy",
+				D: "dd/MM/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dd/MM/yyyy hh:mm tt",
+				F: "dd/MM/yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			},
+			convert: {
+                    // Adapted to Script from System.Globalization.HijriCalendar
+                    ticks1970: 62135596800000,
+                    // number of days leading up to each month
+                    monthDays: [0, 30, 59, 89, 118, 148, 177, 207, 236, 266, 295, 325, 355],
+                    minDate: -42521673600000,
+                    maxDate: 253402300799999,
+                    // The number of days to add or subtract from the calendar to accommodate the variances
+                    // in the start and the end of Ramadan and to accommodate the date difference between
+                    // countries/regions. May be dynamically adjusted based on user preference, but should
+                    // remain in the range of -2 to 2, inclusive.
+                    hijriAdjustment: 0,
+                    toGregorian: function(hyear, hmonth, hday) {
+                        var daysSinceJan0101 = this.daysToYear(hyear) + this.monthDays[hmonth] + hday - 1 - this.hijriAdjustment;
+                        // 86400000 = ticks per day
+                        var gdate = new Date(daysSinceJan0101 * 86400000 - this.ticks1970);
+                        // adjust for timezone, because we are interested in the gregorian date for the same timezone
+                        // but ticks in javascript is always from GMT, unlike the server were ticks counts from the base
+                        // date in the current timezone.
+                        gdate.setMinutes(gdate.getMinutes() + gdate.getTimezoneOffset());
+                        return gdate;
+                    },
+                    fromGregorian: function(gdate) {
+                        if ((gdate < this.minDate) || (gdate > this.maxDate)) return null;
+                        var ticks = this.ticks1970 + (gdate-0) - gdate.getTimezoneOffset() * 60000,
+                            daysSinceJan0101 = Math.floor(ticks / 86400000) + 1 + this.hijriAdjustment;
+                        // very particular formula determined by someone smart, adapted from the server-side implementation.
+                        // it approximates the hijri year.
+                        var hday, hmonth, hyear = Math.floor(((daysSinceJan0101 - 227013) * 30) / 10631) + 1,
+                            absDays = this.daysToYear(hyear),
+                            daysInYear = this.isLeapYear(hyear) ? 355 : 354;
+                        // hyear is just approximate, it may need adjustment up or down by 1.
+                        if (daysSinceJan0101 < absDays) {
+                            hyear--;
+                            absDays -= daysInYear;
+                        }
+                        else if (daysSinceJan0101 === absDays) {
+                            hyear--;
+                            absDays = this.daysToYear(hyear);
+                        }
+                        else {
+                            if (daysSinceJan0101 > (absDays + daysInYear)) {
+                                absDays += daysInYear;
+                                hyear++;
+                            }
+                        }
+                        // determine month by looking at how many days into the hyear we are
+                        // monthDays contains the number of days up to each month.
+                        hmonth = 0;
+                        var daysIntoYear = daysSinceJan0101 - absDays;
+                        while (hmonth <= 11 && daysIntoYear > this.monthDays[hmonth]) {
+                            hmonth++;
+                        }
+                        hmonth--;
+                        hday = daysIntoYear - this.monthDays[hmonth];
+                        return [hyear, hmonth, hday];
+                    },
+                    daysToYear: function(year) {
+                        // calculates how many days since Jan 1, 0001
+                        var yearsToYear30 = Math.floor((year - 1) / 30) * 30,
+                            yearsInto30 = year - yearsToYear30 - 1,
+                            days = Math.floor((yearsToYear30 * 10631) / 30) + 227013;
+                        while (yearsInto30 > 0) {
+                            days += (this.isLeapYear(yearsInto30) ? 355 : 354);
+                            yearsInto30--;
+                        }
+                        return days;
+                    },
+                    isLeapYear: function(year) {
+                        return ((((year * 11) + 14) % 30) < 11);
+                    }
+			}
+		},
+		Gregorian_MiddleEastFrench: {
+			name: "Gregorian_MiddleEastFrench",
+			firstDay: 6,
+			days: {
+				names: ["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],
+				namesAbbr: ["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],
+				namesShort: ["di","lu","ma","me","je","ve","sa"]
+			},
+			months: {
+				names: ["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre",""],
+				namesAbbr: ["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc.",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"ap. J.-C.","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt",
+				M: "dd MMMM"
+			}
+		},
+		Gregorian_Arabic: {
+			name: "Gregorian_Arabic",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""],
+				namesAbbr: ["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		},
+		Gregorian_TransliteratedFrench: {
+			name: "Gregorian_TransliteratedFrench",
+			firstDay: 6,
+			days: {
+				names: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesAbbr: ["الأحد","الإثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],
+				namesShort: ["ح","ن","ث","ر","خ","ج","س"]
+			},
+			months: {
+				names: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""],
+				namesAbbr: ["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر",""]
+			},
+			AM: ["ص","ص","ص"],
+			PM: ["م","م","م"],
+			eras: [{"name":"م","start":null,"offset":0}],
+			patterns: {
+				d: "MM/dd/yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, MMMM dd, yyyy hh:mm tt",
+				F: "dddd, MMMM dd, yyyy hh:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-IN", "default", {
+	name: "en-IN",
+	englishName: "English (India)",
+	nativeName: "English (India)",
+	numberFormat: {
+		groupSizes: [3,2],
+		percent: {
+			groupSizes: [3,2]
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,2],
+			symbol: "Rs."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "dd MMMM yyyy HH:mm",
+				F: "dd MMMM yyyy HH:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-BO", "default", {
+	name: "es-BO",
+	englishName: "Spanish (Bolivia)",
+	nativeName: "Español (Bolivia)",
+	language: "es",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["($ n)","$ n"],
+			",": ".",
+			".": ",",
+			symbol: "$b"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-MY", "default", {
+	name: "en-MY",
+	englishName: "English (Malaysia)",
+	nativeName: "English (Malaysia)",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "RM"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM, yyyy",
+				f: "dddd, d MMMM, yyyy h:mm tt",
+				F: "dddd, d MMMM, yyyy h:mm:ss tt",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-SV", "default", {
+	name: "es-SV",
+	englishName: "Spanish (El Salvador)",
+	nativeName: "Español (El Salvador)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "en-SG", "default", {
+	name: "en-SG",
+	englishName: "English (Singapore)",
+	nativeName: "English (Singapore)",
+	numberFormat: {
+		percent: {
+			pattern: ["-n%","n%"]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				namesShort: ["S","M","T","W","T","F","S"]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd, d MMMM, yyyy",
+				f: "dddd, d MMMM, yyyy h:mm tt",
+				F: "dddd, d MMMM, yyyy h:mm:ss tt",
+				M: "d MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-HN", "default", {
+	name: "es-HN",
+	englishName: "Spanish (Honduras)",
+	nativeName: "Español (Honduras)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["$ -n","$ n"],
+			groupSizes: [3,0],
+			symbol: "L."
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-NI", "default", {
+	name: "es-NI",
+	englishName: "Spanish (Nicaragua)",
+	nativeName: "Español (Nicaragua)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			groupSizes: [3,0],
+			symbol: "C$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-PR", "default", {
+	name: "es-PR",
+	englishName: "Spanish (Puerto Rico)",
+	nativeName: "Español (Puerto Rico)",
+	language: "es",
+	numberFormat: {
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		currency: {
+			pattern: ["($ n)","$ n"],
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sá"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			AM: ["a.m.","a.m.","A.M."],
+			PM: ["p.m.","p.m.","P.M."],
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				d: "dd/MM/yyyy",
+				D: "dddd, dd' de 'MMMM' de 'yyyy",
+				t: "hh:mm tt",
+				T: "hh:mm:ss tt",
+				f: "dddd, dd' de 'MMMM' de 'yyyy hh:mm tt",
+				F: "dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt",
+				M: "dd MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "es-US", "default", {
+	name: "es-US",
+	englishName: "Spanish (United States)",
+	nativeName: "Español (Estados Unidos)",
+	language: "es",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "NeuN",
+		negativeInfinity: "-Infinito",
+		positiveInfinity: "Infinito",
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],
+				namesAbbr: ["dom","lun","mar","mié","jue","vie","sáb"],
+				namesShort: ["do","lu","ma","mi","ju","vi","sa"]
+			},
+			months: {
+				names: ["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre",""],
+				namesAbbr: ["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic",""]
+			},
+			eras: [{"name":"d.C.","start":null,"offset":0}],
+			patterns: {
+				M: "dd' de 'MMMM",
+				Y: "MMMM' de 'yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs-Cyrl", "default", {
+	name: "bs-Cyrl",
+	englishName: "Bosnian (Cyrillic)",
+	nativeName: "босански",
+	language: "bs-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "КМ"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недјеља","понедјељак","уторак","сриједа","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["н","п","у","с","ч","п","с"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs-Latn", "default", {
+	name: "bs-Latn",
+	englishName: "Bosnian (Latin)",
+	nativeName: "bosanski",
+	language: "bs-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Cyrl", "default", {
+	name: "sr-Cyrl",
+	englishName: "Serbian (Cyrillic)",
+	nativeName: "српски",
+	language: "sr-Cyrl",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-бесконачност",
+		positiveInfinity: "+бесконачност",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Дин."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["недеља","понедељак","уторак","среда","четвртак","петак","субота"],
+				namesAbbr: ["нед","пон","уто","сре","чет","пет","суб"],
+				namesShort: ["не","по","ут","ср","че","пе","су"]
+			},
+			months: {
+				names: ["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар",""],
+				namesAbbr: ["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"н.е.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr-Latn", "default", {
+	name: "sr-Latn",
+	englishName: "Serbian (Latin)",
+	nativeName: "srpski",
+	language: "sr-Latn",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smn", "default", {
+	name: "smn",
+	englishName: "Sami (Inari)",
+	nativeName: "sämikielâ",
+	language: "smn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],
+				namesAbbr: ["pa","vu","ma","ko","tu","vá","lá"],
+				namesShort: ["p","v","m","k","t","v","l"]
+			},
+			months: {
+				names: ["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu",""],
+				namesAbbr: ["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az-Cyrl", "default", {
+	name: "az-Cyrl",
+	englishName: "Azeri (Cyrillic)",
+	nativeName: "Азәрбајҹан дили",
+	language: "az-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "ман."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],
+				namesAbbr: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],
+				namesShort: ["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"]
+			},
+			months: {
+				names: ["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["јанвар","феврал","март","апрел","мај","ијун","ијул","август","сентјабр","октјабр","нојабр","декабр",""],
+				namesAbbr: ["Јан","Фев","Мар","Апр","мая","ијун","ијул","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sms", "default", {
+	name: "sms",
+	englishName: "Sami (Skolt)",
+	nativeName: "sääm´ǩiõll",
+	language: "sms",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],
+				namesAbbr: ["pâ","vu","mâ","se","ne","pi","su"],
+				namesShort: ["p","v","m","s","n","p","s"]
+			},
+			months: {
+				names: ["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			monthsGenitive: {
+				names: ["ođđee´jjmannu","tä´lvvmannu","pâ´zzlâšttammannu","njuhččmannu","vue´ssmannu","ǩie´ssmannu","suei´nnmannu","på´rǧǧmannu","čõhččmannu","kålggmannu","skamm´mannu","rosttovmannu",""],
+				namesAbbr: ["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "MMMM d'. p. 'yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "MMMM d'. p. 'yyyy H:mm",
+				F: "MMMM d'. p. 'yyyy H:mm:ss",
+				M: "MMMM d'. p. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh", "default", {
+	name: "zh",
+	englishName: "Chinese",
+	nativeName: "中文",
+	language: "zh",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nn", "default", {
+	name: "nn",
+	englishName: "Norwegian (Nynorsk)",
+	nativeName: "norsk (nynorsk)",
+	language: "nn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],
+				namesAbbr: ["sø","må","ty","on","to","fr","la"],
+				namesShort: ["sø","må","ty","on","to","fr","la"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "bs", "default", {
+	name: "bs",
+	englishName: "Bosnian",
+	nativeName: "bosanski",
+	language: "bs",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "KM"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sri","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","juni","juli","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "az-Latn", "default", {
+	name: "az-Latn",
+	englishName: "Azeri (Latin)",
+	nativeName: "Azərbaycan­ılı",
+	language: "az-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "man."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],
+				namesAbbr: ["B","Be","Ça","Ç","Ca","C","Ş"],
+				namesShort: ["B","Be","Ça","Ç","Ca","C","Ş"]
+			},
+			months: {
+				names: ["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			monthsGenitive: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				M: "d MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sma", "default", {
+	name: "sma",
+	englishName: "Sami (Southern)",
+	nativeName: "åarjelsaemiengiele",
+	language: "sma",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],
+				namesAbbr: ["aej","måa","dæj","gask","duar","bearj","laav"],
+				namesShort: ["a","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			monthsGenitive: {
+				names: ["tsïengelen","goevten","njoktjen","voerhtjen","suehpeden","ruffien","snjaltjen","mïetsken","skïereden","golken","rahkan","goeven",""],
+				namesAbbr: ["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz-Cyrl", "default", {
+	name: "uz-Cyrl",
+	englishName: "Uzbek (Cyrillic)",
+	nativeName: "Ўзбек",
+	language: "uz-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": " ",
+			".": ",",
+			symbol: "сўм"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],
+				namesAbbr: ["якш","дш","сш","чш","пш","ж","ш"],
+				namesShort: ["я","д","с","ч","п","ж","ш"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январ","феврал","март","апрел","май","июн","июл","август","сентябр","октябр","ноябр","декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","мая","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "yyyy 'йил' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'йил' d-MMMM HH:mm",
+				F: "yyyy 'йил' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn-Cyrl", "default", {
+	name: "mn-Cyrl",
+	englishName: "Mongolian (Cyrillic)",
+	nativeName: "Монгол хэл",
+	language: "mn-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n$","n$"],
+			",": " ",
+			".": ",",
+			symbol: "₮"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],
+				namesAbbr: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"],
+				namesShort: ["Ня","Да","Мя","Лх","Пү","Ба","Бя"]
+			},
+			months: {
+				names: ["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			monthsGenitive: {
+				names: ["1 дүгээр сарын","2 дугаар сарын","3 дугаар сарын","4 дүгээр сарын","5 дугаар сарын","6 дугаар сарын","7 дугаар сарын","8 дугаар сарын","9 дүгээр сарын","10 дугаар сарын","11 дүгээр сарын","12 дугаар сарын",""],
+				namesAbbr: ["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yy.MM.dd",
+				D: "yyyy 'оны' MMMM d",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy 'оны' MMMM d H:mm",
+				F: "yyyy 'оны' MMMM d H:mm:ss",
+				M: "d MMMM",
+				Y: "yyyy 'он' MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu-Cans", "default", {
+	name: "iu-Cans",
+	englishName: "Inuktitut (Syllabics)",
+	nativeName: "ᐃᓄᒃᑎᑐᑦ",
+	language: "iu-Cans",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["ᓈᑦᑏᖑᔭ","ᓇᒡᒐᔾᔭᐅ","ᐊᐃᑉᐱᖅ","ᐱᖓᑦᓯᖅ","ᓯᑕᒻᒥᖅ","ᑕᓪᓕᕐᒥᖅ","ᓯᕙᑖᕐᕕᒃ"],
+				namesAbbr: ["ᓈᑦᑏ","ᓇᒡᒐ","ᐊᐃᑉᐱ","ᐱᖓᑦᓯ","ᓯᑕ","ᑕᓪᓕ","ᓯᕙᑖᕐᕕᒃ"],
+				namesShort: ["ᓈ","ᓇ","ᐊ","ᐱ","ᓯ","ᑕ","ᓯ"]
+			},
+			months: {
+				names: ["ᔮᓐᓄᐊᕆ","ᕖᕝᕗᐊᕆ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌᓯ","ᓯᑎᐱᕆ","ᐅᑐᐱᕆ","ᓄᕕᐱᕆ","ᑎᓯᐱᕆ",""],
+				namesAbbr: ["ᔮᓐᓄ","ᕖᕝᕗ","ᒫᑦᓯ","ᐄᐳᕆ","ᒪᐃ","ᔫᓂ","ᔪᓚᐃ","ᐋᒡᒌ","ᓯᑎᐱ","ᐅᑐᐱ","ᓄᕕᐱ","ᑎᓯᐱ",""]
+			},
+			patterns: {
+				d: "d/M/yyyy",
+				D: "dddd,MMMM dd,yyyy",
+				f: "dddd,MMMM dd,yyyy h:mm tt",
+				F: "dddd,MMMM dd,yyyy h:mm:ss tt",
+				Y: "MMMM,yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-Hant", "default", {
+	name: "zh-Hant",
+	englishName: "Chinese (Traditional)",
+	nativeName: "中文(繁體)",
+	language: "zh-Hant",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "nb", "default", {
+	name: "nb",
+	englishName: "Norwegian (Bokmål)",
+	nativeName: "norsk (bokmål)",
+	language: "nb",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		negativeInfinity: "-INF",
+		positiveInfinity: "INF",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["$ -n","$ n"],
+			",": " ",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],
+				namesAbbr: ["sø","ma","ti","on","to","fr","lø"],
+				namesShort: ["sø","ma","ti","on","to","fr","lø"]
+			},
+			months: {
+				names: ["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember",""],
+				namesAbbr: ["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yyyy",
+				D: "d. MMMM yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "d. MMMM yyyy HH:mm",
+				F: "d. MMMM yyyy HH:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "sr", "default", {
+	name: "sr",
+	englishName: "Serbian",
+	nativeName: "srpski",
+	language: "sr",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		negativeInfinity: "-beskonačnost",
+		positiveInfinity: "+beskonačnost",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "Din."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			firstDay: 1,
+			days: {
+				names: ["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],
+				namesAbbr: ["ned","pon","uto","sre","čet","pet","sub"],
+				namesShort: ["ne","po","ut","sr","če","pe","su"]
+			},
+			months: {
+				names: ["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar",""],
+				namesAbbr: ["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"n.e.","start":null,"offset":0}],
+			patterns: {
+				d: "d.M.yyyy",
+				D: "d. MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d. MMMM yyyy H:mm",
+				F: "d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tg-Cyrl", "default", {
+	name: "tg-Cyrl",
+	englishName: "Tajik (Cyrillic)",
+	nativeName: "Тоҷикӣ",
+	language: "tg-Cyrl",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		groupSizes: [3,0],
+		negativeInfinity: "-бесконечность",
+		positiveInfinity: "бесконечность",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			groupSizes: [3,0],
+			",": " ",
+			".": ";",
+			symbol: "т.р."
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ".",
+			days: {
+				names: ["Яш","Душанбе","Сешанбе","Чоршанбе","Панҷшанбе","Ҷумъа","Шанбе"],
+				namesAbbr: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"],
+				namesShort: ["Яш","Дш","Сш","Чш","Пш","Ҷм","Шн"]
+			},
+			months: {
+				names: ["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			monthsGenitive: {
+				names: ["январи","феврали","марти","апрели","маи","июни","июли","августи","сентябри","октябри","ноябри","декабри",""],
+				namesAbbr: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd.MM.yy",
+				D: "d MMMM yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "d MMMM yyyy H:mm",
+				F: "d MMMM yyyy H:mm:ss",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "dsb", "default", {
+	name: "dsb",
+	englishName: "Lower Sorbian",
+	nativeName: "dolnoserbšćina",
+	language: "dsb",
+	numberFormat: {
+		",": ".",
+		".": ",",
+		NaN: "njedefinowane",
+		negativeInfinity: "-njekońcne",
+		positiveInfinity: "+njekońcne",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "€"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": ". ",
+			firstDay: 1,
+			days: {
+				names: ["njeźela","ponjeźele","wałtora","srjoda","stwortk","pětk","sobota"],
+				namesAbbr: ["nje","pon","wał","srj","stw","pět","sob"],
+				namesShort: ["n","p","w","s","s","p","s"]
+			},
+			months: {
+				names: ["januar","februar","měrc","apryl","maj","junij","julij","awgust","september","oktober","nowember","december",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			monthsGenitive: {
+				names: ["januara","februara","měrca","apryla","maja","junija","julija","awgusta","septembra","oktobra","nowembra","decembra",""],
+				namesAbbr: ["jan","feb","měr","apr","maj","jun","jul","awg","sep","okt","now","dec",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"po Chr.","start":null,"offset":0}],
+			patterns: {
+				d: "d. M. yyyy",
+				D: "dddd, 'dnja' d. MMMM yyyy",
+				t: "H.mm 'goź.'",
+				T: "H:mm:ss",
+				f: "dddd, 'dnja' d. MMMM yyyy H.mm 'goź.'",
+				F: "dddd, 'dnja' d. MMMM yyyy H:mm:ss",
+				M: "d. MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "smj", "default", {
+	name: "smj",
+	englishName: "Sami (Lule)",
+	nativeName: "julevusámegiella",
+	language: "smj",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			",": ".",
+			".": ",",
+			symbol: "kr"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 1,
+			days: {
+				names: ["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],
+				namesAbbr: ["ájl","mán","dis","gas","duor","bier","láv"],
+				namesShort: ["á","m","d","g","d","b","l"]
+			},
+			months: {
+				names: ["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			monthsGenitive: {
+				names: ["ådåjakmáno","guovvamáno","sjnjuktjamáno","vuoratjismáno","moarmesmáno","biehtsemáno","sjnjilltjamáno","bårggemáno","ragátmáno","gålgådismáno","basádismáno","javllamáno",""],
+				namesAbbr: ["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "yyyy-MM-dd",
+				D: "MMMM d'. b. 'yyyy",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "MMMM d'. b. 'yyyy HH:mm",
+				F: "MMMM d'. b. 'yyyy HH:mm:ss",
+				M: "MMMM d'. b. '",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "uz-Latn", "default", {
+	name: "uz-Latn",
+	englishName: "Uzbek (Latin)",
+	nativeName: "U'zbek",
+	language: "uz-Latn",
+	numberFormat: {
+		",": " ",
+		".": ",",
+		percent: {
+			pattern: ["-n%","n%"],
+			",": " ",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			decimals: 0,
+			",": " ",
+			".": ",",
+			symbol: "so'm"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],
+				namesAbbr: ["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],
+				namesShort: ["ya","d","s","ch","p","j","sh"]
+			},
+			months: {
+				names: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""],
+				namesAbbr: ["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd/MM yyyy",
+				D: "yyyy 'yil' d-MMMM",
+				t: "HH:mm",
+				T: "HH:mm:ss",
+				f: "yyyy 'yil' d-MMMM HH:mm",
+				F: "yyyy 'yil' d-MMMM HH:mm:ss",
+				M: "d-MMMM",
+				Y: "MMMM yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "mn-Mong", "default", {
+	name: "mn-Mong",
+	englishName: "Mongolian (Traditional Mongolian)",
+	nativeName: "ᠮᠤᠨᠭᠭᠤᠯ ᠬᠡᠯᠡ",
+	language: "mn-Mong",
+	numberFormat: {
+		groupSizes: [3,0],
+		NaN: "ᠲᠤᠭᠠᠠ ᠪᠤᠰᠤ",
+		negativeInfinity: "ᠰᠦᠬᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠡᠬᠡ",
+		positiveInfinity: "ᠡᠶ᠋ᠡᠷᠬᠦ ᠬᠢᠵᠠᠭᠠᠷᠭᠦᠢ ᠶᠠᠬᠡ",
+		percent: {
+			pattern: ["-n%","n%"],
+			groupSizes: [3,0]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			groupSizes: [3,0],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			firstDay: 1,
+			days: {
+				names: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesAbbr: ["ᠭᠠᠷᠠᠭ ᠤᠨ ᠡᠳᠦᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠨᠢᠭᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠬᠣᠶᠠᠷ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠭᠤᠷᠪᠠᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠳᠥᠷᠪᠡᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠲᠠᠪᠤᠨ","ᠭᠠᠷᠠᠭ ᠤᠨ ᠵᠢᠷᠭᠤᠭᠠᠨ"],
+				namesShort: ["ᠡ‍","ᠨᠢ‍","ᠬᠣ‍","ᠭᠤ‍","ᠳᠥ‍","ᠲᠠ‍","ᠵᠢ‍"]
+			},
+			months: {
+				names: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""],
+				namesAbbr: ["ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠭᠤᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠦᠷᠪᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠠᠪᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠵᠢᠷᠭᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠲᠤᠯᠤᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠨᠠᠢᠮᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠶᠢᠰᠦᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠨᠢᠭᠡᠳᠦᠭᠡᠷ ᠰᠠᠷ᠎ᠠ","ᠠᠷᠪᠠᠨ ᠬᠤᠶ᠋ᠠᠳᠤᠭᠠᠷ ᠰᠠᠷ᠎ᠠ",""]
+			},
+			AM: null,
+			PM: null,
+			eras: [{"name":"ᠣᠨ ᠲᠣᠭᠠᠯᠠᠯ ᠤᠨ","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm",
+				F: "yyyy'ᠣᠨ ᠤ᠋' M'ᠰᠠᠷ᠎ᠠ  ᠢᠢᠨ 'd' ᠤ᠋ ᠡᠳᠦᠷ' H:mm:ss",
+				M: "M'ᠰᠠᠷ᠎ᠠ' d'ᠡᠳᠦᠷ'",
+				Y: "yyyy'ᠣᠨ' M'ᠰᠠᠷ᠎ᠠ'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "iu-Latn", "default", {
+	name: "iu-Latn",
+	englishName: "Inuktitut (Latin)",
+	nativeName: "Inuktitut",
+	language: "iu-Latn",
+	numberFormat: {
+		groupSizes: [3,0],
+		percent: {
+			groupSizes: [3,0]
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Naattiinguja","Naggajjau","Aippiq","Pingatsiq","Sitammiq","Tallirmiq","Sivataarvik"],
+				namesAbbr: ["Nat","Nag","Aip","Pi","Sit","Tal","Siv"],
+				namesShort: ["N","N","A","P","S","T","S"]
+			},
+			months: {
+				names: ["Jaannuari","Viivvuari","Maatsi","Iipuri","Mai","Juuni","Julai","Aaggiisi","Sitipiri","Utupiri","Nuvipiri","Tisipiri",""],
+				namesAbbr: ["Jan","Viv","Mas","Ipu","Mai","Jun","Jul","Agi","Sii","Uut","Nuv","Tis",""]
+			},
+			patterns: {
+				d: "d/MM/yyyy",
+				D: "ddd, MMMM dd,yyyy",
+				f: "ddd, MMMM dd,yyyy h:mm tt",
+				F: "ddd, MMMM dd,yyyy h:mm:ss tt"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "tzm-Latn", "default", {
+	name: "tzm-Latn",
+	englishName: "Tamazight (Latin)",
+	nativeName: "Tamazight",
+	language: "tzm-Latn",
+	numberFormat: {
+		pattern: ["n-"],
+		",": ".",
+		".": ",",
+		NaN: "Non Numérique",
+		negativeInfinity: "-Infini",
+		positiveInfinity: "+Infini",
+		percent: {
+			",": ".",
+			".": ","
+		},
+		currency: {
+			pattern: ["-n $","n $"],
+			symbol: "DZD"
+		}
+	},
+	calendars: {
+		standard: {
+			"/": "-",
+			firstDay: 6,
+			days: {
+				names: ["Acer","Arime","Aram","Ahad","Amhadh","Sem","Sedh"],
+				namesAbbr: ["Ace","Ari","Ara","Aha","Amh","Sem","Sed"],
+				namesShort: ["Ac","Ar","Ar","Ah","Am","Se","Se"]
+			},
+			months: {
+				names: ["Yenayer","Furar","Maghres","Yebrir","Mayu","Yunyu","Yulyu","Ghuct","Cutenber","Ktuber","Wambir","Dujanbir",""],
+				namesAbbr: ["Yen","Fur","Mag","Yeb","May","Yun","Yul","Ghu","Cut","Ktu","Wam","Duj",""]
+			},
+			AM: null,
+			PM: null,
+			patterns: {
+				d: "dd-MM-yyyy",
+				D: "dd MMMM, yyyy",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "dd MMMM, yyyy H:mm",
+				F: "dd MMMM, yyyy H:mm:ss",
+				M: "dd MMMM"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "ha-Latn", "default", {
+	name: "ha-Latn",
+	englishName: "Hausa (Latin)",
+	nativeName: "Hausa",
+	language: "ha-Latn",
+	numberFormat: {
+		currency: {
+			pattern: ["$-n","$ n"],
+			symbol: "N"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["Lahadi","Litinin","Talata","Laraba","Alhamis","Juma'a","Asabar"],
+				namesAbbr: ["Lah","Lit","Tal","Lar","Alh","Jum","Asa"],
+				namesShort: ["L","L","T","L","A","J","A"]
+			},
+			months: {
+				names: ["Januwaru","Febreru","Maris","Afrilu","Mayu","Yuni","Yuli","Agusta","Satumba","Oktocba","Nuwamba","Disamba",""],
+				namesAbbr: ["Jan","Feb","Mar","Afr","May","Yun","Yul","Agu","Sat","Okt","Nuw","Dis",""]
+			},
+			AM: ["Safe","safe","SAFE"],
+			PM: ["Yamma","yamma","YAMMA"],
+			eras: [{"name":"AD","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-CHS", "default", {
+	name: "zh-CHS",
+	englishName: "Chinese (Simplified) Legacy",
+	nativeName: "中文(简体) 旧版",
+	language: "zh-CHS",
+	numberFormat: {
+		NaN: "非数字",
+		negativeInfinity: "负无穷大",
+		positiveInfinity: "正无穷大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			pattern: ["$-n","$n"],
+			symbol: "¥"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["周日","周一","周二","周三","周四","周五","周六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "yyyy/M/d",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+Globalize.addCultureInfo( "zh-CHT", "default", {
+	name: "zh-CHT",
+	englishName: "Chinese (Traditional) Legacy",
+	nativeName: "中文(繁體) 舊版",
+	language: "zh-CHT",
+	numberFormat: {
+		NaN: "非數字",
+		negativeInfinity: "負無窮大",
+		positiveInfinity: "正無窮大",
+		percent: {
+			pattern: ["-n%","n%"]
+		},
+		currency: {
+			symbol: "HK$"
+		}
+	},
+	calendars: {
+		standard: {
+			days: {
+				names: ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
+				namesAbbr: ["週日","週一","週二","週三","週四","週五","週六"],
+				namesShort: ["日","一","二","三","四","五","六"]
+			},
+			months: {
+				names: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""],
+				namesAbbr: ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月",""]
+			},
+			AM: ["上午","上午","上午"],
+			PM: ["下午","下午","下午"],
+			eras: [{"name":"公元","start":null,"offset":0}],
+			patterns: {
+				d: "d/M/yyyy",
+				D: "yyyy'年'M'月'd'日'",
+				t: "H:mm",
+				T: "H:mm:ss",
+				f: "yyyy'年'M'月'd'日' H:mm",
+				F: "yyyy'年'M'月'd'日' H:mm:ss",
+				M: "M'月'd'日'",
+				Y: "yyyy'年'M'月'"
+			}
+		}
+	}
+});
+
+}( this ));
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/jquery.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/jquery.js
new file mode 100644
index 0000000..2c12adb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/jquery.js
@@ -0,0 +1,9046 @@
+/*!
+ * jQuery JavaScript Library v1.6.4
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Mon Sep 12 18:54:48 2011 -0400
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Check for digits
+	rdigit = /\d/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = (context ? context.ownerDocument || context : document);
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return (context || rootjQuery).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if (selector.selector !== undefined) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.6.4",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, +i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.resolveWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).unbind( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery._Deferred();
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	// A crude way of determining if an object is a window
+	isWindow: function( obj ) {
+		return obj && typeof obj === "object" && "setInterval" in obj;
+	},
+
+	isNaN: function( obj ) {
+		return obj == null || !rdigit.test( obj ) || isNaN( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw msg;
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return (new Function( "return " + data ))();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// The extra typeof function check is to prevent crashes
+			// in Safari 2 (See: #3039)
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array ) {
+		if ( !array ) {
+			return -1;
+		}
+
+		if ( indexOf ) {
+			return indexOf.call( array, elem );
+		}
+
+		for ( var i = 0, length = array.length; i < length; i++ ) {
+			if ( array[ i ] === elem ) {
+				return i;
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, key, value, exec, fn, pass ) {
+		var length = elems.length;
+
+		// Setting many attributes
+		if ( typeof key === "object" ) {
+			for ( var k in key ) {
+				jQuery.access( elems, k, key[k], exec, fn, value );
+			}
+			return elems;
+		}
+
+		// Setting one attribute
+		if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = !pass && exec && jQuery.isFunction(value);
+
+			for ( var i = 0; i < length; i++ ) {
+				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+			}
+
+			return elems;
+		}
+
+		// Getting an attribute
+		return length ? fn( elems[0], key ) : undefined;
+	},
+
+	now: function() {
+		return (new Date()).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+var // Promise methods
+	promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
+	// Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+	// Create a simple deferred (one callbacks list)
+	_Deferred: function() {
+		var // callbacks list
+			callbacks = [],
+			// stored [ context , args ]
+			fired,
+			// to avoid firing when already doing so
+			firing,
+			// flag to know if the deferred has been cancelled
+			cancelled,
+			// the deferred itself
+			deferred  = {
+
+				// done( f1, f2, ...)
+				done: function() {
+					if ( !cancelled ) {
+						var args = arguments,
+							i,
+							length,
+							elem,
+							type,
+							_fired;
+						if ( fired ) {
+							_fired = fired;
+							fired = 0;
+						}
+						for ( i = 0, length = args.length; i < length; i++ ) {
+							elem = args[ i ];
+							type = jQuery.type( elem );
+							if ( type === "array" ) {
+								deferred.done.apply( deferred, elem );
+							} else if ( type === "function" ) {
+								callbacks.push( elem );
+							}
+						}
+						if ( _fired ) {
+							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
+						}
+					}
+					return this;
+				},
+
+				// resolve with given context and args
+				resolveWith: function( context, args ) {
+					if ( !cancelled && !fired && !firing ) {
+						// make sure args are available (#8421)
+						args = args || [];
+						firing = 1;
+						try {
+							while( callbacks[ 0 ] ) {
+								callbacks.shift().apply( context, args );
+							}
+						}
+						finally {
+							fired = [ context, args ];
+							firing = 0;
+						}
+					}
+					return this;
+				},
+
+				// resolve with this as context and given arguments
+				resolve: function() {
+					deferred.resolveWith( this, arguments );
+					return this;
+				},
+
+				// Has this deferred been resolved?
+				isResolved: function() {
+					return !!( firing || fired );
+				},
+
+				// Cancel
+				cancel: function() {
+					cancelled = 1;
+					callbacks = [];
+					return this;
+				}
+			};
+
+		return deferred;
+	},
+
+	// Full fledged deferred (two callbacks list)
+	Deferred: function( func ) {
+		var deferred = jQuery._Deferred(),
+			failDeferred = jQuery._Deferred(),
+			promise;
+		// Add errorDeferred methods, then and promise
+		jQuery.extend( deferred, {
+			then: function( doneCallbacks, failCallbacks ) {
+				deferred.done( doneCallbacks ).fail( failCallbacks );
+				return this;
+			},
+			always: function() {
+				return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
+			},
+			fail: failDeferred.done,
+			rejectWith: failDeferred.resolveWith,
+			reject: failDeferred.resolve,
+			isRejected: failDeferred.isResolved,
+			pipe: function( fnDone, fnFail ) {
+				return jQuery.Deferred(function( newDefer ) {
+					jQuery.each( {
+						done: [ fnDone, "resolve" ],
+						fail: [ fnFail, "reject" ]
+					}, function( handler, data ) {
+						var fn = data[ 0 ],
+							action = data[ 1 ],
+							returned;
+						if ( jQuery.isFunction( fn ) ) {
+							deferred[ handler ](function() {
+								returned = fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise().then( newDefer.resolve, newDefer.reject );
+								} else {
+									newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+								}
+							});
+						} else {
+							deferred[ handler ]( newDefer[ action ] );
+						}
+					});
+				}).promise();
+			},
+			// Get a promise for this deferred
+			// If obj is provided, the promise aspect is added to the object
+			promise: function( obj ) {
+				if ( obj == null ) {
+					if ( promise ) {
+						return promise;
+					}
+					promise = obj = {};
+				}
+				var i = promiseMethods.length;
+				while( i-- ) {
+					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
+				}
+				return obj;
+			}
+		});
+		// Make sure only one callback list will be used
+		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
+		// Unexpose cancel
+		delete deferred.cancel;
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = arguments,
+			i = 0,
+			length = args.length,
+			count = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					// Strange bug in FF4:
+					// Values changed onto the arguments object sometimes end up as undefined values
+					// outside the $.when method. Cloning the object into a fresh array solves the issue
+					deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+				}
+			};
+		}
+		if ( length > 1 ) {
+			for( ; i < length; i++ ) {
+				if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return deferred.promise();
+	}
+});
+
+
+
+jQuery.support = (function() {
+
+	var div = document.createElement( "div" ),
+		documentElement = document.documentElement,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		marginDiv,
+		support,
+		fragment,
+		body,
+		testElementParent,
+		testElement,
+		testElementStyle,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName( "tbody" ).length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName( "link" ).length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55$/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains it's value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.firstChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	div.innerHTML = "";
+
+	// Figure out if the W3C box model works as expected
+	div.style.width = div.style.paddingLeft = "1px";
+
+	body = document.getElementsByTagName( "body" )[ 0 ];
+	// We use our own, invisible, body unless the body is already present
+	// in which case we use a div (#9239)
+	testElement = document.createElement( body ? "div" : "body" );
+	testElementStyle = {
+		visibility: "hidden",
+		width: 0,
+		height: 0,
+		border: 0,
+		margin: 0,
+		background: "none"
+	};
+	if ( body ) {
+		jQuery.extend( testElementStyle, {
+			position: "absolute",
+			left: "-1000px",
+			top: "-1000px"
+		});
+	}
+	for ( i in testElementStyle ) {
+		testElement.style[ i ] = testElementStyle[ i ];
+	}
+	testElement.appendChild( div );
+	testElementParent = body || documentElement;
+	testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	support.boxModel = div.offsetWidth === 2;
+
+	if ( "zoom" in div.style ) {
+		// Check if natively block-level elements act like inline-block
+		// elements when setting their display to 'inline' and giving
+		// them layout
+		// (IE < 8 does this)
+		div.style.display = "inline";
+		div.style.zoom = 1;
+		support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+		// Check if elements with layout shrink-wrap their children
+		// (IE 6 does this)
+		div.style.display = "";
+		div.innerHTML = "<div style='width:4px;'></div>";
+		support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+	}
+
+	div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+	tds = div.getElementsByTagName( "td" );
+
+	// Check if table cells still have offsetWidth/Height when they are set
+	// to display:none and there are still other visible table cells in a
+	// table row; if so, offsetWidth/Height are not reliable for use when
+	// determining if an element has been hidden directly using
+	// display:none (it is still safe to use offsets if a parent element is
+	// hidden; don safety goggles and see bug #4512 for more information).
+	// (only IE 8 fails this test)
+	isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+	tds[ 0 ].style.display = "";
+	tds[ 1 ].style.display = "none";
+
+	// Check if empty table cells still have offsetWidth/Height
+	// (IE < 8 fail this test)
+	support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+	div.innerHTML = "";
+
+	// Check if div with explicit width and no margin-right incorrectly
+	// gets computed margin-right based on width of container. For more
+	// info see bug #3333
+	// Fails in WebKit before Feb 2011 nightlies
+	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+	if ( document.defaultView && document.defaultView.getComputedStyle ) {
+		marginDiv = document.createElement( "div" );
+		marginDiv.style.width = "0";
+		marginDiv.style.marginRight = "0";
+		div.appendChild( marginDiv );
+		support.reliableMarginRight =
+			( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+	}
+
+	// Remove the body element we added
+	testElement.innerHTML = "";
+	testElementParent.removeChild( testElement );
+
+	// Technique from Juriy Zaytsev
+	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		} ) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Null connected elements to avoid leaks in IE
+	testElement = fragment = select = opt = body = marginDiv = div = input = null;
+
+	return support;
+})();
+
+// Keep track of boxModel
+jQuery.boxModel = jQuery.support.boxModel;
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ jQuery.expando ] = id = ++jQuery.uuid;
+			} else {
+				id = jQuery.expando;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
+			} else {
+				cache[ id ] = jQuery.extend(cache[ id ], name);
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// Internal jQuery data is stored in a separate object inside the object's data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data
+		if ( pvt ) {
+			if ( !thisCache[ internalKey ] ) {
+				thisCache[ internalKey ] = {};
+			}
+
+			thisCache = thisCache[ internalKey ];
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
+		// not attempt to inspect the internal events object using jQuery.data, as this
+		// internal data object is undocumented and subject to change.
+		if ( name === "events" && !thisCache[name] ) {
+			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
+
+			if ( thisCache ) {
+
+				// Support interoperable removal of hyphenated or camelcased keys
+				if ( !thisCache[ name ] ) {
+					name = jQuery.camelCase( name );
+				}
+
+				delete thisCache[ name ];
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !isEmptyDataObject(thisCache) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( pvt ) {
+			delete cache[ id ][ internalKey ];
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		var internalCache = cache[ id ][ internalKey ];
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the entire user cache at once because it's faster than
+		// iterating through each key, but we need to continue to persist internal
+		// data if it existed
+		if ( internalCache ) {
+			cache[ id ] = {};
+			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
+			// metadata on plain JS objects when the object is serialized using
+			// JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+
+			cache[ id ][ internalKey ] = internalCache;
+
+		// Otherwise, we need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		} else if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ jQuery.expando ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( jQuery.expando );
+			} else {
+				elem[ jQuery.expando ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var data = null;
+
+		if ( typeof key === "undefined" ) {
+			if ( this.length ) {
+				data = jQuery.data( this[0] );
+
+				if ( this[0].nodeType === 1 ) {
+			    var attr = this[0].attributes, name;
+					for ( var i = 0, l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( this[0], name, data[ name ] );
+						}
+					}
+				}
+			}
+
+			return data;
+
+		} else if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		var parts = key.split(".");
+		parts[1] = parts[1] ? "." + parts[1] : "";
+
+		if ( value === undefined ) {
+			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+			// Try to fetch any internally stored data first
+			if ( data === undefined && this.length ) {
+				data = jQuery.data( this[0], key );
+				data = dataAttr( this[0], key, data );
+			}
+
+			return data === undefined && parts[1] ?
+				this.data( parts[0] ) :
+				data;
+
+		} else {
+			return this.each(function() {
+				var $this = jQuery( this ),
+					args = [ parts[0], value ];
+
+				$this.triggerHandler( "setData" + parts[1] + "!", args );
+				jQuery.data( this, key, value );
+				$this.triggerHandler( "changeData" + parts[1] + "!", args );
+			});
+		}
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				!jQuery.isNaN( data ) ? parseFloat( data ) :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
+// property to be considered empty objects; this property always exists in
+// order to make sure JSON.stringify does not expose internal metadata
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery.data( elem, deferDataKey, undefined, true );
+	if ( defer &&
+		( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
+		( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
+				!jQuery.data( elem, markDataKey, undefined, true ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.resolve();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = (type || "fx") + "mark";
+			jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
+			if ( count ) {
+				jQuery.data( elem, key, count, true );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		if ( elem ) {
+			type = (type || "fx") + "queue";
+			var q = jQuery.data( elem, type, undefined, true );
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery.data( elem, type, jQuery.makeArray(data), true );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			defer;
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift("inprogress");
+			}
+
+			fn.call(elem, function() {
+				jQuery.dequeue(elem, type);
+			});
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+		}
+
+		if ( data === undefined ) {
+			return jQuery.queue( this[0], type );
+		}
+		return this.each(function() {
+			var queue = jQuery.queue( this, type, data );
+
+			if ( type === "fx" && queue[0] !== "inprogress" ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function() {
+			var elem = this;
+			setTimeout(function() {
+				jQuery.dequeue( elem, type );
+			}, time );
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
+				count++;
+				tmp.done( resolve );
+			}
+		}
+		resolve();
+		return defer.promise();
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	nodeHook, boolHook;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.attr );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+	
+	prop: function( name, value ) {
+		return jQuery.access( this, name, value, true, jQuery.prop );
+	},
+	
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = (value || "").split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ";
+		for ( var i = 0, l = this.length; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret,
+			elem = this[0];
+		
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ? 
+					// handle most common string cases
+					ret.replace(rreturn, "") : 
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return undefined;
+		}
+
+		var isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+					var option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+	
+	attrFix: {
+		// Always normalize to ensure hook usage
+		tabindex: "tabIndex"
+	},
+	
+	attr: function( elem, name, value, pass ) {
+		var nType = elem.nodeType;
+		
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return undefined;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( !("getAttribute" in elem) ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		var ret, hooks,
+			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// Normalize the name if needed
+		if ( notxml ) {
+			name = jQuery.attrFix[ name ] || name;
+
+			hooks = jQuery.attrHooks[ name ];
+
+			if ( !hooks ) {
+				// Use boolHook for boolean attributes
+				if ( rboolean.test( name ) ) {
+					hooks = boolHook;
+
+				// Use nodeHook if available( IE6/7 )
+				} else if ( nodeHook ) {
+					hooks = nodeHook;
+				}
+			}
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return undefined;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, name ) {
+		var propName;
+		if ( elem.nodeType === 1 ) {
+			name = jQuery.attrFix[ name ] || name;
+
+			jQuery.attr( elem, name, "" );
+			elem.removeAttribute( name );
+
+			// Set corresponding property to false for boolean attributes
+			if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
+				elem[ propName ] = false;
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+	
+	prop: function( elem, name, value ) {
+		var nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return undefined;
+		}
+
+		var ret, hooks,
+			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return (elem[ name ] = value);
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+	
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabindex propHook to attrHooks for back-compat
+jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode;
+		return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !jQuery.support.getSetAttribute ) {
+	
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			// Return undefined if nodeValue is empty string
+			return ret && ret.nodeValue !== "" ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return (ret.nodeValue = value + "");
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return (elem.style.cssText = "" + value);
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
+			}
+		}
+	});
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+	rformElems = /^(?:textarea|input|select)$/i,
+	rperiod = /\./g,
+	rspaces = / /g,
+	rescape = /[^\w\s.|`]/g,
+	fcleanup = function( nm ) {
+		return nm.replace(rescape, "\\$&");
+	};
+
+/*
+ * A number of helper functions used for managing events.
+ * Many of the ideas behind this code originated from
+ * Dean Edwards' addEvent library.
+ */
+jQuery.event = {
+
+	// Bind an event to an element
+	// Original by Dean Edwards
+	add: function( elem, types, handler, data ) {
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		} else if ( !handler ) {
+			// Fixes bug #7229. Fix recommended by jdalton
+			return;
+		}
+
+		var handleObjIn, handleObj;
+
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+		}
+
+		// Make sure that the function being executed has a unique ID
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure
+		var elemData = jQuery._data( elem );
+
+		// If no elemData is found then we must be trying to bind to one of the
+		// banned noData elements
+		if ( !elemData ) {
+			return;
+		}
+
+		var events = elemData.events,
+			eventHandle = elemData.handle;
+
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+		}
+
+		// Add elem as a property of the handle function
+		// This is to prevent a memory leak with non-native events in IE.
+		eventHandle.elem = elem;
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		var type, i = 0, namespaces;
+
+		while ( (type = types[ i++ ]) ) {
+			handleObj = handleObjIn ?
+				jQuery.extend({}, handleObjIn) :
+				{ handler: handler, data: data };
+
+			// Namespaced event handlers
+			if ( type.indexOf(".") > -1 ) {
+				namespaces = type.split(".");
+				type = namespaces.shift();
+				handleObj.namespace = namespaces.slice(0).sort().join(".");
+
+			} else {
+				namespaces = [];
+				handleObj.namespace = "";
+			}
+
+			handleObj.type = type;
+			if ( !handleObj.guid ) {
+				handleObj.guid = handler.guid;
+			}
+
+			// Get the current list of functions bound to this event
+			var handlers = events[ type ],
+				special = jQuery.event.special[ type ] || {};
+
+			// Init the event handler queue
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+
+				// Check for a special event handler
+				// Only use addEventListener/attachEvent if the special
+				// events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add the function to the element's handler list
+			handlers.push( handleObj );
+
+			// Keep track of which events have been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, pos ) {
+		// don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		if ( handler === false ) {
+			handler = returnFalse;
+		}
+
+		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			events = elemData && elemData.events;
+
+		if ( !elemData || !events ) {
+			return;
+		}
+
+		// types is actually an event object here
+		if ( types && types.type ) {
+			handler = types.handler;
+			types = types.type;
+		}
+
+		// Unbind all events for the element
+		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
+			types = types || "";
+
+			for ( type in events ) {
+				jQuery.event.remove( elem, type + types );
+			}
+
+			return;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).unbind("mouseover mouseout", fn);
+		types = types.split(" ");
+
+		while ( (type = types[ i++ ]) ) {
+			origType = type;
+			handleObj = null;
+			all = type.indexOf(".") < 0;
+			namespaces = [];
+
+			if ( !all ) {
+				// Namespaced event handlers
+				namespaces = type.split(".");
+				type = namespaces.shift();
+
+				namespace = new RegExp("(^|\\.)" +
+					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
+			}
+
+			eventType = events[ type ];
+
+			if ( !eventType ) {
+				continue;
+			}
+
+			if ( !handler ) {
+				for ( j = 0; j < eventType.length; j++ ) {
+					handleObj = eventType[ j ];
+
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						jQuery.event.remove( elem, origType, handleObj.handler, j );
+						eventType.splice( j--, 1 );
+					}
+				}
+
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+
+			for ( j = pos || 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( handler.guid === handleObj.guid ) {
+					// remove the given handler for the given type
+					if ( all || namespace.test( handleObj.namespace ) ) {
+						if ( pos == null ) {
+							eventType.splice( j--, 1 );
+						}
+
+						if ( special.remove ) {
+							special.remove.call( elem, handleObj );
+						}
+					}
+
+					if ( pos != null ) {
+						break;
+					}
+				}
+			}
+
+			// remove generic event handler if no more handlers exist
+			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				ret = null;
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			var handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			delete elemData.events;
+			delete elemData.handle;
+
+			if ( jQuery.isEmptyObject( elemData ) ) {
+				jQuery.removeData( elem, undefined, true );
+			}
+		}
+	},
+	
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			exclusive;
+
+		if ( type.indexOf("!") >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf(".") >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join(".");
+		event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
+		
+		// triggerHandler() and global events don't bubble or run the default action
+		if ( onlyHandlers || !elem ) {
+			event.preventDefault();
+			event.stopPropagation();
+		}
+
+		// Handle a global trigger
+		if ( !elem ) {
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			jQuery.each( jQuery.cache, function() {
+				// internalKey variable is just used to make it easier to find
+				// and potentially change this stuff later; currently it just
+				// points to jQuery.expando
+				var internalKey = jQuery.expando,
+					internalCache = this[ internalKey ];
+				if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
+					jQuery.event.trigger( event, data, internalCache.handle.elem );
+				}
+			});
+			return;
+		}
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		event.target = elem;
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		var cur = elem,
+			// IE doesn't like method names with a colon (#3533, #8272)
+			ontype = type.indexOf(":") < 0 ? "on" + type : "";
+
+		// Fire event on the current element, then bubble up the DOM tree
+		do {
+			var handle = jQuery._data( cur, "handle" );
+
+			event.currentTarget = cur;
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Trigger an inline bound script
+			if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
+				event.result = false;
+				event.preventDefault();
+			}
+
+			// Bubble up to document, then to window
+			cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
+		} while ( cur && !event.isPropagationStopped() );
+
+		// If nobody prevented the default action, do it now
+		if ( !event.isDefaultPrevented() ) {
+			var old,
+				special = jQuery.event.special[ type ] || {};
+
+			if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction)() check here because IE6/7 fails that test.
+				// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
+				try {
+					if ( ontype && elem[ type ] ) {
+						// Don't re-trigger an onFOO event when we call its FOO() method
+						old = elem[ ontype ];
+
+						if ( old ) {
+							elem[ ontype ] = null;
+						}
+
+						jQuery.event.triggered = type;
+						elem[ type ]();
+					}
+				} catch ( ieError ) {}
+
+				if ( old ) {
+					elem[ ontype ] = old;
+				}
+
+				jQuery.event.triggered = undefined;
+			}
+		}
+		
+		return event.result;
+	},
+
+	handle: function( event ) {
+		event = jQuery.event.fix( event || window.event );
+		// Snapshot the handlers list since a called handler may add/remove events.
+		var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
+			run_all = !event.exclusive && !event.namespace,
+			args = Array.prototype.slice.call( arguments, 0 );
+
+		// Use the fix-ed Event rather than the (read-only) native event
+		args[0] = event;
+		event.currentTarget = this;
+
+		for ( var j = 0, l = handlers.length; j < l; j++ ) {
+			var handleObj = handlers[ j ];
+
+			// Triggered event must 1) be non-exclusive and have no namespace, or
+			// 2) have namespace(s) a subset or equal to those in the bound event.
+			if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
+				// Pass in a reference to the handler function itself
+				// So that we can later remove it
+				event.handler = handleObj.handler;
+				event.data = handleObj.data;
+				event.handleObj = handleObj;
+
+				var ret = handleObj.handler.apply( this, args );
+
+				if ( ret !== undefined ) {
+					event.result = ret;
+					if ( ret === false ) {
+						event.preventDefault();
+						event.stopPropagation();
+					}
+				}
+
+				if ( event.isImmediatePropagationStopped() ) {
+					break;
+				}
+			}
+		}
+		return event.result;
+	},
+
+	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// store a copy of the original event object
+		// and "clone" to set read-only properties
+		var originalEvent = event;
+		event = jQuery.Event( originalEvent );
+
+		for ( var i = this.props.length, prop; i; ) {
+			prop = this.props[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary
+		if ( !event.target ) {
+			// Fixes #1925 where srcElement might not be defined either
+			event.target = event.srcElement || document;
+		}
+
+		// check if target is a textnode (safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Add relatedTarget, if necessary
+		if ( !event.relatedTarget && event.fromElement ) {
+			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
+		}
+
+		// Calculate pageX/Y if missing and clientX/Y available
+		if ( event.pageX == null && event.clientX != null ) {
+			var eventDocument = event.target.ownerDocument || document,
+				doc = eventDocument.documentElement,
+				body = eventDocument.body;
+
+			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
+			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
+		}
+
+		// Add which for key events
+		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
+			event.which = event.charCode != null ? event.charCode : event.keyCode;
+		}
+
+		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
+		if ( !event.metaKey && event.ctrlKey ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		// Add which for click: 1 === left; 2 === middle; 3 === right
+		// Note: button is not normalized, so don't use it
+		if ( !event.which && event.button !== undefined ) {
+			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
+		}
+
+		return event;
+	},
+
+	// Deprecated, use jQuery.guid instead
+	guid: 1E8,
+
+	// Deprecated, use jQuery.proxy instead
+	proxy: jQuery.proxy,
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady,
+			teardown: jQuery.noop
+		},
+
+		live: {
+			add: function( handleObj ) {
+				jQuery.event.add( this,
+					liveConvert( handleObj.origType, handleObj.selector ),
+					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
+			},
+
+			remove: function( handleObj ) {
+				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
+			}
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !this.preventDefault ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// timeStamp is buggy for some events on Firefox(#3843)
+	// So we won't rely on the native value
+	this.timeStamp = jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Checks if an event happened on an element within another element
+// Used in jQuery.event.special.mouseenter and mouseleave handlers
+var withinElement = function( event ) {
+
+	// Check if mouse(over|out) are still within the same parent element
+	var related = event.relatedTarget,
+		inside = false,
+		eventType = event.type;
+
+	event.type = event.data;
+
+	if ( related !== this ) {
+
+		if ( related ) {
+			inside = jQuery.contains( this, related );
+		}
+
+		if ( !inside ) {
+
+			jQuery.event.handle.apply( this, arguments );
+
+			event.type = eventType;
+		}
+	}
+},
+
+// In case of event delegation, we only need to rename the event.type,
+// liveHandler will take care of the rest.
+delegate = function( event ) {
+	event.type = event.data;
+	jQuery.event.handle.apply( this, arguments );
+};
+
+// Create mouseenter and mouseleave events
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		setup: function( data ) {
+			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+		},
+		teardown: function( data ) {
+			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+		}
+	};
+});
+
+// submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function( data, namespaces ) {
+			if ( !jQuery.nodeName( this, "form" ) ) {
+				jQuery.event.add(this, "click.specialSubmit", function( e ) {
+					// Avoid triggering error on non-existent type attribute in IE VML (#7071)
+					var elem = e.target,
+						type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+
+					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
+					var elem = e.target,
+						type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
+
+					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+						trigger( "submit", this, arguments );
+					}
+				});
+
+			} else {
+				return false;
+			}
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialSubmit" );
+		}
+	};
+
+}
+
+// change delegation, happens here so we have bind.
+if ( !jQuery.support.changeBubbles ) {
+
+	var changeFilters,
+
+	getVal = function( elem ) {
+		var type = jQuery.nodeName( elem, "input" ) ? elem.type : "",
+			val = elem.value;
+
+		if ( type === "radio" || type === "checkbox" ) {
+			val = elem.checked;
+
+		} else if ( type === "select-multiple" ) {
+			val = elem.selectedIndex > -1 ?
+				jQuery.map( elem.options, function( elem ) {
+					return elem.selected;
+				}).join("-") :
+				"";
+
+		} else if ( jQuery.nodeName( elem, "select" ) ) {
+			val = elem.selectedIndex;
+		}
+
+		return val;
+	},
+
+	testChange = function testChange( e ) {
+		var elem = e.target, data, val;
+
+		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
+			return;
+		}
+
+		data = jQuery._data( elem, "_change_data" );
+		val = getVal(elem);
+
+		// the current data will be also retrieved by beforeactivate
+		if ( e.type !== "focusout" || elem.type !== "radio" ) {
+			jQuery._data( elem, "_change_data", val );
+		}
+
+		if ( data === undefined || val === data ) {
+			return;
+		}
+
+		if ( data != null || val ) {
+			e.type = "change";
+			e.liveFired = undefined;
+			jQuery.event.trigger( e, arguments[1], elem );
+		}
+	};
+
+	jQuery.event.special.change = {
+		filters: {
+			focusout: testChange,
+
+			beforedeactivate: testChange,
+
+			click: function( e ) {
+				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+				if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Change has to be called before submit
+			// Keydown will be called before keypress, which is used in submit-event delegation
+			keydown: function( e ) {
+				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
+
+				if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
+					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
+					type === "select-multiple" ) {
+					testChange.call( this, e );
+				}
+			},
+
+			// Beforeactivate happens also before the previous element is blurred
+			// with this event you can't trigger a change event, but you can store
+			// information
+			beforeactivate: function( e ) {
+				var elem = e.target;
+				jQuery._data( elem, "_change_data", getVal(elem) );
+			}
+		},
+
+		setup: function( data, namespaces ) {
+			if ( this.type === "file" ) {
+				return false;
+			}
+
+			for ( var type in changeFilters ) {
+				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
+			}
+
+			return rformElems.test( this.nodeName );
+		},
+
+		teardown: function( namespaces ) {
+			jQuery.event.remove( this, ".specialChange" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+
+	changeFilters = jQuery.event.special.change.filters;
+
+	// Handle when the input is .focus()'d
+	changeFilters.focus = changeFilters.beforeactivate;
+}
+
+function trigger( type, elem, args ) {
+	// Piggyback on a donor event to simulate a different one.
+	// Fake originalEvent to avoid donor's stopPropagation, but if the
+	// simulated event prevents default then we do the same on the donor.
+	// Don't pass args or remember liveFired; they apply to the donor event.
+	var event = jQuery.extend( {}, args[ 0 ] );
+	event.type = type;
+	event.originalEvent = {};
+	event.liveFired = undefined;
+	jQuery.event.handle.call( elem, event );
+	if ( event.isDefaultPrevented() ) {
+		args[ 0 ].preventDefault();
+	}
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0;
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+
+		function handler( donor ) {
+			// Donor event is always a native one; fix it and switch its type.
+			// Let focusin/out handler cancel the donor focus/blur event.
+			var e = jQuery.event.fix( donor );
+			e.type = fix;
+			e.originalEvent = {};
+			jQuery.event.trigger( e, null, e.target );
+			if ( e.isDefaultPrevented() ) {
+				donor.preventDefault();
+			}
+		}
+	});
+}
+
+jQuery.each(["bind", "one"], function( i, name ) {
+	jQuery.fn[ name ] = function( type, data, fn ) {
+		var handler;
+
+		// Handle object literals
+		if ( typeof type === "object" ) {
+			for ( var key in type ) {
+				this[ name ](key, data, type[key], fn);
+			}
+			return this;
+		}
+
+		if ( arguments.length === 2 || data === false ) {
+			fn = data;
+			data = undefined;
+		}
+
+		if ( name === "one" ) {
+			handler = function( event ) {
+				jQuery( this ).unbind( event, handler );
+				return fn.apply( this, arguments );
+			};
+			handler.guid = fn.guid || jQuery.guid++;
+		} else {
+			handler = fn;
+		}
+
+		if ( type === "unload" && name !== "one" ) {
+			this.one( type, data, fn );
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.add( this[i], type, handler, data );
+			}
+		}
+
+		return this;
+	};
+});
+
+jQuery.fn.extend({
+	unbind: function( type, fn ) {
+		// Handle object literals
+		if ( typeof type === "object" && !type.preventDefault ) {
+			for ( var key in type ) {
+				this.unbind(key, type[key]);
+			}
+
+		} else {
+			for ( var i = 0, l = this.length; i < l; i++ ) {
+				jQuery.event.remove( this[i], type, fn );
+			}
+		}
+
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.live( types, data, fn, selector );
+	},
+
+	undelegate: function( selector, types, fn ) {
+		if ( arguments.length === 0 ) {
+			return this.unbind( "live" );
+
+		} else {
+			return this.die( types, null, fn, selector );
+		}
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+var liveMap = {
+	focus: "focusin",
+	blur: "focusout",
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+};
+
+jQuery.each(["live", "die"], function( i, name ) {
+	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
+		var type, i = 0, match, namespaces, preType,
+			selector = origSelector || this.selector,
+			context = origSelector ? this : jQuery( this.context );
+
+		if ( typeof types === "object" && !types.preventDefault ) {
+			for ( var key in types ) {
+				context[ name ]( key, data, types[key], selector );
+			}
+
+			return this;
+		}
+
+		if ( name === "die" && !types &&
+					origSelector && origSelector.charAt(0) === "." ) {
+
+			context.unbind( origSelector );
+
+			return this;
+		}
+
+		if ( data === false || jQuery.isFunction( data ) ) {
+			fn = data || returnFalse;
+			data = undefined;
+		}
+
+		types = (types || "").split(" ");
+
+		while ( (type = types[ i++ ]) != null ) {
+			match = rnamespaces.exec( type );
+			namespaces = "";
+
+			if ( match )  {
+				namespaces = match[0];
+				type = type.replace( rnamespaces, "" );
+			}
+
+			if ( type === "hover" ) {
+				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
+				continue;
+			}
+
+			preType = type;
+
+			if ( liveMap[ type ] ) {
+				types.push( liveMap[ type ] + namespaces );
+				type = type + namespaces;
+
+			} else {
+				type = (liveMap[ type ] || type) + namespaces;
+			}
+
+			if ( name === "live" ) {
+				// bind live handler
+				for ( var j = 0, l = context.length; j < l; j++ ) {
+					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
+						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
+				}
+
+			} else {
+				// unbind live handler
+				context.unbind( "live." + liveConvert( type, selector ), fn );
+			}
+		}
+
+		return this;
+	};
+});
+
+function liveHandler( event ) {
+	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+		elems = [],
+		selectors = [],
+		events = jQuery._data( this, "events" );
+
+	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
+	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
+		return;
+	}
+
+	if ( event.namespace ) {
+		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
+	}
+
+	event.liveFired = this;
+
+	var live = events.live.slice(0);
+
+	for ( j = 0; j < live.length; j++ ) {
+		handleObj = live[j];
+
+		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
+			selectors.push( handleObj.selector );
+
+		} else {
+			live.splice( j--, 1 );
+		}
+	}
+
+	match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+	for ( i = 0, l = match.length; i < l; i++ ) {
+		close = match[i];
+
+		for ( j = 0; j < live.length; j++ ) {
+			handleObj = live[j];
+
+			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
+				elem = close.elem;
+				related = null;
+
+				// Those two events require additional checking
+				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
+					event.type = handleObj.preType;
+					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
+
+					// Make sure not to accidentally match a child element with the same selector
+					if ( related && jQuery.contains( elem, related ) ) {
+						related = elem;
+					}
+				}
+
+				if ( !related || related !== elem ) {
+					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
+				}
+			}
+		}
+	}
+
+	for ( i = 0, l = elems.length; i < l; i++ ) {
+		match = elems[i];
+
+		if ( maxLevel && match.level > maxLevel ) {
+			break;
+		}
+
+		event.currentTarget = match.elem;
+		event.data = match.handleObj.data;
+		event.handleObj = match.handleObj;
+
+		ret = match.handleObj.origHandler.apply( match.elem, arguments );
+
+		if ( ret === false || event.isPropagationStopped() ) {
+			maxLevel = match.level;
+
+			if ( ret === false ) {
+				stop = false;
+			}
+			if ( event.isImmediatePropagationStopped() ) {
+				break;
+			}
+		}
+	}
+
+	return stop;
+}
+
+function liveConvert( type, selector ) {
+	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
+}
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.bind( name, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+	
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+	
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+		
+			parts.push( m[1] );
+		
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+				
+				set = posProcess( selector, set );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
+		var match,
+			type = Expr.order[i];
+		
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			var left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( var type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				var found, item,
+					filter = Expr.filter[ type ],
+					left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							var pass = not ^ !!found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw "Syntax error, unrecognized expression: " + msg;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+			
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+			
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+	
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+		
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+			
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					if ( type === "first" ) { 
+						return true; 
+					}
+
+					node = elem;
+
+				case "last":
+					while ( (node = node.nextSibling) )	 {
+						if ( node.nodeType === 1 ) { 
+							return false; 
+						}
+					}
+
+					return true;
+
+				case "nth":
+					var first = match[2],
+						last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+					
+					var doneName = match[0],
+						parent = elem.parentNode;
+	
+					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
+						var count = 0;
+						
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						} 
+
+						parent.sizcache = doneName;
+					}
+					
+					var diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
+		},
+		
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+	
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Utility function for retreiving the text value of an array of DOM nodes
+Sizzle.getText = function( elems ) {
+	var ret = "", elem;
+
+	for ( var i = 0; elems[i]; i++ ) {
+		elem = elems[i];
+
+		// Get the text from text nodes and CDATA nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
+			ret += elem.nodeValue;
+
+		// Traverse everything else, except comment nodes
+		} else if ( elem.nodeType !== 8 ) {
+			ret += Sizzle.getText( elem.childNodes );
+		}
+	}
+
+	return ret;
+};
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+	
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+				
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+					
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+				
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+						
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+							
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+					
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+		
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+	
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try { 
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+	
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem.sizcache = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+			
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem.sizcache === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem.sizcache = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833) 
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.POS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && ( typeof selector === "string" ?
+			jQuery.filter( selector, this ).length > 0 :
+			this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+		
+		// Array
+		if ( jQuery.isArray( selectors ) ) {
+			var match, selector,
+				matches = {},
+				level = 1;
+
+			if ( cur && selectors.length ) {
+				for ( i = 0, l = selectors.length; i < l; i++ ) {
+					selector = selectors[i];
+
+					if ( !matches[ selector ] ) {
+						matches[ selector ] = POS.test( selector ) ?
+							jQuery( selector, context || this.context ) :
+							selector;
+					}
+				}
+
+				while ( cur && cur.ownerDocument && cur !== context ) {
+					for ( selector in matches ) {
+						match = matches[ selector ];
+
+						if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
+							ret.push({ selector: selector, elem: cur, level: level });
+						}
+					}
+
+					cur = cur.parentNode;
+					level++;
+				}
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( elem.parentNode.firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until ),
+			// The variable 'args' was introduced in
+			// https://github.com/jquery/jquery/commit/52a0238
+			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+			// http://code.google.com/p/v8/issues/detail?id=1050
+			args = slice.call(arguments);
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, args.join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return (elem === qualifier) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
+	});
+}
+
+
+
+
+var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	};
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( text ) {
+		if ( jQuery.isFunction(text) ) {
+			return this.each(function(i) {
+				var self = jQuery( this );
+
+				self.text( text.call(this, i, self.text()) );
+			});
+		}
+
+		if ( typeof text !== "object" && text !== undefined ) {
+			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+		}
+
+		return jQuery.text( this );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		return this.each(function() {
+			jQuery( this ).wrapAll( html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery(arguments[0]);
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery(arguments[0]).toArray() );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		if ( value === undefined ) {
+			return this[0] && this[0].nodeType === 1 ?
+				this[0].innerHTML.replace(rinlinejQuery, "") :
+				null;
+
+		// See if we can take a shortcut and just use innerHTML
+		} else if ( typeof value === "string" && !rnocache.test( value ) &&
+			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+			value = value.replace(rxhtmlTag, "<$1></$2>");
+
+			try {
+				for ( var i = 0, l = this.length; i < l; i++ ) {
+					// Remove element nodes and prevent memory leaks
+					if ( this[i].nodeType === 1 ) {
+						jQuery.cleanData( this[i].getElementsByTagName("*") );
+						this[i].innerHTML = value;
+					}
+				}
+
+			// If using innerHTML throws an exception, use the fallback method
+			} catch(e) {
+				this.empty().append( value );
+			}
+
+		} else if ( jQuery.isFunction( value ) ) {
+			this.each(function(i){
+				var self = jQuery( this );
+
+				self.html( value.call(this, i, self.html()) );
+			});
+
+		} else {
+			this.empty().append( value );
+		}
+
+		return this;
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || (l > 1 && i < lastIndex) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, evalScript );
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var internalKey = jQuery.expando,
+		oldData = jQuery.data( src ),
+		curData = jQuery.data( dest, oldData );
+
+	// Switch to use the internal data object, if it exists, for the next
+	// stage of data copying
+	if ( (oldData = oldData[ internalKey ]) ) {
+		var events = oldData.events;
+				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
+
+		if ( events ) {
+			delete curData.handle;
+			curData.events = {};
+
+			for ( var type in events ) {
+				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
+					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+				}
+			}
+		}
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc;
+
+  // nodes may contain either an explicit document object,
+  // a jQuery collection or context object.
+  // If nodes[0] contains a valid object to assign to doc
+  if ( nodes && nodes[0] ) {
+    doc = nodes[0].ownerDocument || nodes[0];
+  }
+
+  // Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
+		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ args[0] ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = (i > 0 ? this.clone(true) : this).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( "getElementsByTagName" in elem ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( "querySelectorAll" in elem ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	if ( jQuery.nodeName( elem, "input" ) ) {
+		fixDefaultChecked( elem );
+	} else if ( "getElementsByTagName" in elem ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var clone = elem.cloneNode(true),
+				srcElements,
+				destElements,
+				i;
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName
+			// instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType;
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		var ret = [], j;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div");
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+				} else {
+					if ( ret[i].nodeType === 1 ) {
+						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( ret[i] );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ] && cache[ id ][ internalKey ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+function evalScript( i, elem ) {
+	if ( elem.src ) {
+		jQuery.ajax({
+			url: elem.src,
+			async: false,
+			dataType: "script"
+		});
+	} else {
+		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+	}
+
+	if ( elem.parentNode ) {
+		elem.parentNode.removeChild( elem );
+	}
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnumpx = /^-?\d+(?:px)?$/i,
+	rnum = /^-?\d/,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssWidth = [ "Left", "Right" ],
+	cssHeight = [ "Top", "Bottom" ],
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	// Setting 'undefined' is a no-op
+	if ( arguments.length === 2 && value === undefined ) {
+		return this;
+	}
+
+	return jQuery.access( this, name, value, true, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	});
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity", "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( var name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+	}
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			var val;
+
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWH( elem, name, extra );
+				} else {
+					jQuery.swap( elem, cssShow, function() {
+						val = getWH( elem, name, extra );
+					});
+				}
+
+				return val;
+			}
+		},
+
+		set: function( elem, value ) {
+			if ( rnumpx.test( value ) ) {
+				// ignore negative width and height values #1599
+				value = parseFloat( value );
+
+				if ( value >= 0 ) {
+					return value + "px";
+				}
+
+			} else {
+				return value;
+			}
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				var ret;
+				jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						ret = curCSS( elem, "margin-right", "marginRight" );
+					} else {
+						ret = elem.style.marginRight;
+					}
+				});
+				return ret;
+			}
+		};
+	}
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+			return undefined;
+		}
+
+		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
+			style = elem.style;
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+			// Remember the original values
+			left = style.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : (ret || 0);
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		which = name === "width" ? cssWidth : cssHeight;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			jQuery.each( which, function() {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+				}
+			});
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ] || 0;
+	}
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		jQuery.each( which, function() {
+			val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+			}
+		});
+	}
+
+	return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+	
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for(; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for(; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.bind( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery._Deferred(),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.done;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefiler, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					jQuery.error( e );
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && obj != null && typeof obj === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for( key in s.converters ) {
+				if( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+		( typeof s.data === "string" );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+									responses.text = xhr.responseText;
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+						jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[i];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data(elem, "olddisplay") || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				if ( this[i].style ) {
+					var display = jQuery.css( this[i], "display" );
+
+					if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
+						jQuery._data( this[i], "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed(speed, easing, callback);
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		return this[ optall.queue === false ? "each" : "queue" ](function() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p,
+				display, e,
+				parts, start, end, unit;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			for ( p in prop ) {
+
+				// property name normalization
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				val = prop[ name ];
+
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height
+					// animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+						if ( !jQuery.support.inlineBlockNeedsLayout ) {
+							this.style.display = "inline-block";
+
+						} else {
+							display = defaultDisplay( this.nodeName );
+
+							// inline-level elements accept inline-block;
+							// block-level elements need to be inline with layout
+							if ( display === "inline" ) {
+								this.style.display = "inline-block";
+
+							} else {
+								this.style.display = "inline";
+								this.style.zoom = 1;
+							}
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test(val) ) {
+					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ((end || 1) / e.cur()) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		});
+	},
+
+	stop: function( clearQueue, gotoEnd ) {
+		if ( clearQueue ) {
+			this.queue([]);
+		}
+
+		this.each(function() {
+			var timers = jQuery.timers,
+				i = timers.length;
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+			while ( i-- ) {
+				if ( timers[i].elem === this ) {
+					if (gotoEnd) {
+						// force the next step to be the last
+						timers[i](true);
+					}
+
+					timers.splice(i, 1);
+				}
+			}
+		});
+
+		// start the next in the queue if the last step wasn't forced
+		if ( !gotoEnd ) {
+			this.dequeue();
+		}
+
+		return this;
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show", 1),
+	slideUp: genFx("hide", 1),
+	slideToggle: genFx("toggle", 1),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
+
+		// Queueing
+		opt.old = opt.complete;
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue !== false ) {
+				jQuery.dequeue( this );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p, n, firstNum, diff ) {
+			return firstNum + diff * p;
+		},
+		swing: function( p, n, firstNum, diff ) {
+			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.start = from;
+		this.end = to;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+		this.now = this.start;
+		this.pos = this.state = 0;
+
+		function t( gotoEnd ) {
+			return self.step(gotoEnd);
+		}
+
+		t.elem = this.elem;
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any
+		// flash of content
+		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom(this.cur(), 0);
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options,
+			i, n;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( i in options.animatedProperties ) {
+				if ( options.animatedProperties[i] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function (index, value) {
+						elem.style[ "overflow" + value ] = options.overflow[index];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery(elem).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( var p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[p] );
+					}
+				}
+
+				// Execute the complete function
+				options.complete.call( elem );
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ((this.end - this.start) * this.pos);
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
+			if ( !timers[i]() ) {
+				timers.splice(i--, 1);
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0], box;
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		var doc = elem.ownerDocument,
+			docElem = doc.documentElement;
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow(doc),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	jQuery.fn.offset = function( options ) {
+		var elem = this[0];
+
+		if ( options ) {
+			return this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+		}
+
+		if ( !elem || !elem.ownerDocument ) {
+			return null;
+		}
+
+		if ( elem === elem.ownerDocument.body ) {
+			return jQuery.offset.bodyOffset( elem );
+		}
+
+		jQuery.offset.initialize();
+
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			doc = elem.ownerDocument,
+			docElem = doc.documentElement,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.offset = {
+	initialize: function() {
+		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
+			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+
+		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
+
+		container.innerHTML = html;
+		body.insertBefore( container, body.firstChild );
+		innerDiv = container.firstChild;
+		checkDiv = innerDiv.firstChild;
+		td = innerDiv.nextSibling.firstChild.firstChild;
+
+		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
+		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
+
+		checkDiv.style.position = "fixed";
+		checkDiv.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
+		checkDiv.style.position = checkDiv.style.top = "";
+
+		innerDiv.style.overflow = "hidden";
+		innerDiv.style.position = "relative";
+
+		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
+
+		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
+
+		body.removeChild( container );
+		jQuery.offset.initialize = jQuery.noop;
+	},
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		jQuery.offset.initialize();
+
+		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if (options.top != null) {
+			props.top = (options.top - curOffset.top) + curTop;
+		}
+		if (options.left != null) {
+			props.left = (options.left - curOffset.left) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+	var method = "scroll" + name;
+
+	jQuery.fn[ method ] = function( val ) {
+		var elem, win;
+
+		if ( val === undefined ) {
+			elem = this[ 0 ];
+
+			if ( !elem ) {
+				return null;
+			}
+
+			win = getWindow( elem );
+
+			// Return the scroll offset
+			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+				jQuery.support.boxModel && win.document.documentElement[ method ] ||
+					win.document.body[ method ] :
+				elem[ method ];
+		}
+
+		// Set the scroll offset
+		return this.each(function() {
+			win = getWindow( this );
+
+			if ( win ) {
+				win.scrollTo(
+					!i ? val : jQuery( win ).scrollLeft(),
+					 i ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				this[ method ] = val;
+			}
+		});
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+	var type = name.toLowerCase();
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem && elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( size ) {
+		// Get window width or height
+		var elem = this[0];
+		if ( !elem ) {
+			return size == null ? null : this;
+		}
+
+		if ( jQuery.isFunction( size ) ) {
+			return this.each(function( i ) {
+				var self = jQuery( this );
+				self[ type ]( size.call( this, i, self[ type ]() ) );
+			});
+		}
+
+		if ( jQuery.isWindow( elem ) ) {
+			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+			var docElemProp = elem.document.documentElement[ "client" + name ],
+				body = elem.document.body;
+			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+				body && body[ "client" + name ] || docElemProp;
+
+		// Get document width or height
+		} else if ( elem.nodeType === 9 ) {
+			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+			return Math.max(
+				elem.documentElement["client" + name],
+				elem.body["scroll" + name], elem.documentElement["scroll" + name],
+				elem.body["offset" + name], elem.documentElement["offset" + name]
+			);
+
+		// Get or set width or height on the element
+		} else if ( size === undefined ) {
+			var orig = jQuery.css( elem, type ),
+				ret = parseFloat( orig );
+
+			return jQuery.isNaN( ret ) ? orig : ret;
+
+		// Set the width or height on the element (default to pixels if value is unitless)
+		} else {
+			return this.css( type, typeof size === "string" ? size : size + "px" );
+		}
+	};
+
+});
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+})(window);
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw-libs.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw-libs.js
new file mode 100644
index 0000000..54978ad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw-libs.js
@@ -0,0 +1,8136 @@
+/*!
+ * JSizes - JQuery plugin v0.33
+ *
+ * Licensed under the revised BSD License.
+ * Copyright 2008-2010 Bram Stein
+ * All rights reserved.
+ */
+/*global jQuery*/
+(function ($) {
+	var num = function (value) {
+			return parseInt(value, 10) || 0;
+		};
+
+	/**
+	 * Sets or gets the values for min-width, min-height, max-width
+	 * and max-height.
+	 */
+	$.each(['min', 'max'], function (i, name) {
+		$.fn[name + 'Size'] = function (value) {
+			var width, height;
+			if (value) {
+				if (value.width !== undefined) {
+					this.css(name + '-width', value.width);
+				}
+				if (value.height !== undefined) {
+					this.css(name + '-height', value.height);
+				}
+				return this;
+			}
+			else {
+				width = this.css(name + '-width');
+				height = this.css(name + '-height');
+				// Apparently:
+				//  * Opera returns -1px instead of none
+				//  * IE6 returns undefined instead of none
+				return {'width': (name === 'max' && (width === undefined || width === 'none' || num(width) === -1) && Number.MAX_VALUE) || num(width), 
+						'height': (name === 'max' && (height === undefined || height === 'none' || num(height) === -1) && Number.MAX_VALUE) || num(height)};
+			}
+		};
+	});
+
+	/**
+	 * Returns whether or not an element is visible.
+	 */
+	$.fn.isVisible = function () {
+		return this.is(':visible');
+	};
+
+	/**
+	 * Sets or gets the values for border, margin and padding.
+	 */
+	$.each(['border', 'margin', 'padding'], function (i, name) {
+		$.fn[name] = function (value) {
+			if (value) {
+				if (value.top !== undefined) {
+					this.css(name + '-top' + (name === 'border' ? '-width' : ''), value.top);
+				}
+				if (value.bottom !== undefined) {
+					this.css(name + '-bottom' + (name === 'border' ? '-width' : ''), value.bottom);
+				}
+				if (value.left !== undefined) {
+					this.css(name + '-left' + (name === 'border' ? '-width' : ''), value.left);
+				}
+				if (value.right !== undefined) {
+					this.css(name + '-right' + (name === 'border' ? '-width' : ''), value.right);
+				}
+				return this;
+			}
+			else {
+				return {top: num(this.css(name + '-top' + (name === 'border' ? '-width' : ''))),
+						bottom: num(this.css(name + '-bottom' + (name === 'border' ? '-width' : ''))),
+						left: num(this.css(name + '-left' + (name === 'border' ? '-width' : ''))),
+						right: num(this.css(name + '-right' + (name === 'border' ? '-width' : '')))};
+			}
+		};
+	});
+})(jQuery);
+/*!
+ * jLayout Border Layout - JavaScript Layout Algorithms v0.4
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009, Bram Stein
+ * All rights reserved.
+ */
+/*global jLayout */
+(function () {
+	jLayout = typeof jLayout === 'undefined' ? {} : jLayout;
+
+	jLayout.border = function (spec) {
+		var my = {},
+			that = {},
+			east = spec.east,
+			west = spec.west,
+			north = spec.north,
+			south = spec.south,
+			center = spec.center;
+
+		my.hgap = spec.hgap || 0;
+		my.vgap = spec.vgap || 0;
+
+		that.items = function () {
+			var items = [];
+			if (east) {
+				items.push(east);
+			}
+
+			if (west) {
+				items.push(west);
+			}
+
+			if (north) {
+				items.push(north);
+			}
+
+			if (south) {
+				items.push(south);
+			}
+
+			if (center) {
+				items.push(center);
+			}
+			return items;
+		};		
+
+		that.layout = function (container) {
+			var size = container.bounds(),
+				insets = container.insets(),
+				top = insets.top,
+				bottom = size.height - insets.bottom,
+				left = insets.left,
+				right = size.width - insets.right,
+				tmp;
+
+			if (north && north.isVisible()) {
+				tmp = north.preferredSize();
+				north.bounds({'x': left, 'y': top, 'width': right - left, 'height': tmp.height});
+				north.doLayout();
+
+				top += tmp.height + my.vgap;
+			}
+			if (south && south.isVisible()) {
+				tmp = south.preferredSize();
+				south.bounds({'x': left, 'y': bottom - tmp.height, 'width': right - left, 'height': tmp.height});
+				south.doLayout();
+
+				bottom -= tmp.height + my.vgap;
+			}
+			if (east && east.isVisible()) {
+				tmp = east.preferredSize();
+				east.bounds({'x': right - tmp.width, 'y': top, 'width': tmp.width, 'height': bottom - top});
+				east.doLayout();
+
+				right -= tmp.width + my.hgap;
+			}
+			if (west && west.isVisible()) {
+				tmp = west.preferredSize();
+				west.bounds({'x': left, 'y': top, 'width': tmp.width, 'height': bottom - top});
+				west.doLayout();
+
+				left += tmp.width + my.hgap;
+			}
+			if (center && center.isVisible()) {
+				center.bounds({'x': left, 'y': top, 'width': right - left, 'height': bottom - top});
+				center.doLayout();
+			}
+			return container;
+		};
+
+		function typeLayout(type) {
+			return function (container) {
+				var insets = container.insets(),
+					width = 0,
+					height = 0,
+					type_size;
+
+				if (east && east.isVisible()) {
+					type_size = east[type + 'Size']();
+					width += type_size.width + my.hgap;
+					height = type_size.height;
+				}
+				if (west && west.isVisible()) {
+					type_size = west[type + 'Size']();
+					width += type_size.width + my.hgap;
+					height = Math.max(type_size.height, height);
+				}
+				if (center && center.isVisible()) {
+					type_size = center[type + 'Size']();
+					width += type_size.width;
+					height = Math.max(type_size.height, height);
+				}
+				if (north && north.isVisible()) {
+					type_size = north[type + 'Size']();
+					width = Math.max(type_size.width, width);
+					height += type_size.height + my.vgap;
+				}
+				if (south && south.isVisible()) {
+					type_size = south[type + 'Size']();
+					width = Math.max(type_size.width, width);
+					height += type_size.height + my.vgap;
+				}
+
+				return {
+					'width': width + insets.left + insets.right, 
+					'height': height + insets.top + insets.bottom
+				};
+			};
+		}
+		that.preferred = typeLayout('preferred');
+		that.minimum = typeLayout('minimum');
+		that.maximum = typeLayout('maximum');
+		return that;
+	};
+})();
+/*!
+ * jLayout Grid Layout - JavaScript Layout Algorithms v0.41
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009, Bram Stein
+ * All rights reserved.
+ */
+/*global jLayout */
+(function () {
+	jLayout = typeof jLayout === 'undefined' ? {} : jLayout;
+
+	jLayout.grid = function (spec, shared) {
+		var my = shared || {},
+			that = {};
+
+		my.hgap = spec.hgap || 0;
+		my.vgap = spec.vgap || 0;
+
+		// initialize the number of columns to the number of items
+		// we're laying out.
+		my.items = spec.items || [];
+		my.columns = spec.columns || my.items.length;
+		my.rows = spec.rows || 0;
+		my.fillVertical = spec.fill && spec.fill === 'vertical';
+
+		if (my.rows > 0) {
+			my.columns = Math.floor((my.items.length + my.rows - 1) / my.rows); 
+		} else {
+			my.rows = Math.floor((my.items.length + my.columns - 1) / my.columns);
+		}
+	
+		that.items = function () {
+			var r = [];
+			Array.prototype.push.apply(r, my.items);
+			return r;
+		};
+
+		that.layout = function (container) {
+			var i, j,
+				insets = container.insets(),
+				x = insets.left,
+				y = insets.top,
+				width = (container.bounds().width - (insets.left + insets.right) - (my.columns - 1) * my.hgap) / my.columns,
+				height = (container.bounds().height - (insets.top + insets.bottom) - (my.rows - 1) * my.vgap) / my.rows;
+
+			for (i = 0, j = 1; i < my.items.length; i += 1, j += 1) {
+				my.items[i].bounds({'x': x, 'y': y, 'width': width, 'height': height});
+
+				if (!my.fillVertical) {
+					if (j >= my.columns) {
+						y += height + my.vgap;
+						x = insets.left;
+						j = 0;
+					}
+					else {
+						x += width + my.hgap;
+					}
+				} else {
+					if (j >= my.rows) {
+						x += width + my.hgap;
+						y = insets.top;
+						j = 0;
+					} else {
+						y += height + my.vgap;
+					}
+				}
+				my.items[i].doLayout();
+			}
+			return container;
+		};
+
+		function typeLayout(type) {
+			return function (container) {
+				var i = 0, 
+					width = 0, 
+					height = 0, 
+					type_size,
+					insets = container.insets();
+
+				for (; i < my.items.length; i += 1) {
+					type_size = my.items[i][type + 'Size']();
+					width = Math.max(width, type_size.width);
+					height = Math.max(height, type_size.height);
+				}
+				return {
+					'width': insets.left + insets.right + my.columns * width + (my.columns - 1) * my.hgap, 
+					'height': insets.top + insets.bottom + my.rows * height + (my.rows - 1) * my.vgap
+				};
+			};
+		}
+
+		// this creates the min and preferred size methods, as they
+		// only differ in the function they call.
+		that.preferred = typeLayout('preferred');
+		that.minimum = typeLayout('minimum');
+		that.maximum = typeLayout('maximum');
+		return that;
+	};
+})();
+
+/*!
+ * jLayout Flex Grid Layout - JavaScript Layout Algorithms v0.4
+ * Based on: http://www.javaworld.com/javaworld/javatips/jw-javatip121.html
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009, Bram Stein
+ * All rights reserved.
+ */
+/*global jLayout */
+(function () {
+	jLayout = typeof jLayout === 'undefined' ? {} : jLayout;
+
+	// The flex grid has a dependency on the grid layout, so please make
+	// sure you include the grid layout manager before the flex grid
+	// layout manager.
+	if (typeof jLayout.grid !== 'undefined') {
+		jLayout.flexGrid = function (spec) {
+			var my = {},
+				that = this.grid(spec, my);
+
+			function zeroArray(a, l) {
+				var i = 0;
+				for (; i < l; i += 1) {
+					a[i] = 0;
+				}
+				return a;
+			}
+
+			function typeLayout(type) {
+				return function (container) {
+					var i = 0, r = 0, c = 0, nw = 0, nh = 0,
+						w = zeroArray([], my.columns),
+						h = zeroArray([], my.rows),
+						type_size,
+						insets = container.insets();
+			
+					for (i = 0; i < my.items.length; i += 1) {
+						r = i / my.columns;
+						c = i % my.columns;
+						type_size = my.items[i][type + 'Size']();
+						if (w[c] < type_size.width) {
+							w[c] = type_size.width;
+						}
+						if (h[r] < type_size.height) {
+							h[r] = type_size.height;
+						}
+					}
+					for (i = 0; i < my.columns; i += 1) {
+						nw += w[i];
+					}
+					for (i = 0; i < my.rows; i += 1) {
+						nh += h[i];
+					}
+					return {
+						width: insets.left + insets.right + nw + (my.columns - 1) * my.hgap,
+						height: insets.top + insets.bottom + nh + (my.rows - 1) * my.vgap
+					};
+				};
+			}
+
+			that.preferred = typeLayout('preferred');
+			that.minimum = typeLayout('minimum');
+			that.maximum = typeLayout('maximum');
+
+			that.layout = function (container) {
+				var i = 0, c = 0, r = 0,
+					pd = that.preferred(container),
+					sw = container.bounds().width / pd.width,
+					sh = container.bounds().height / pd.height,
+					w = zeroArray([], my.columns),
+					h = zeroArray([], my.rows),
+					insets = container.insets(),
+					x = insets.left,
+					y = insets.top,
+					d;
+
+				for (i = 0; i < my.items.length; i += 1) {
+					r = i / my.columns;
+					c = i % my.columns;
+					d = my.items[i].preferredSize();
+					d.width = sw * d.width;
+					d.height = sh * d.height;
+
+					if (w[c] < d.width) {
+						w[c] = d.width;
+					}
+					if (h[r] < d.height) {
+						h[r] = d.height;
+					}
+				}
+
+				for (c = 0; c < my.columns; c += 1) {
+					for (r = 0, y = insets.top; r < my.rows; r += 1) {
+						i = r * my.columns + c;
+						if (i < my.items.length) {
+							my.items[i].bounds({'x': x, 'y': y, 'width': w[c], 'height': h[r]});
+							my.items[i].doLayout();
+						}
+						y += h[r] + my.vgap;
+					}
+					x += w[c] + my.hgap;
+				}
+
+				return container;
+			};
+			return that;
+		};
+	}
+})();
+/*!
+ * jLayout Flow Layout - JavaScript Layout Algorithms v0.12
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009, Bram Stein
+ * All rights reserved.
+ */
+/*global jLayout */
+(function () {
+	jLayout = typeof jLayout === 'undefined' ? {} : jLayout;
+
+	jLayout.flow = function (options) {
+		var my = {},
+			that = {};
+
+		
+		my.hgap = typeof options.hgap === 'number' && !isNaN(options.hgap) ? options.hgap : 5;
+		my.vgap = typeof options.vgap === 'number' && !isNaN(options.vgap) ? options.vgap : 5;
+		my.items = options.items || [];
+		my.alignment = (options.alignment && (options.alignment === 'center' || options.alignment === 'right' || options.alignment === 'left') && options.alignment) || 'left';		
+
+		that.items = function () {
+			var r = [];
+			Array.prototype.push.apply(r, my.items);
+			return r;
+		};
+
+		that.layout = function (container) {
+			var parentSize = container.bounds(),
+				insets = container.insets(),
+				i = 0,
+				len = my.items.length,
+				itemSize,
+				currentRow = [],
+				rowSize = {
+					width: 0,
+					height: 0
+				},
+				offset = {
+					x: insets.left,
+					y: insets.top
+				};
+
+			parentSize.width -= insets.left + insets.right;
+			parentSize.height -= insets.top + insets.bottom;
+
+			for (; i < len; i += 1) {
+				if (my.items[i].isVisible()) {
+					itemSize = my.items[i].preferredSize();
+					
+					if ((rowSize.width + itemSize.width) > parentSize.width) {
+						align(currentRow, offset, rowSize, parentSize);
+
+						currentRow = [];
+						offset.y += rowSize.height;
+						offset.x = insets.left;
+						rowSize.width = 0;
+						rowSize.height = 0;
+					}
+					rowSize.height = Math.max(rowSize.height, itemSize.height + my.vgap);
+					rowSize.width += itemSize.width + my.hgap;
+
+					currentRow.push(my.items[i]);
+				}
+			}
+			align(currentRow, offset, rowSize, parentSize);
+			return container;
+		};
+
+		function align(row, offset, rowSize, parentSize) {
+			var location = {
+					x: offset.x,
+					y: offset.y
+				},
+				i = 0,
+				len = row.length;
+
+			switch (my.alignment) {
+				case 'center': {
+					location.x += (my.hgap + parentSize.width - rowSize.width) / 2;
+					break;
+				}
+				case 'right': {
+					location.x += parentSize.width - rowSize.width + my.hgap;
+					break;
+				}
+			}
+
+			for (; i < len; i += 1) {
+				location.y = offset.y;
+				row[i].bounds(location);
+				row[i].doLayout();
+				location.x += row[i].bounds().width + my.hgap;
+			}
+		}
+
+		function typeLayout(type) {
+			return function (container) {
+				var i = 0, 
+					width = 0, 
+					height = 0, 
+					typeSize,
+					firstComponent = false,
+					insets = container.insets();
+
+				for (; i < my.items.length; i += 1) {
+					if (my.items[i].isVisible()) {
+						typeSize = my.items[i][type + 'Size']();
+						height = Math.max(height, typeSize.height);
+						width += typeSize.width;
+					}
+				}
+
+				return {
+					'width': width + insets.left + insets.right + (my.items.length - 1) * my.hgap,
+					'height': height + insets.top + insets.bottom
+				};
+			};
+		}
+
+		that.preferred = typeLayout('preferred');
+		that.minimum = typeLayout('minimum');
+		that.maximum = typeLayout('maximum');		
+
+		return that;
+	};
+})();
+
+/*!
+ * jLayout JQuery Plugin v0.17
+ *
+ * Licensed under the new BSD License.
+ * Copyright 2008-2009 Bram Stein
+ * All rights reserved.
+ */
+/*global jQuery jLayout*/
+if (jQuery && jLayout) {
+	(function ($) {
+		/**
+		 * This wraps jQuery objects in another object that supplies
+		 * the methods required for the layout algorithms.
+		 */
+		function wrap(item, resize) {
+			var that = {};
+
+			$.each(['min', 'max'], function (i, name) {
+				that[name + 'imumSize'] = function (value) {
+                    var l = item.data('jlayout');
+                    
+					if (l) {
+						return l[name + 'imum'](that);
+					} else {
+						return item[name + 'Size'](value);
+					}
+				};
+			});
+
+			$.extend(that, {
+				doLayout: function () {
+                    var l = item.data('jlayout');
+                    
+					if (l) {
+                        l.layout(that);
+					}
+					item.css({position: 'absolute'});
+				},
+				isVisible: function () {
+					return item.isVisible();
+				},
+				insets: function () {
+					var p = item.padding(),
+						b = item.border();
+
+					return {
+                        'top': p.top, 
+						'bottom': p.bottom + b.bottom + b.top, 
+						'left': p.left, 
+						'right': p.right + b.right + b.left
+                    };
+				},
+				bounds: function (value) {
+					var tmp = {};
+
+					if (value) {
+						if (typeof value.x === 'number') {
+							tmp.left = value.x;
+						}
+						if (typeof value.y === 'number') {
+							tmp.top = value.y;
+						}
+						if (typeof value.width === 'number') {
+							tmp.width = (value.width - (item.outerWidth(true) - item.width()));
+							tmp.width = (tmp.width >= 0) ? tmp.width : 0;
+						}
+						if (typeof value.height === 'number') {
+							tmp.height = value.height - (item.outerHeight(true) - item.height());
+							tmp.height = (tmp.height >= 0) ? tmp.height : 0;
+						}
+						item.css(tmp);
+						return item;
+					} else {
+						tmp = item.position();
+						return {
+                          	'x': tmp.left,
+                        	'y': tmp.top,
+							'width': item.outerWidth(false),
+							'height': item.outerHeight(false)
+                        };
+					}
+				},
+				preferredSize: function () {
+					var minSize,
+						maxSize,
+						margin = item.margin(),
+						size = {width: 0, height: 0},
+                        l = item.data('jlayout');
+
+					if (l && resize) {
+						size = l.preferred(that);
+
+						minSize = that.minimumSize();
+						maxSize = that.maximumSize();
+
+						size.width += margin.left + margin.right;
+						size.height += margin.top + margin.bottom;
+
+						if (size.width < minSize.width || size.height < minSize.height) {
+							size.width = Math.max(size.width, minSize.width);
+							size.height = Math.max(size.height, minSize.height);
+						} else if (size.width > maxSize.width || size.height > maxSize.height) {
+							size.width = Math.min(size.width, maxSize.width);
+							size.height = Math.min(size.height, maxSize.height);
+						}
+					} else {
+                        size = that.bounds();
+						size.width += margin.left + margin.right;
+						size.height += margin.top + margin.bottom;
+					}
+					return size;
+				}
+			});
+			return that;
+		}
+
+		$.fn.layout = function (options) {
+			var opts = $.extend({}, $.fn.layout.defaults, options);
+			return $.each(this, function () {
+				var element = $(this),
+					o = $.metadata && element.metadata().layout ? $.extend(opts, element.metadata().layout) : opts,
+					elementWrapper = wrap(element, o.resize);
+
+				if (o.type === 'border' && typeof jLayout.border !== 'undefined') {                
+					$.each(['north', 'south', 'west', 'east', 'center'], function (i, name) {
+						if (element.children().hasClass(name)) {
+							o[name] = wrap(element.children('.' + name + ':first'));
+						}
+					});
+					element.data('jlayout', jLayout.border(o));
+				} else if (o.type === 'grid' && typeof jLayout.grid !== 'undefined') {
+					o.items = [];
+					element.children().each(function (i) {
+						if (!$(this).hasClass('ui-resizable-handle')) {
+							o.items[i] = wrap($(this));
+						}
+					});
+					element.data('jlayout', jLayout.grid(o));
+				} else if (o.type === 'flexGrid' && typeof jLayout.flexGrid !== 'undefined') {
+					o.items = [];
+					element.children().each(function (i) {
+						if (!$(this).hasClass('ui-resizable-handle')) {
+							o.items[i] = wrap($(this));
+						}
+					});
+					element.data('jlayout', jLayout.flexGrid(o));
+				} else if (o.type === 'column' && typeof jLayout.column !== 'undefined') {
+					o.items = [];
+					element.children().each(function (i) {
+						if (!$(this).hasClass('ui-resizable-handle')) {
+							o.items[i] = wrap($(this));
+						}
+					});
+					element.data('jlayout', jLayout.column(o));
+				} else if (o.type === 'flow' && typeof jLayout.flow !== 'undefined') {
+					o.items = [];
+					element.children().each(function (i) {
+						if (!$(this).hasClass('ui-resizable-handle')) {
+							o.items[i] = wrap($(this));
+						}
+					});
+					element.data('jlayout', jLayout.flow(o));					
+				}
+                
+				if (o.resize) {
+					elementWrapper.bounds(elementWrapper.preferredSize());
+				}
+                
+				elementWrapper.doLayout();
+				element.css({position: 'relative'});
+				if ($.ui !== undefined) {
+					element.addClass('ui-widget');
+				}
+			});
+		};
+
+		$.fn.layout.defaults = {
+			resize: true,
+			type: 'grid'
+		};
+	})(jQuery);
+}
+/*
+* jQuery Mobile Framework Git Build: SHA1: e30428803d6e0bfc2165ec9a2d26cd93a0f3a8e6 <> Date: Thu Apr 5 16:35:09 2012 +0900
+* http://jquerymobile.com
+*
+* Copyright 2011 (c) jQuery Project
+* Dual licensed under the MIT or GPL Version 2 licenses.
+* http://jquery.org/license
+*
+*/
+/*!
+ * jQuery UI Widget @VERSION
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+	var _cleanData = $.cleanData;
+	$.cleanData = function( elems ) {
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			$( elem ).triggerHandler( "remove" );
+		}
+		_cleanData( elems );
+	};
+} else {
+	var _remove = $.fn.remove;
+	$.fn.remove = function( selector, keepData ) {
+		return this.each(function() {
+			if ( !keepData ) {
+				if ( !selector || $.filter( selector, [ this ] ).length ) {
+					$( "*", this ).add( [ this ] ).each(function() {
+						$( this ).triggerHandler( "remove" );
+					});
+				}
+			}
+			return _remove.call( $(this), selector, keepData );
+		});
+	};
+}
+
+$.widget = function( name, base, prototype ) {
+	var namespace = name.split( "." )[ 0 ],
+		fullName;
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName ] = function( elem ) {
+		return !!$.data( elem, name );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	$[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without initializing for simple inheritance
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+
+	var basePrototype = new base();
+	// we need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+//	$.each( basePrototype, function( key, val ) {
+//		if ( $.isPlainObject(val) ) {
+//			basePrototype[ key ] = $.extend( {}, val );
+//		}
+//	});
+	basePrototype.options = $.extend( true, {}, basePrototype.options );
+	$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+		namespace: namespace,
+		widgetName: name,
+		widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+		widgetBaseClass: fullName
+	}, prototype );
+
+	$.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = Array.prototype.slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.extend.apply( null, [ true, options ].concat(args) ) :
+			options;
+
+		// prevent calls to internal methods
+		if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+			return returnValue;
+		}
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var instance = $.data( this, name );
+				if ( !instance ) {
+					throw "cannot call methods on " + name + " prior to initialization; " +
+						"attempted to call method '" + options + "'";
+				}
+				if ( !$.isFunction( instance[options] ) ) {
+					throw "no such method '" + options + "' for " + name + " widget instance";
+				}
+				var methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, name );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					$.data( this, name, new object( options, this ) );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( options, element ) {
+	// allow instantiation without initializing for simple inheritance
+	if ( arguments.length ) {
+		this._createWidget( options, element );
+	}
+};
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	options: {
+		disabled: false
+	},
+	_createWidget: function( options, element ) {
+		// $.widget.bridge stores the plugin instance, but we do it anyway
+		// so that it's stored even before the _create function runs
+		$.data( element, this.widgetName, this );
+		this.element = $( element );
+		this.options = $.extend( true, {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		var self = this;
+		this.element.bind( "remove." + this.widgetName, function() {
+			self.destroy();
+		});
+
+		this._create();
+		this._trigger( "create" );
+		this._init();
+	},
+	_getCreateOptions: function() {
+		var options = {};
+		if ( $.metadata ) {
+			options = $.metadata.get( element )[ this.widgetName ];
+		}
+		return options;
+	},
+	_create: function() {},
+	_init: function() {},
+
+	destroy: function() {
+		this.element
+			.unbind( "." + this.widgetName )
+			.removeData( this.widgetName );
+		this.widget()
+			.unbind( "." + this.widgetName )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetBaseClass + "-disabled " +
+				"ui-state-disabled" );
+	},
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.extend( {}, this.options );
+		}
+
+		if  (typeof key === "string" ) {
+			if ( value === undefined ) {
+				return this.options[ key ];
+			}
+			options = {};
+			options[ key ] = value;
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var self = this;
+		$.each( options, function( key, value ) {
+			self._setOption( key, value );
+		});
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				[ value ? "addClass" : "removeClass"](
+					this.widgetBaseClass + "-disabled" + " " +
+					"ui-state-disabled" )
+				.attr( "aria-disabled", value );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_trigger: function( type, event, data ) {
+		var callback = this.options[ type ];
+
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		data = data || {};
+
+		// copy original event properties over to the new event
+		// this would happen if we could call $.event.fix instead of $.Event
+		// but we don't have a way to force an event to be fixed multiple times
+		if ( event.originalEvent ) {
+			for ( var i = $.event.props.length, prop; i; ) {
+				prop = $.event.props[ --i ];
+				event[ prop ] = event.originalEvent[ prop ];
+			}
+		}
+
+		this.element.trigger( event, data );
+
+		return !( $.isFunction(callback) &&
+			callback.call( this.element[0], event, data ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+})( jQuery );
+/*
+* widget factory extentions for mobile
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.widget", {
+	// decorate the parent _createWidget to trigger `widgetinit` for users
+	// who wish to do post post `widgetcreate` alterations/additions
+	//
+	// TODO create a pull request for jquery ui to trigger this event
+	// in the original _createWidget
+	_createWidget: function() {
+		$.Widget.prototype._createWidget.apply( this, arguments );
+		this._trigger( 'init' );
+	},
+
+	_getCreateOptions: function() {
+
+		var elem = this.element,
+			options = {};
+
+		$.each( this.options, function( option ) {
+
+			var value = elem.jqmData( option.replace( /[A-Z]/g, function( c ) {
+							return "-" + c.toLowerCase();
+						})
+					);
+
+			if ( value !== undefined ) {
+				options[ option ] = value;
+			}
+		});
+
+		return options;
+	},
+
+	enhanceWithin: function( target ) {
+		// TODO remove dependency on the page widget for the keepNative.
+		// Currently the keepNative value is defined on the page prototype so
+		// the method is as well
+		var page = $(target).closest(":jqmData(role='page')").data( "page" ),
+			keepNative = (page && page.keepNativeSelector()) || "";
+
+		$( this.options.initSelector, target ).not( keepNative )[ this.widgetName ]();
+	}
+});
+
+})( jQuery );
+/*
+* a workaround for window.matchMedia
+*/
+
+(function( $, undefined ) {
+
+var $window = $( window ),
+	$html = $( "html" );
+
+/* $.mobile.media method: pass a CSS media type or query and get a bool return
+	note: this feature relies on actual media query support for media queries, though types will work most anywhere
+	examples:
+		$.mobile.media('screen') //>> tests for screen media type
+		$.mobile.media('screen and (min-width: 480px)') //>> tests for screen media type with window width > 480px
+		$.mobile.media('@media screen and (-webkit-min-device-pixel-ratio: 2)') //>> tests for webkit 2x pixel ratio (iPhone 4)
+*/
+$.mobile.media = (function() {
+	// TODO: use window.matchMedia once at least one UA implements it
+	var cache = {},
+		testDiv = $( "<div id='jquery-mediatest'>" ),
+		fakeBody = $( "<body>" ).append( testDiv );
+
+	return function( query ) {
+		if ( !( query in cache ) ) {
+			var styleBlock = document.createElement( "style" ),
+				cssrule = "@media " + query + " { #jquery-mediatest { position:absolute; } }";
+
+			//must set type for IE!
+			styleBlock.type = "text/css";
+
+			if ( styleBlock.styleSheet  ){
+				styleBlock.styleSheet.cssText = cssrule;
+			} else {
+				styleBlock.appendChild( document.createTextNode(cssrule) );
+			}
+
+			$html.prepend( fakeBody ).prepend( styleBlock );
+			cache[ query ] = testDiv.css( "position" ) === "absolute";
+			fakeBody.add( styleBlock ).remove();
+		}
+		return cache[ query ];
+	};
+})();
+
+})(jQuery);
+/*
+* support tests
+*/
+
+(function( $, undefined ) {
+
+var fakeBody = $( "<body>" ).prependTo( "html" ),
+	fbCSS = fakeBody[ 0 ].style,
+	vendors = [ "Webkit", "Moz", "O" ],
+	webos = "palmGetResource" in window, //only used to rule out scrollTop
+	operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]",
+	bb = window.blackberry; //only used to rule out box shadow, as it's filled opaque on BB
+
+// thx Modernizr
+function propExists( prop ) {
+	var uc_prop = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 ),
+		props = ( prop + " " + vendors.join( uc_prop + " " ) + uc_prop ).split( " " );
+
+	for ( var v in props ){
+		if ( fbCSS[ props[ v ] ] !== undefined ) {
+			return true;
+		}
+	}
+}
+
+// Test for dynamic-updating base tag support ( allows us to avoid href,src attr rewriting )
+function baseTagTest() {
+	var fauxBase = location.protocol + "//" + location.host + location.pathname + "ui-dir/",
+		base = $( "head base" ),
+		fauxEle = null,
+		href = "",
+		link, rebase;
+
+	if ( !base.length ) {
+		base = fauxEle = $( "<base>", { "href": fauxBase }).appendTo( "head" );
+	} else {
+		href = base.attr( "href" );
+	}
+
+	link = $( "<a href='testurl' />" ).prependTo( fakeBody );
+	rebase = link[ 0 ].href;
+	base[ 0 ].href = href || location.pathname;
+
+	if ( fauxEle ) {
+		fauxEle.remove();
+	}
+	return rebase.indexOf( fauxBase ) === 0;
+}
+
+
+// non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683
+// allows for inclusion of IE 6+, including Windows Mobile 7
+$.mobile.browser = {};
+$.mobile.browser.ie = (function() {
+	var v = 3,
+	div = document.createElement( "div" ),
+	a = div.all || [];
+
+	while ( div.innerHTML = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->", a[ 0 ] );
+
+	return v > 4 ? v : !v;
+})();
+
+
+$.extend( $.support, {
+	orientation: "orientation" in window && "onorientationchange" in window,
+	touch: "ontouchend" in document,
+	cssTransitions: "WebKitTransitionEvent" in window,
+	pushState: "pushState" in history && "replaceState" in history,
+	mediaquery: $.mobile.media( "only all" ),
+	cssPseudoElement: !!propExists( "content" ),
+	touchOverflow: !!propExists( "overflowScrolling" ),
+	boxShadow: !!propExists( "boxShadow" ) && !bb,
+	scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos && !operamini,
+	dynamicBaseTag: baseTagTest()
+});
+
+fakeBody.remove();
+
+
+// $.mobile.ajaxBlacklist is used to override ajaxEnabled on platforms that have known conflicts with hash history updates (BB5, Symbian)
+// or that generally work better browsing in regular http for full page refreshes (Opera Mini)
+// Note: This detection below is used as a last resort.
+// We recommend only using these detection methods when all other more reliable/forward-looking approaches are not possible
+var nokiaLTE7_3 = (function(){
+
+	var ua = window.navigator.userAgent;
+
+	//The following is an attempt to match Nokia browsers that are running Symbian/s60, with webkit, version 7.3 or older
+	return ua.indexOf( "Nokia" ) > -1 &&
+			( ua.indexOf( "Symbian/3" ) > -1 || ua.indexOf( "Series60/5" ) > -1 ) &&
+			ua.indexOf( "AppleWebKit" ) > -1 &&
+			ua.match( /(BrowserNG|NokiaBrowser)\/7\.[0-3]/ );
+})();
+
+$.mobile.ajaxBlacklist =
+			// BlackBerry browsers, pre-webkit
+			window.blackberry && !window.WebKitPoint ||
+			// Opera Mini
+			operamini ||
+			// Symbian webkits pre 7.3
+			nokiaLTE7_3;
+
+// Lastly, this workaround is the only way we've found so far to get pre 7.3 Symbian webkit devices
+// to render the stylesheets when they're referenced before this script, as we'd recommend doing.
+// This simply reappends the CSS in place, which for some reason makes it apply
+if ( nokiaLTE7_3 ) {
+	$(function() {
+		$( "head link[rel='stylesheet']" ).attr( "rel", "alternate stylesheet" ).attr( "rel", "stylesheet" );
+	});
+}
+
+// For ruling out shadows via css
+if ( !$.support.boxShadow ) {
+	$( "html" ).addClass( "ui-mobile-nosupport-boxshadow" );
+}
+
+})( jQuery );
+/*
+* "mouse" plugin
+*/
+
+// This plugin is an experiment for abstracting away the touch and mouse
+// events so that developers don't have to worry about which method of input
+// the device their document is loaded on supports.
+//
+// The idea here is to allow the developer to register listeners for the
+// basic mouse events, such as mousedown, mousemove, mouseup, and click,
+// and the plugin will take care of registering the correct listeners
+// behind the scenes to invoke the listener at the fastest possible time
+// for that device, while still retaining the order of event firing in
+// the traditional mouse environment, should multiple handlers be registered
+// on the same element for different events.
+//
+// The current version exposes the following virtual events to jQuery bind methods:
+// "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel"
+
+(function( $, window, document, undefined ) {
+
+var dataPropertyName = "virtualMouseBindings",
+	touchTargetPropertyName = "virtualTouchID",
+	virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split( " " ),
+	touchEventProps = "clientX clientY pageX pageY screenX screenY".split( " " ),
+	activeDocHandlers = {},
+	resetTimerID = 0,
+	startX = 0,
+	startY = 0,
+	didScroll = false,
+	clickBlockList = [],
+	blockMouseTriggers = false,
+	blockTouchTriggers = false,
+	eventCaptureSupported = "addEventListener" in document,
+	$document = $( document ),
+	nextTouchID = 1,
+	lastTouchID = 0;
+
+$.vmouse = {
+	moveDistanceThreshold: 10,
+	clickDistanceThreshold: 10,
+	resetTimerDuration: 1500
+};
+
+function getNativeEvent( event ) {
+
+	while ( event && typeof event.originalEvent !== "undefined" ) {
+		event = event.originalEvent;
+	}
+	return event;
+}
+
+function createVirtualEvent( event, eventType ) {
+
+	var t = event.type,
+		oe, props, ne, prop, ct, touch, i, j;
+
+	event = $.Event(event);
+	event.type = eventType;
+
+	oe = event.originalEvent;
+	props = $.event.props;
+
+	// copy original event properties over to the new event
+	// this would happen if we could call $.event.fix instead of $.Event
+	// but we don't have a way to force an event to be fixed multiple times
+	if ( oe ) {
+		for ( i = props.length, prop; i; ) {
+			prop = props[ --i ];
+			event[ prop ] = oe[ prop ];
+		}
+	}
+
+	// make sure that if the mouse and click virtual events are generated
+	// without a .which one is defined
+	if ( t.search(/mouse(down|up)|click/) > -1 && !event.which ){
+		event.which = 1;
+	}
+
+	if ( t.search(/^touch/) !== -1 ) {
+		ne = getNativeEvent( oe );
+		t = ne.touches;
+		ct = ne.changedTouches;
+		touch = ( t && t.length ) ? t[0] : ( (ct && ct.length) ? ct[ 0 ] : undefined );
+
+		if ( touch ) {
+			for ( j = 0, len = touchEventProps.length; j < len; j++){
+				prop = touchEventProps[ j ];
+				event[ prop ] = touch[ prop ];
+			}
+		}
+	}
+
+	return event;
+}
+
+function getVirtualBindingFlags( element ) {
+
+	var flags = {},
+		b, k;
+
+	while ( element ) {
+
+		b = $.data( element, dataPropertyName );
+
+		for (  k in b ) {
+			if ( b[ k ] ) {
+				flags[ k ] = flags.hasVirtualBinding = true;
+			}
+		}
+		element = element.parentNode;
+	}
+	return flags;
+}
+
+function getClosestElementWithVirtualBinding( element, eventType ) {
+	var b;
+	while ( element ) {
+
+		b = $.data( element, dataPropertyName );
+
+		if ( b && ( !eventType || b[ eventType ] ) ) {
+			return element;
+		}
+		element = element.parentNode;
+	}
+	return null;
+}
+
+function enableTouchBindings() {
+	blockTouchTriggers = false;
+}
+
+function disableTouchBindings() {
+	blockTouchTriggers = true;
+}
+
+function enableMouseBindings() {
+	lastTouchID = 0;
+	clickBlockList.length = 0;
+	blockMouseTriggers = false;
+
+	// When mouse bindings are enabled, our
+	// touch bindings are disabled.
+	disableTouchBindings();
+}
+
+function disableMouseBindings() {
+	// When mouse bindings are disabled, our
+	// touch bindings are enabled.
+	enableTouchBindings();
+}
+
+function startResetTimer() {
+	clearResetTimer();
+	resetTimerID = setTimeout(function(){
+		resetTimerID = 0;
+		enableMouseBindings();
+	}, $.vmouse.resetTimerDuration );
+}
+
+function clearResetTimer() {
+	if ( resetTimerID ){
+		clearTimeout( resetTimerID );
+		resetTimerID = 0;
+	}
+}
+
+function triggerVirtualEvent( eventType, event, flags ) {
+	var ve;
+
+	if ( ( flags && flags[ eventType ] ) ||
+				( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) {
+
+		ve = createVirtualEvent( event, eventType );
+
+		$( event.target).trigger( ve );
+	}
+
+	return ve;
+}
+
+function mouseEventCallback( event ) {
+	var touchID = $.data(event.target, touchTargetPropertyName);
+
+	if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ){
+		var ve = triggerVirtualEvent( "v" + event.type, event );
+		if ( ve ) {
+			if ( ve.isDefaultPrevented() ) {
+				event.preventDefault();
+			}
+			if ( ve.isPropagationStopped() ) {
+				event.stopPropagation();
+			}
+			if ( ve.isImmediatePropagationStopped() ) {
+				event.stopImmediatePropagation();
+			}
+		}
+	}
+}
+
+function handleTouchStart( event ) {
+
+	var touches = getNativeEvent( event ).touches,
+		target, flags;
+
+	if ( touches && touches.length === 1 ) {
+
+		target = event.target;
+		flags = getVirtualBindingFlags( target );
+
+		if ( flags.hasVirtualBinding ) {
+
+			lastTouchID = nextTouchID++;
+			$.data( target, touchTargetPropertyName, lastTouchID );
+
+			clearResetTimer();
+
+			disableMouseBindings();
+			didScroll = false;
+
+			var t = getNativeEvent( event ).touches[ 0 ];
+			startX = t.pageX;
+			startY = t.pageY;
+
+			triggerVirtualEvent( "vmouseover", event, flags );
+			triggerVirtualEvent( "vmousedown", event, flags );
+		}
+	}
+}
+
+function handleScroll( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	if ( !didScroll ) {
+		triggerVirtualEvent( "vmousecancel", event, getVirtualBindingFlags( event.target ) );
+	}
+
+	didScroll = true;
+	startResetTimer();
+}
+
+function handleTouchMove( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	var t = getNativeEvent( event ).touches[ 0 ],
+		didCancel = didScroll,
+		moveThreshold = $.vmouse.moveDistanceThreshold;
+		didScroll = didScroll ||
+			( Math.abs(t.pageX - startX) > moveThreshold ||
+				Math.abs(t.pageY - startY) > moveThreshold ),
+		flags = getVirtualBindingFlags( event.target );
+
+	if ( didScroll && !didCancel ) {
+		triggerVirtualEvent( "vmousecancel", event, flags );
+	}
+
+	triggerVirtualEvent( "vmousemove", event, flags );
+	startResetTimer();
+}
+
+function handleTouchEnd( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	disableTouchBindings();
+
+	var flags = getVirtualBindingFlags( event.target ),
+		t;
+	triggerVirtualEvent( "vmouseup", event, flags );
+
+	if ( !didScroll ) {
+		var ve = triggerVirtualEvent( "vclick", event, flags );
+		if ( ve && ve.isDefaultPrevented() ) {
+			// The target of the mouse events that follow the touchend
+			// event don't necessarily match the target used during the
+			// touch. This means we need to rely on coordinates for blocking
+			// any click that is generated.
+			t = getNativeEvent( event ).changedTouches[ 0 ];
+			clickBlockList.push({
+				touchID: lastTouchID,
+				x: t.clientX,
+				y: t.clientY
+			});
+
+			// Prevent any mouse events that follow from triggering
+			// virtual event notifications.
+			blockMouseTriggers = true;
+		}
+	}
+	triggerVirtualEvent( "vmouseout", event, flags);
+	didScroll = false;
+
+	startResetTimer();
+}
+
+function hasVirtualBindings( ele ) {
+	var bindings = $.data( ele, dataPropertyName ),
+		k;
+
+	if ( bindings ) {
+		for ( k in bindings ) {
+			if ( bindings[ k ] ) {
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+function dummyMouseHandler(){}
+
+function getSpecialEventObject( eventType ) {
+	var realType = eventType.substr( 1 );
+
+	return {
+		setup: function( data, namespace ) {
+			// If this is the first virtual mouse binding for this element,
+			// add a bindings object to its data.
+
+			if ( !hasVirtualBindings( this ) ) {
+				$.data( this, dataPropertyName, {});
+			}
+
+			// If setup is called, we know it is the first binding for this
+			// eventType, so initialize the count for the eventType to zero.
+			var bindings = $.data( this, dataPropertyName );
+			bindings[ eventType ] = true;
+
+			// If this is the first virtual mouse event for this type,
+			// register a global handler on the document.
+
+			activeDocHandlers[ eventType ] = ( activeDocHandlers[ eventType ] || 0 ) + 1;
+
+			if ( activeDocHandlers[ eventType ] === 1 ) {
+				$document.bind( realType, mouseEventCallback );
+			}
+
+			// Some browsers, like Opera Mini, won't dispatch mouse/click events
+			// for elements unless they actually have handlers registered on them.
+			// To get around this, we register dummy handlers on the elements.
+
+			$( this ).bind( realType, dummyMouseHandler );
+
+			// For now, if event capture is not supported, we rely on mouse handlers.
+			if ( eventCaptureSupported ) {
+				// If this is the first virtual mouse binding for the document,
+				// register our touchstart handler on the document.
+
+				activeDocHandlers[ "touchstart" ] = ( activeDocHandlers[ "touchstart" ] || 0) + 1;
+
+				if (activeDocHandlers[ "touchstart" ] === 1) {
+					$document.bind( "touchstart", handleTouchStart )
+						.bind( "touchend", handleTouchEnd )
+
+						// On touch platforms, touching the screen and then dragging your finger
+						// causes the window content to scroll after some distance threshold is
+						// exceeded. On these platforms, a scroll prevents a click event from being
+						// dispatched, and on some platforms, even the touchend is suppressed. To
+						// mimic the suppression of the click event, we need to watch for a scroll
+						// event. Unfortunately, some platforms like iOS don't dispatch scroll
+						// events until *AFTER* the user lifts their finger (touchend). This means
+						// we need to watch both scroll and touchmove events to figure out whether
+						// or not a scroll happenens before the touchend event is fired.
+
+						.bind( "touchmove", handleTouchMove )
+						.bind( "scroll", handleScroll );
+				}
+			}
+		},
+
+		teardown: function( data, namespace ) {
+			// If this is the last virtual binding for this eventType,
+			// remove its global handler from the document.
+
+			--activeDocHandlers[ eventType ];
+
+			if ( !activeDocHandlers[ eventType ] ) {
+				$document.unbind( realType, mouseEventCallback );
+			}
+
+			if ( eventCaptureSupported ) {
+				// If this is the last virtual mouse binding in existence,
+				// remove our document touchstart listener.
+
+				--activeDocHandlers[ "touchstart" ];
+
+				if ( !activeDocHandlers[ "touchstart" ] ) {
+					$document.unbind( "touchstart", handleTouchStart )
+						.unbind( "touchmove", handleTouchMove )
+						.unbind( "touchend", handleTouchEnd )
+						.unbind( "scroll", handleScroll );
+				}
+			}
+
+			var $this = $( this ),
+				bindings = $.data( this, dataPropertyName );
+
+			// teardown may be called when an element was
+			// removed from the DOM. If this is the case,
+			// jQuery core may have already stripped the element
+			// of any data bindings so we need to check it before
+			// using it.
+			if ( bindings ) {
+				bindings[ eventType ] = false;
+			}
+
+			// Unregister the dummy event handler.
+
+			$this.unbind( realType, dummyMouseHandler );
+
+			// If this is the last virtual mouse binding on the
+			// element, remove the binding data from the element.
+
+			if ( !hasVirtualBindings( this ) ) {
+				$this.removeData( dataPropertyName );
+			}
+		}
+	};
+}
+
+// Expose our custom events to the jQuery bind/unbind mechanism.
+
+for ( var i = 0; i < virtualEventNames.length; i++ ){
+	$.event.special[ virtualEventNames[ i ] ] = getSpecialEventObject( virtualEventNames[ i ] );
+}
+
+// Add a capture click handler to block clicks.
+// Note that we require event capture support for this so if the device
+// doesn't support it, we punt for now and rely solely on mouse events.
+if ( eventCaptureSupported ) {
+	document.addEventListener( "click", function( e ){
+		var cnt = clickBlockList.length,
+			target = e.target,
+			x, y, ele, i, o, touchID;
+
+		if ( cnt ) {
+			x = e.clientX;
+			y = e.clientY;
+			threshold = $.vmouse.clickDistanceThreshold;
+
+			// The idea here is to run through the clickBlockList to see if
+			// the current click event is in the proximity of one of our
+			// vclick events that had preventDefault() called on it. If we find
+			// one, then we block the click.
+			//
+			// Why do we have to rely on proximity?
+			//
+			// Because the target of the touch event that triggered the vclick
+			// can be different from the target of the click event synthesized
+			// by the browser. The target of a mouse/click event that is syntehsized
+			// from a touch event seems to be implementation specific. For example,
+			// some browsers will fire mouse/click events for a link that is near
+			// a touch event, even though the target of the touchstart/touchend event
+			// says the user touched outside the link. Also, it seems that with most
+			// browsers, the target of the mouse/click event is not calculated until the
+			// time it is dispatched, so if you replace an element that you touched
+			// with another element, the target of the mouse/click will be the new
+			// element underneath that point.
+			//
+			// Aside from proximity, we also check to see if the target and any
+			// of its ancestors were the ones that blocked a click. This is necessary
+			// because of the strange mouse/click target calculation done in the
+			// Android 2.1 browser, where if you click on an element, and there is a
+			// mouse/click handler on one of its ancestors, the target will be the
+			// innermost child of the touched element, even if that child is no where
+			// near the point of touch.
+
+			ele = target;
+
+			while ( ele ) {
+				for ( i = 0; i < cnt; i++ ) {
+					o = clickBlockList[ i ];
+					touchID = 0;
+
+					if ( ( ele === target && Math.abs( o.x - x ) < threshold && Math.abs( o.y - y ) < threshold ) ||
+								$.data( ele, touchTargetPropertyName ) === o.touchID ) {
+						// XXX: We may want to consider removing matches from the block list
+						//      instead of waiting for the reset timer to fire.
+						e.preventDefault();
+						e.stopPropagation();
+						return;
+					}
+				}
+				ele = ele.parentNode;
+			}
+		}
+	}, true);
+}
+})( jQuery, window, document );
+/* 
+* "events" plugin - Handles events
+*/
+
+(function( $, window, undefined ) {
+
+// add new event shortcuts
+$.each( ( "touchstart touchmove touchend orientationchange throttledresize " +
+					"tap taphold swipe swipeleft swiperight scrollstart scrollstop" ).split( " " ), function( i, name ) {
+
+	$.fn[ name ] = function( fn ) {
+		return fn ? this.bind( name, fn ) : this.trigger( name );
+	};
+
+	$.attrFn[ name ] = true;
+});
+
+var supportTouch = $.support.touch,
+	scrollEvent = "touchmove scroll",
+	touchStartEvent = supportTouch ? "touchstart" : "mousedown",
+	touchStopEvent = supportTouch ? "touchend" : "mouseup",
+	touchMoveEvent = supportTouch ? "touchmove" : "mousemove";
+
+function triggerCustomEvent( obj, eventType, event ) {
+	var originalType = event.type;
+	event.type = eventType;
+
+	// event.liveFired is already set by basic events e.g. vclick,
+	// which is fired already.
+	// To fire this custom event, event.liveFired must be cleared.
+	event.liveFired = undefined;
+
+	$.event.handle.call( obj, event );
+	event.type = originalType;
+}
+
+// also handles scrollstop
+$.event.special.scrollstart = {
+
+	enabled: true,
+
+	setup: function() {
+
+		var thisObject = this,
+			$this = $( thisObject ),
+			scrolling,
+			timer;
+
+		function trigger( event, state ) {
+			scrolling = state;
+			triggerCustomEvent( thisObject, scrolling ? "scrollstart" : "scrollstop", event );
+		}
+
+		// iPhone triggers scroll after a small delay; use touchmove instead
+		$this.bind( scrollEvent, function( event ) {
+
+			if ( !$.event.special.scrollstart.enabled ) {
+				return;
+			}
+
+			if ( !scrolling ) {
+				trigger( event, true );
+			}
+
+			clearTimeout( timer );
+			timer = setTimeout(function() {
+				trigger( event, false );
+			}, 50 );
+		});
+	}
+};
+
+// also handles taphold
+$.event.special.tap = {
+	setup: function() {
+		var thisObject = this,
+			$this = $( thisObject );
+
+		$this.bind( "vmousedown", function( event ) {
+
+			if ( event.which && event.which !== 1 ) {
+				return false;
+			}
+
+			var origTarget = event.target,
+				origEvent = event.originalEvent,
+				timer;
+
+			function clearTapTimer() {
+				clearTimeout( timer );
+			}
+
+			function clearTapHandlers() {
+				clearTapTimer();
+
+				$this.unbind( "vclick", clickHandler )
+					.unbind( "vmouseup", clearTapTimer )
+					.unbind( "vmousecancel", clearTapHandlers );
+			}
+
+			function clickHandler(event) {
+				clearTapHandlers();
+
+				// ONLY trigger a 'tap' event if the start target is
+				// the same as the stop target.
+				if ( origTarget == event.target ) {
+					triggerCustomEvent( thisObject, "tap", event );
+				}
+			}
+
+			$this.bind( "vmousecancel", clearTapHandlers )
+				.bind( "vmouseup", clearTapTimer )
+				.bind( "vclick", clickHandler );
+
+			timer = setTimeout(function() {
+					triggerCustomEvent( thisObject, "taphold", $.Event( "taphold" ) );
+			}, 750 );
+		});
+	}
+};
+
+// also handles swipeleft, swiperight
+$.event.special.swipe = {
+	scrollSupressionThreshold: 10, // More than this horizontal displacement, and we will suppress scrolling.
+
+	durationThreshold: 1000, // More time than this, and it isn't a swipe.
+
+	horizontalDistanceThreshold: 30,  // Swipe horizontal displacement must be more than this.
+
+	verticalDistanceThreshold: 75,  // Swipe vertical displacement must be less than this.
+
+	setup: function() {
+		var thisObject = this,
+			$this = $( thisObject );
+
+		$this.bind( touchStartEvent, function( event ) {
+			var data = event.originalEvent.touches ?
+								event.originalEvent.touches[ 0 ] : event,
+				start = {
+					time: ( new Date() ).getTime(),
+					coords: [ data.pageX, data.pageY ],
+					origin: $( event.target )
+				},
+				stop;
+
+			function moveHandler( event ) {
+
+				if ( !start ) {
+					return;
+				}
+
+				var data = event.originalEvent.touches ?
+						event.originalEvent.touches[ 0 ] : event;
+
+				stop = {
+					time: ( new Date() ).getTime(),
+					coords: [ data.pageX, data.pageY ]
+				};
+
+				// prevent scrolling
+				if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
+					event.preventDefault();
+				}
+			}
+
+			$this.bind( touchMoveEvent, moveHandler )
+				.one( touchStopEvent, function( event ) {
+					$this.unbind( touchMoveEvent, moveHandler );
+
+					if ( start && stop ) {
+						if ( stop.time - start.time < $.event.special.swipe.durationThreshold &&
+								Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold &&
+								Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) {
+
+							start.origin.trigger( "swipe" )
+								.trigger( start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight" );
+						}
+					}
+					start = stop = undefined;
+				});
+		});
+	}
+};
+
+(function( $, window ) {
+	// "Cowboy" Ben Alman
+
+	var win = $( window ),
+		special_event,
+		get_orientation,
+		last_orientation;
+
+	$.event.special.orientationchange = special_event = {
+		setup: function() {
+			// If the event is supported natively, return false so that jQuery
+			// will bind to the event using DOM methods.
+			if ( $.support.orientation && $.mobile.orientationChangeEnabled ) {
+				return false;
+			}
+
+			// Get the current orientation to avoid initial double-triggering.
+			last_orientation = get_orientation();
+
+			// Because the orientationchange event doesn't exist, simulate the
+			// event by testing window dimensions on resize.
+			win.bind( "throttledresize", handler );
+		},
+		teardown: function(){
+			// If the event is not supported natively, return false so that
+			// jQuery will unbind the event using DOM methods.
+			if ( $.support.orientation && $.mobile.orientationChangeEnabled ) {
+				return false;
+			}
+
+			// Because the orientationchange event doesn't exist, unbind the
+			// resize event handler.
+			win.unbind( "throttledresize", handler );
+		},
+		add: function( handleObj ) {
+			// Save a reference to the bound event handler.
+			var old_handler = handleObj.handler;
+
+
+			handleObj.handler = function( event ) {
+				// Modify event object, adding the .orientation property.
+				event.orientation = get_orientation();
+
+				// Call the originally-bound event handler and return its result.
+				return old_handler.apply( this, arguments );
+			};
+		}
+	};
+
+	// If the event is not supported natively, this handler will be bound to
+	// the window resize event to simulate the orientationchange event.
+	function handler() {
+		// Get the current orientation.
+		var orientation = get_orientation();
+
+		if ( orientation !== last_orientation ) {
+			// The orientation has changed, so trigger the orientationchange event.
+			last_orientation = orientation;
+			win.trigger( "orientationchange" );
+		}
+	}
+
+	// Get the current page orientation. This method is exposed publicly, should it
+	// be needed, as jQuery.event.special.orientationchange.orientation()
+	$.event.special.orientationchange.orientation = get_orientation = function() {
+		var isPortrait = true, elem = document.documentElement;
+
+		// prefer window orientation to the calculation based on screensize as
+		// the actual screen resize takes place before or after the orientation change event
+		// has been fired depending on implementation (eg android 2.3 is before, iphone after).
+		// More testing is required to determine if a more reliable method of determining the new screensize
+		// is possible when orientationchange is fired. (eg, use media queries + element + opacity)
+		if ( $.support.orientation ) {
+			// if the window orientation registers as 0 or 180 degrees report
+			// portrait, otherwise landscape
+			isPortrait = window.orientation % 180 == 0;
+		} else {
+			isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;
+		}
+
+		return isPortrait ? "portrait" : "landscape";
+	};
+
+})( jQuery, window );
+
+
+// throttled resize event
+(function() {
+
+	$.event.special.throttledresize = {
+		setup: function() {
+			$( this ).bind( "resize", handler );
+		},
+		teardown: function(){
+			$( this ).unbind( "resize", handler );
+		}
+	};
+
+	var throttle = 250,
+		handler = function() {
+			curr = ( new Date() ).getTime();
+			diff = curr - lastCall;
+
+			if ( diff >= throttle ) {
+
+				lastCall = curr;
+				$( this ).trigger( "throttledresize" );
+
+			} else {
+
+				if ( heldCall ) {
+					clearTimeout( heldCall );
+				}
+
+				// Promise a held call will still execute
+				heldCall = setTimeout( handler, throttle - diff );
+			}
+		},
+		lastCall = 0,
+		heldCall,
+		curr,
+		diff;
+})();
+
+
+$.each({
+	scrollstop: "scrollstart",
+	taphold: "tap",
+	swipeleft: "swipe",
+	swiperight: "swipe"
+}, function( event, sourceEvent ) {
+
+	$.event.special[ event ] = {
+		setup: function() {
+			$( this ).bind( sourceEvent, $.noop );
+		}
+	};
+});
+
+})( jQuery, this );
+// Script: jQuery hashchange event
+// 
+// *Version: 1.3, Last updated: 7/21/2010*
+// 
+// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
+// GitHub       - http://github.com/cowboy/jquery-hashchange/
+// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
+// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
+// 
+// About: License
+// 
+// Copyright (c) 2010 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// These working examples, complete with fully commented code, illustrate a few
+// ways in which this plugin can be used.
+// 
+// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
+// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
+// 
+// About: Support and Testing
+// 
+// Information about what version or versions of jQuery this plugin has been
+// tested with, what browsers it has been tested in, and where the unit tests
+// reside (so you can test it yourself).
+// 
+// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
+//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
+// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
+// 
+// About: Known issues
+// 
+// While this jQuery hashchange event implementation is quite stable and
+// robust, there are a few unfortunate browser bugs surrounding expected
+// hashchange event-based behaviors, independent of any JavaScript
+// window.onhashchange abstraction. See the following examples for more
+// information:
+// 
+// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
+// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
+// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
+// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
+// 
+// Also note that should a browser natively support the window.onhashchange 
+// event, but not report that it does, the fallback polling loop will be used.
+// 
+// About: Release History
+// 
+// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
+//         "removable" for mobile-only development. Added IE6/7 document.title
+//         support. Attempted to make Iframe as hidden as possible by using
+//         techniques from http://www.paciellogroup.com/blog/?p=604. Added 
+//         support for the "shortcut" format $(window).hashchange( fn ) and
+//         $(window).hashchange() like jQuery provides for built-in events.
+//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
+//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
+//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
+//         file to address access denied issues when setting document.domain in
+//         IE6/7.
+// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
+//         from a page on another domain would cause an error in Safari 4. Also,
+//         IE6/7 Iframe is now inserted after the body (this actually works),
+//         which prevents the page from scrolling when the event is first bound.
+//         Event can also now be bound before DOM ready, but it won't be usable
+//         before then in IE6/7.
+// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
+//         where browser version is incorrectly reported as 8.0, despite
+//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
+// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
+//         window.onhashchange functionality into a separate plugin for users
+//         who want just the basic event & back button support, without all the
+//         extra awesomeness that BBQ provides. This plugin will be included as
+//         part of jQuery BBQ, but also be available separately.
+
+(function($,window,undefined){
+  '$:nomunge'; // Used by YUI compressor.
+  
+  // Reused string.
+  var str_hashchange = 'hashchange',
+    
+    // Method / object references.
+    doc = document,
+    fake_onhashchange,
+    special = $.event.special,
+    
+    // Does the browser support window.onhashchange? Note that IE8 running in
+    // IE7 compatibility mode reports true for 'onhashchange' in window, even
+    // though the event isn't supported, so also test document.documentMode.
+    doc_mode = doc.documentMode,
+    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
+  
+  // Get location.hash (or what you'd expect location.hash to be) sans any
+  // leading #. Thanks for making this necessary, Firefox!
+  function get_fragment( url ) {
+    url = url || location.href;
+    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
+  };
+  
+  // Method: jQuery.fn.hashchange
+  // 
+  // Bind a handler to the window.onhashchange event or trigger all bound
+  // window.onhashchange event handlers. This behavior is consistent with
+  // jQuery's built-in event handlers.
+  // 
+  // Usage:
+  // 
+  // > jQuery(window).hashchange( [ handler ] );
+  // 
+  // Arguments:
+  // 
+  //  handler - (Function) Optional handler to be bound to the hashchange
+  //    event. This is a "shortcut" for the more verbose form:
+  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
+  //    all bound window.onhashchange event handlers will be triggered. This
+  //    is a shortcut for the more verbose
+  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
+  //    the <hashchange event> section.
+  // 
+  // Returns:
+  // 
+  //  (jQuery) The initial jQuery collection of elements.
+  
+  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
+  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
+  $.fn[ str_hashchange ] = function( fn ) {
+    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
+  };
+  
+  // Property: jQuery.fn.hashchange.delay
+  // 
+  // The numeric interval (in milliseconds) at which the <hashchange event>
+  // polling loop executes. Defaults to 50.
+  
+  // Property: jQuery.fn.hashchange.domain
+  // 
+  // If you're setting document.domain in your JavaScript, and you want hash
+  // history to work in IE6/7, not only must this property be set, but you must
+  // also set document.domain BEFORE jQuery is loaded into the page. This
+  // property is only applicable if you are supporting IE6/7 (or IE8 operating
+  // in "IE7 compatibility" mode).
+  // 
+  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
+  // path of the included "document-domain.html" file, which can be renamed or
+  // modified if necessary (note that the document.domain specified must be the
+  // same in both your main JavaScript as well as in this file).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.domain = document.domain;
+  
+  // Property: jQuery.fn.hashchange.src
+  // 
+  // If, for some reason, you need to specify an Iframe src file (for example,
+  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
+  // do so using this property. Note that when using this property, history
+  // won't be recorded in IE6/7 until the Iframe src file loads. This property
+  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
+  // compatibility" mode).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.src = 'path/to/file.html';
+  
+  $.fn[ str_hashchange ].delay = 50;
+  /*
+  $.fn[ str_hashchange ].domain = null;
+  $.fn[ str_hashchange ].src = null;
+  */
+  
+  // Event: hashchange event
+  // 
+  // Fired when location.hash changes. In browsers that support it, the native
+  // HTML5 window.onhashchange event is used, otherwise a polling loop is
+  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
+  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
+  // compatibility" mode), a hidden Iframe is created to allow the back button
+  // and hash-based history to work.
+  // 
+  // Usage as described in <jQuery.fn.hashchange>:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).hashchange( function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).hashchange();
+  // 
+  // A more verbose usage that allows for event namespacing:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).bind( 'hashchange', function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).trigger( 'hashchange' );
+  // 
+  // Additional Notes:
+  // 
+  // * The polling loop and Iframe are not created until at least one handler
+  //   is actually bound to the 'hashchange' event.
+  // * If you need the bound handler(s) to execute immediately, in cases where
+  //   a location.hash exists on page load, via bookmark or page refresh for
+  //   example, use jQuery(window).hashchange() or the more verbose 
+  //   jQuery(window).trigger( 'hashchange' ).
+  // * The event can be bound before DOM ready, but since it won't be usable
+  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
+  //   to bind it inside a DOM ready handler.
+  
+  // Override existing $.event.special.hashchange methods (allowing this plugin
+  // to be defined after jQuery BBQ in BBQ's source code).
+  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
+    
+    // Called only when the first 'hashchange' event is bound to window.
+    setup: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to create our own. And we don't want to call this
+      // until the user binds to the event, just in case they never do, since it
+      // will create a polling loop and possibly even a hidden Iframe.
+      $( fake_onhashchange.start );
+    },
+    
+    // Called only when the last 'hashchange' event is unbound from window.
+    teardown: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to stop ours (if possible).
+      $( fake_onhashchange.stop );
+    }
+    
+  });
+  
+  // fake_onhashchange does all the work of triggering the window.onhashchange
+  // event for browsers that don't natively support it, including creating a
+  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
+  // Iframe to enable back and forward.
+  fake_onhashchange = (function(){
+    var self = {},
+      timeout_id,
+      
+      // Remember the initial hash so it doesn't get triggered immediately.
+      last_hash = get_fragment(),
+      
+      fn_retval = function(val){ return val; },
+      history_set = fn_retval,
+      history_get = fn_retval;
+    
+    // Start the polling loop.
+    self.start = function() {
+      timeout_id || poll();
+    };
+    
+    // Stop the polling loop.
+    self.stop = function() {
+      timeout_id && clearTimeout( timeout_id );
+      timeout_id = undefined;
+    };
+    
+    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
+    // if location.hash has changed, and triggers the 'hashchange' event on
+    // window when necessary.
+    function poll() {
+      var hash = get_fragment(),
+        history_hash = history_get( last_hash );
+      
+      if ( hash !== last_hash ) {
+        history_set( last_hash = hash, history_hash );
+        
+        $(window).trigger( str_hashchange );
+        
+      } else if ( history_hash !== last_hash ) {
+        location.href = location.href.replace( /#.*/, '' ) + history_hash;
+      }
+      
+      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
+    };
+    
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    $.browser.msie && !supports_onhashchange && (function(){
+      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
+      // when running in "IE7 compatibility" mode.
+      
+      var iframe,
+        iframe_src;
+      
+      // When the event is bound and polling starts in IE 6/7, create a hidden
+      // Iframe for history handling.
+      self.start = function(){
+        if ( !iframe ) {
+          iframe_src = $.fn[ str_hashchange ].src;
+          iframe_src = iframe_src && iframe_src + get_fragment();
+          
+          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
+          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
+          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
+            
+            // When Iframe has completely loaded, initialize the history and
+            // start polling.
+            .one( 'load', function(){
+              iframe_src || history_set( get_fragment() );
+              poll();
+            })
+            
+            // Load Iframe src if specified, otherwise nothing.
+            .attr( 'src', iframe_src || 'javascript:0' )
+            
+            // Append Iframe after the end of the body to prevent unnecessary
+            // initial page scrolling (yes, this works).
+            .insertAfter( 'body' )[0].contentWindow;
+          
+          // Whenever `document.title` changes, update the Iframe's title to
+          // prettify the back/next history menu entries. Since IE sometimes
+          // errors with "Unspecified error" the very first time this is set
+          // (yes, very useful) wrap this with a try/catch block.
+          doc.onpropertychange = function(){
+            try {
+              if ( event.propertyName === 'title' ) {
+                iframe.document.title = doc.title;
+              }
+            } catch(e) {}
+          };
+          
+        }
+      };
+      
+      // Override the "stop" method since an IE6/7 Iframe was created. Even
+      // if there are no longer any bound event handlers, the polling loop
+      // is still necessary for back/next to work at all!
+      self.stop = fn_retval;
+      
+      // Get history by looking at the hidden Iframe's location.hash.
+      history_get = function() {
+        return get_fragment( iframe.location.href );
+      };
+      
+      // Set a new history item by opening and then closing the Iframe
+      // document, *then* setting its location.hash. If document.domain has
+      // been set, update that as well.
+      history_set = function( hash, history_hash ) {
+        var iframe_doc = iframe.document,
+          domain = $.fn[ str_hashchange ].domain;
+        
+        if ( hash !== history_hash ) {
+          // Update Iframe with any initial `document.title` that might be set.
+          iframe_doc.title = doc.title;
+          
+          // Opening the Iframe's document after it has been closed is what
+          // actually adds a history entry.
+          iframe_doc.open();
+          
+          // Set document.domain for the Iframe document as well, if necessary.
+          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
+          
+          iframe_doc.close();
+          
+          // Update the Iframe's hash, for great justice.
+          iframe.location.hash = hash;
+        }
+      };
+      
+    })();
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    
+    return self;
+  })();
+  
+})(jQuery,this);
+/*
+* "page" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.page", $.mobile.widget, {
+	options: {
+		theme: "c",
+		domCache: false,
+		keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')"
+	},
+
+	_create: function() {
+
+		this._trigger( "beforecreate" );
+
+		this.element
+			.attr( "tabindex", "0" )
+			.addClass( "ui-page ui-body-" + this.options.theme );
+	},
+
+	keepNativeSelector: function() {
+		var options = this.options,
+			keepNativeDefined = options.keepNative && $.trim(options.keepNative);
+
+		if( keepNativeDefined && options.keepNative !== options.keepNativeDefault ){
+			return [options.keepNative, options.keepNativeDefault].join(", ");
+		}
+
+		return options.keepNativeDefault;
+	}
+});
+})( jQuery );
+/* 
+* "core" - The base file for jQm
+*/
+
+(function( $, window, undefined ) {
+
+	var nsNormalizeDict = {};
+
+	// jQuery.mobile configurable options
+	$.extend( $.mobile, {
+
+		// Namespace used framework-wide for data-attrs. Default is no namespace
+		ns: "",
+
+		// Define the url parameter used for referencing widget-generated sub-pages.
+		// Translates to to example.html&ui-page=subpageIdentifier
+		// hash segment before &ui-page= is used to make Ajax request
+		subPageUrlKey: "ui-page",
+
+		// Class assigned to page currently in view, and during transitions
+		activePageClass: "ui-page-active",
+
+		// Class used for "active" button state, from CSS framework
+		activeBtnClass: "ui-btn-active",
+
+		// Automatically handle clicks and form submissions through Ajax, when same-domain
+		ajaxEnabled: true,
+
+		// Automatically load and show pages based on location.hash
+		hashListeningEnabled: true,
+
+		// disable to prevent jquery from bothering with links
+		linkBindingEnabled: true,
+
+		// Set default page transition - 'none' for no transitions
+		defaultPageTransition: "slide",
+
+		// Minimum scroll distance that will be remembered when returning to a page
+		minScrollBack: 250,
+
+		// Set default dialog transition - 'none' for no transitions
+		defaultDialogTransition: "pop",
+
+		// Show loading message during Ajax requests
+		// if false, message will not appear, but loading classes will still be toggled on html el
+		loadingMessage: "loading",
+
+		// Error response message - appears when an Ajax page request fails
+		pageLoadErrorMessage: "Error Loading Page",
+
+		//automatically initialize the DOM when it's ready
+		autoInitializePage: true,
+
+		pushStateEnabled: true,
+
+		// turn of binding to the native orientationchange due to android orientation behavior
+		orientationChangeEnabled: true,
+
+		// Support conditions that must be met in order to proceed
+		// default enhanced qualifications are media query support OR IE 7+
+		gradeA: function(){
+			return $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7;
+		},
+
+		// TODO might be useful upstream in jquery itself ?
+		keyCode: {
+			ALT: 18,
+			BACKSPACE: 8,
+			CAPS_LOCK: 20,
+			COMMA: 188,
+			COMMAND: 91,
+			COMMAND_LEFT: 91, // COMMAND
+			COMMAND_RIGHT: 93,
+			CONTROL: 17,
+			DELETE: 46,
+			DOWN: 40,
+			END: 35,
+			ENTER: 13,
+			ESCAPE: 27,
+			HOME: 36,
+			INSERT: 45,
+			LEFT: 37,
+			MENU: 93, // COMMAND_RIGHT
+			NUMPAD_ADD: 107,
+			NUMPAD_DECIMAL: 110,
+			NUMPAD_DIVIDE: 111,
+			NUMPAD_ENTER: 108,
+			NUMPAD_MULTIPLY: 106,
+			NUMPAD_SUBTRACT: 109,
+			PAGE_DOWN: 34,
+			PAGE_UP: 33,
+			PERIOD: 190,
+			RIGHT: 39,
+			SHIFT: 16,
+			SPACE: 32,
+			TAB: 9,
+			UP: 38,
+			WINDOWS: 91 // COMMAND
+		},
+
+		// Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value
+		silentScroll: function( ypos ) {
+			if ( $.type( ypos ) !== "number" ) {
+				ypos = $.mobile.defaultHomeScroll;
+			}
+
+			// prevent scrollstart and scrollstop events
+			$.event.special.scrollstart.enabled = false;
+
+			setTimeout(function() {
+				window.scrollTo( 0, ypos );
+				$( document ).trigger( "silentscroll", { x: 0, y: ypos });
+			}, 20 );
+
+			setTimeout(function() {
+				$.event.special.scrollstart.enabled = true;
+			}, 150 );
+		},
+
+		// Expose our cache for testing purposes.
+		nsNormalizeDict: nsNormalizeDict,
+
+		// Take a data attribute property, prepend the namespace
+		// and then camel case the attribute string. Add the result
+		// to our nsNormalizeDict so we don't have to do this again.
+		nsNormalize: function( prop ) {
+			if ( !prop ) {
+				return;
+			}
+
+			return nsNormalizeDict[ prop ] || ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) );
+		},
+
+		getInheritedTheme: function( el, defaultTheme ) {
+
+			// Find the closest parent with a theme class on it. Note that
+			// we are not using $.fn.closest() on purpose here because this
+			// method gets called quite a bit and we need it to be as fast
+			// as possible.
+
+			var e = el[ 0 ],
+				ltr = "",
+				re = /ui-(bar|body)-([a-z])\b/,
+				c, m;
+
+			while ( e ) {
+				var c = e.className || "";
+				if ( ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) {
+					// We found a parent with a theme class
+					// on it so bail from this loop.
+					break;
+				}
+				e = e.parentNode;
+			}
+			
+			// Return the theme letter we found, if none, return the
+			// specified default.
+
+			return ltr || defaultTheme || "a";
+		}
+	});
+
+	// Mobile version of data and removeData and hasData methods
+	// ensures all data is set and retrieved using jQuery Mobile's data namespace
+	$.fn.jqmData = function( prop, value ) {
+		var result;
+		if ( typeof prop != "undefined" ) {
+			result = this.data( prop ? $.mobile.nsNormalize( prop ) : prop, value );
+		}
+		return result;
+	};
+
+	$.jqmData = function( elem, prop, value ) {
+		var result;
+		if ( typeof prop != "undefined" ) {
+			result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value );
+		}
+		return result;
+	};
+
+	$.fn.jqmRemoveData = function( prop ) {
+		return this.removeData( $.mobile.nsNormalize( prop ) );
+	};
+
+	$.jqmRemoveData = function( elem, prop ) {
+		return $.removeData( elem, $.mobile.nsNormalize( prop ) );
+	};
+
+	$.fn.removeWithDependents = function() {
+		$.removeWithDependents( this );
+	};
+
+	$.removeWithDependents = function( elem ) {
+		var $elem = $( elem );
+
+		( $elem.jqmData('dependents') || $() ).remove();
+		$elem.remove();
+	};
+
+	$.fn.addDependents = function( newDependents ) {
+		$.addDependents( $(this), newDependents );
+	};
+
+	$.addDependents = function( elem, newDependents ) {
+		var dependents = $(elem).jqmData( 'dependents' ) || $();
+
+		$(elem).jqmData( 'dependents', $.merge(dependents, newDependents) );
+	};
+
+	// note that this helper doesn't attempt to handle the callback
+	// or setting of an html elements text, its only purpose is
+	// to return the html encoded version of the text in all cases. (thus the name)
+	$.fn.getEncodedText = function() {
+		return $( "<div/>" ).text( $(this).text() ).html();
+	};
+
+	// Monkey-patching Sizzle to filter the :jqmData selector
+	var oldFind = $.find,
+		jqmDataRE = /:jqmData\(([^)]*)\)/g;
+
+	$.find = function( selector, context, ret, extra ) {
+		selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" );
+
+		return oldFind.call( this, selector, context, ret, extra );
+	};
+
+	$.extend( $.find, oldFind );
+
+	$.find.matches = function( expr, set ) {
+		return $.find( expr, null, null, set );
+	};
+
+	$.find.matchesSelector = function( node, expr ) {
+		return $.find( expr, null, null, [ node ] ).length > 0;
+	};
+})( jQuery, this );
+
+/*
+* core utilities for auto ajax navigation, base tag mgmt,
+*/
+
+( function( $, undefined ) {
+
+	//define vars for interal use
+	var $window = $( window ),
+		$html = $( 'html' ),
+		$head = $( 'head' ),
+
+		//url path helpers for use in relative url management
+		path = {
+
+			// This scary looking regular expression parses an absolute URL or its relative
+			// variants (protocol, site, document, query, and hash), into the various
+			// components (protocol, host, path, query, fragment, etc that make up the
+			// URL as well as some other commonly used sub-parts. When used with RegExp.exec()
+			// or String.match, it parses the URL into a results array that looks like this:
+			//
+			//     [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content
+			//     [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread
+			//     [2]: http://jblas:password@mycompany.com:8080/mail/inbox
+			//     [3]: http://jblas:password@mycompany.com:8080
+			//     [4]: http:
+			//     [5]: //
+			//     [6]: jblas:password@mycompany.com:8080
+			//     [7]: jblas:password
+			//     [8]: jblas
+			//     [9]: password
+			//    [10]: mycompany.com:8080
+			//    [11]: mycompany.com
+			//    [12]: 8080
+			//    [13]: /mail/inbox
+			//    [14]: /mail/
+			//    [15]: inbox
+			//    [16]: ?msg=1234&type=unread
+			//    [17]: #msg-content
+			//
+			urlParseRE: /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
+
+			//Parse a URL into a structure that allows easy access to
+			//all of the URL components by name.
+			parseUrl: function( url ) {
+				// If we're passed an object, we'll assume that it is
+				// a parsed url object and just return it back to the caller.
+				if ( $.type( url ) === "object" ) {
+					return url;
+				}
+
+				var matches = path.urlParseRE.exec( url || "" ) || [];
+
+					// Create an object that allows the caller to access the sub-matches
+					// by name. Note that IE returns an empty string instead of undefined,
+					// like all other browsers do, so we normalize everything so its consistent
+					// no matter what browser we're running on.
+					return {
+						href:         matches[  0 ] || "",
+						hrefNoHash:   matches[  1 ] || "",
+						hrefNoSearch: matches[  2 ] || "",
+						domain:       matches[  3 ] || "",
+						protocol:     matches[  4 ] || "",
+						doubleSlash:  matches[  5 ] || "",
+						authority:    matches[  6 ] || "",
+						username:     matches[  8 ] || "",
+						password:     matches[  9 ] || "",
+						host:         matches[ 10 ] || "",
+						hostname:     matches[ 11 ] || "",
+						port:         matches[ 12 ] || "",
+						pathname:     matches[ 13 ] || "",
+						directory:    matches[ 14 ] || "",
+						filename:     matches[ 15 ] || "",
+						search:       matches[ 16 ] || "",
+						hash:         matches[ 17 ] || ""
+					};
+			},
+
+			//Turn relPath into an asbolute path. absPath is
+			//an optional absolute path which describes what
+			//relPath is relative to.
+			makePathAbsolute: function( relPath, absPath ) {
+				if ( relPath && relPath.charAt( 0 ) === "/" ) {
+					return relPath;
+				}
+
+				relPath = relPath || "";
+				absPath = absPath ? absPath.replace( /^\/|(\/[^\/]*|[^\/]+)$/g, "" ) : "";
+
+				var absStack = absPath ? absPath.split( "/" ) : [],
+					relStack = relPath.split( "/" );
+				for ( var i = 0; i < relStack.length; i++ ) {
+					var d = relStack[ i ];
+					switch ( d ) {
+						case ".":
+							break;
+						case "..":
+							if ( absStack.length ) {
+								absStack.pop();
+							}
+							break;
+						default:
+							absStack.push( d );
+							break;
+					}
+				}
+				return "/" + absStack.join( "/" );
+			},
+
+			//Returns true if both urls have the same domain.
+			isSameDomain: function( absUrl1, absUrl2 ) {
+				return path.parseUrl( absUrl1 ).domain === path.parseUrl( absUrl2 ).domain;
+			},
+
+			//Returns true for any relative variant.
+			isRelativeUrl: function( url ) {
+				// All relative Url variants have one thing in common, no protocol.
+				return path.parseUrl( url ).protocol === "";
+			},
+
+			//Returns true for an absolute url.
+			isAbsoluteUrl: function( url ) {
+				return path.parseUrl( url ).protocol !== "";
+			},
+
+			//Turn the specified realtive URL into an absolute one. This function
+			//can handle all relative variants (protocol, site, document, query, fragment).
+			makeUrlAbsolute: function( relUrl, absUrl ) {
+				if ( !path.isRelativeUrl( relUrl ) ) {
+					return relUrl;
+				}
+
+				var relObj = path.parseUrl( relUrl ),
+					absObj = path.parseUrl( absUrl ),
+					protocol = relObj.protocol || absObj.protocol,
+					doubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ),
+					authority = relObj.authority || absObj.authority,
+					hasPath = relObj.pathname !== "",
+					pathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ),
+					search = relObj.search || ( !hasPath && absObj.search ) || "",
+					hash = relObj.hash;
+
+				return protocol + doubleSlash + authority + pathname + search + hash;
+			},
+
+			//Add search (aka query) params to the specified url.
+			addSearchParams: function( url, params ) {
+				var u = path.parseUrl( url ),
+					p = ( typeof params === "object" ) ? $.param( params ) : params,
+					s = u.search || "?";
+				return u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== "?" ? "&" : "" ) + p + ( u.hash || "" );
+			},
+
+			convertUrlToDataUrl: function( absUrl ) {
+				var u = path.parseUrl( absUrl );
+				if ( path.isEmbeddedPage( u ) ) {
+				    // For embedded pages, remove the dialog hash key as in getFilePath(),
+				    // otherwise the Data Url won't match the id of the embedded Page.
+					return u.hash.split( dialogHashKey )[0].replace( /^#/, "" );
+				} else if ( path.isSameDomain( u, documentBase ) ) {
+					return u.hrefNoHash.replace( documentBase.domain, "" );
+				}
+				return absUrl;
+			},
+
+			//get path from current hash, or from a file path
+			get: function( newPath ) {
+				if( newPath === undefined ) {
+					newPath = location.hash;
+				}
+				return path.stripHash( newPath ).replace( /[^\/]*\.[^\/*]+$/, '' );
+			},
+
+			//return the substring of a filepath before the sub-page key, for making a server request
+			getFilePath: function( path ) {
+				var splitkey = '&' + $.mobile.subPageUrlKey;
+				return path && path.split( splitkey )[0].split( dialogHashKey )[0];
+			},
+
+			//set location hash to path
+			set: function( path ) {
+				location.hash = path;
+			},
+
+			//test if a given url (string) is a path
+			//NOTE might be exceptionally naive
+			isPath: function( url ) {
+				return ( /\// ).test( url );
+			},
+
+			//return a url path with the window's location protocol/hostname/pathname removed
+			clean: function( url ) {
+				return url.replace( documentBase.domain, "" );
+			},
+
+			//just return the url without an initial #
+			stripHash: function( url ) {
+				return url.replace( /^#/, "" );
+			},
+
+			//remove the preceding hash, any query params, and dialog notations
+			cleanHash: function( hash ) {
+				return path.stripHash( hash.replace( /\?.*$/, "" ).replace( dialogHashKey, "" ) );
+			},
+
+			//check whether a url is referencing the same domain, or an external domain or different protocol
+			//could be mailto, etc
+			isExternal: function( url ) {
+				var u = path.parseUrl( url );
+				return u.protocol && u.domain !== documentUrl.domain ? true : false;
+			},
+
+			hasProtocol: function( url ) {
+				return ( /^(:?\w+:)/ ).test( url );
+			},
+
+			//check if the specified url refers to the first page in the main application document.
+			isFirstPageUrl: function( url ) {
+				// We only deal with absolute paths.
+				var u = path.parseUrl( path.makeUrlAbsolute( url, documentBase ) ),
+
+					// Does the url have the same path as the document?
+					samePath = u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ),
+
+					// Get the first page element.
+					fp = $.mobile.firstPage,
+
+					// Get the id of the first page element if it has one.
+					fpId = fp && fp[0] ? fp[0].id : undefined;
+
+					// The url refers to the first page if the path matches the document and
+					// it either has no hash value, or the hash is exactly equal to the id of the
+					// first page element.
+					return samePath && ( !u.hash || u.hash === "#" || ( fpId && u.hash.replace( /^#/, "" ) === fpId ) );
+			},
+
+			isEmbeddedPage: function( url ) {
+				var u = path.parseUrl( url );
+
+				//if the path is absolute, then we need to compare the url against
+				//both the documentUrl and the documentBase. The main reason for this
+				//is that links embedded within external documents will refer to the
+				//application document, whereas links embedded within the application
+				//document will be resolved against the document base.
+				if ( u.protocol !== "" ) {
+					return ( u.hash && ( u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ) ) );
+				}
+				return (/^#/).test( u.href );
+			}
+		},
+
+		//will be defined when a link is clicked and given an active class
+		$activeClickedLink = null,
+
+		//urlHistory is purely here to make guesses at whether the back or forward button was clicked
+		//and provide an appropriate transition
+		urlHistory = {
+			// Array of pages that are visited during a single page load.
+			// Each has a url and optional transition, title, and pageUrl (which represents the file path, in cases where URL is obscured, such as dialogs)
+			stack: [],
+
+			//maintain an index number for the active page in the stack
+			activeIndex: 0,
+
+			//get active
+			getActive: function() {
+				return urlHistory.stack[ urlHistory.activeIndex ];
+			},
+
+			getPrev: function() {
+				return urlHistory.stack[ urlHistory.activeIndex - 1 ];
+			},
+
+			getNext: function() {
+				return urlHistory.stack[ urlHistory.activeIndex + 1 ];
+			},
+
+			// addNew is used whenever a new page is added
+			addNew: function( url, transition, title, pageUrl, role ) {
+				//if there's forward history, wipe it
+				if( urlHistory.getNext() ) {
+					urlHistory.clearForward();
+				}
+
+				urlHistory.stack.push( {url : url, transition: transition, title: title, pageUrl: pageUrl, role: role } );
+
+				urlHistory.activeIndex = urlHistory.stack.length - 1;
+			},
+
+			//wipe urls ahead of active index
+			clearForward: function() {
+				urlHistory.stack = urlHistory.stack.slice( 0, urlHistory.activeIndex + 1 );
+			},
+
+			directHashChange: function( opts ) {
+				var back , forward, newActiveIndex, prev = this.getActive();
+
+				// check if url isp in history and if it's ahead or behind current page
+				$.each( urlHistory.stack, function( i, historyEntry ) {
+
+					//if the url is in the stack, it's a forward or a back
+					if( opts.currentUrl === historyEntry.url ) {
+						//define back and forward by whether url is older or newer than current page
+						back = i < urlHistory.activeIndex;
+						forward = !back;
+						newActiveIndex = i;
+					}
+				});
+
+				// save new page index, null check to prevent falsey 0 result
+				this.activeIndex = newActiveIndex !== undefined ? newActiveIndex : this.activeIndex;
+
+				if( back ) {
+					( opts.either || opts.isBack )( true );
+				} else if( forward ) {
+					( opts.either || opts.isForward )( false );
+				}
+			},
+
+			//disable hashchange event listener internally to ignore one change
+			//toggled internally when location.hash is updated to match the url of a successful page load
+			ignoreNextHashChange: false
+		},
+
+		//define first selector to receive focus when a page is shown
+		focusable = "[tabindex],a,button:visible,select:visible,input",
+
+		//queue to hold simultanious page transitions
+		pageTransitionQueue = [],
+
+		//indicates whether or not page is in process of transitioning
+		isPageTransitioning = false,
+
+		//nonsense hash change key for dialogs, so they create a history entry
+		dialogHashKey = "&ui-state=dialog",
+
+		//existing base tag?
+		$base = $head.children( "base" ),
+
+		//tuck away the original document URL minus any fragment.
+		documentUrl = path.parseUrl( location.href ),
+
+		//if the document has an embedded base tag, documentBase is set to its
+		//initial value. If a base tag does not exist, then we default to the documentUrl.
+		documentBase = $base.length ? path.parseUrl( path.makeUrlAbsolute( $base.attr( "href" ), documentUrl.href ) ) : documentUrl,
+
+		//cache the comparison once.
+		documentBaseDiffers = ( documentUrl.hrefNoHash !== documentBase.hrefNoHash );
+
+		//base element management, defined depending on dynamic base tag support
+		var base = $.support.dynamicBaseTag ? {
+
+			//define base element, for use in routing asset urls that are referenced in Ajax-requested markup
+			element: ( $base.length ? $base : $( "<base>", { href: documentBase.hrefNoHash } ).prependTo( $head ) ),
+
+			//set the generated BASE element's href attribute to a new page's base path
+			set: function( href ) {
+				base.element.attr( "href", path.makeUrlAbsolute( href, documentBase ) );
+			},
+
+			//set the generated BASE element's href attribute to a new page's base path
+			reset: function() {
+				base.element.attr( "href", documentBase.hrefNoHash );
+			}
+
+		} : undefined;
+
+/*
+	internal utility functions
+--------------------------------------*/
+
+
+	//direct focus to the page title, or otherwise first focusable element
+	function reFocus( page ) {
+		var pageTitle = page.find( ".ui-title:eq(0)" );
+
+		if( pageTitle.length ) {
+			pageTitle.focus();
+		}
+		else{
+			page.focus();
+		}
+	}
+
+	//remove active classes after page transition or error
+	function removeActiveLinkClass( forceRemoval ) {
+		if( !!$activeClickedLink && ( !$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval ) ) {
+			$activeClickedLink.removeClass( $.mobile.activeBtnClass );
+		}
+		$activeClickedLink = null;
+	}
+
+	function releasePageTransitionLock() {
+		isPageTransitioning = false;
+		if( pageTransitionQueue.length > 0 ) {
+			$.mobile.changePage.apply( null, pageTransitionQueue.pop() );
+		}
+	}
+
+	// Save the last scroll distance per page, before it is hidden
+	var setLastScrollEnabled = true,
+		firstScrollElem, getScrollElem, setLastScroll, delayedSetLastScroll;
+
+	getScrollElem = function() {
+		var scrollElem = $window, activePage,
+			touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled;
+
+		if( touchOverflow ){
+			activePage = $( ".ui-page-active" );
+			scrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage;
+		}
+
+		return scrollElem;
+	};
+
+	setLastScroll = function( scrollElem ) {
+		// this barrier prevents setting the scroll value based on the browser
+		// scrolling the window based on a hashchange
+		if( !setLastScrollEnabled ) {
+			return;
+		}
+
+		var active = $.mobile.urlHistory.getActive();
+
+		if( active ) {
+			var lastScroll = scrollElem && scrollElem.scrollTop();
+
+			// Set active page's lastScroll prop.
+			// If the location we're scrolling to is less than minScrollBack, let it go.
+			active.lastScroll = lastScroll < $.mobile.minScrollBack ? $.mobile.defaultHomeScroll : lastScroll;
+		}
+	};
+
+	// bind to scrollstop to gather scroll position. The delay allows for the hashchange
+	// event to fire and disable scroll recording in the case where the browser scrolls
+	// to the hash targets location (sometimes the top of the page). once pagechange fires
+	// getLastScroll is again permitted to operate
+	delayedSetLastScroll = function() {
+		setTimeout( setLastScroll, 100, $(this) );
+	};
+
+	// disable an scroll setting when a hashchange has been fired, this only works
+	// because the recording of the scroll position is delayed for 100ms after
+	// the browser might have changed the position because of the hashchange
+	$window.bind( $.support.pushState ? "popstate" : "hashchange", function() {
+	 	setLastScrollEnabled = false;
+	});
+
+	// handle initial hashchange from chrome :(
+	$window.one( $.support.pushState ? "popstate" : "hashchange", function() {
+		setLastScrollEnabled = true;
+	});
+
+	// wait until the mobile page container has been determined to bind to pagechange
+	$window.one( "pagecontainercreate", function(){
+		// once the page has changed, re-enable the scroll recording
+		$.mobile.pageContainer.bind( "pagechange", function() {
+			var scrollElem = getScrollElem();
+
+	 		setLastScrollEnabled = true;
+
+			// remove any binding that previously existed on the get scroll
+			// which may or may not be different than the scroll element determined for
+			// this page previously
+			scrollElem.unbind( "scrollstop", delayedSetLastScroll );
+
+			// determine and bind to the current scoll element which may be the window
+			// or in the case of touch overflow the element with touch overflow
+			scrollElem.bind( "scrollstop", delayedSetLastScroll );
+		});
+	});
+
+	// bind to scrollstop for the first page as "pagechange" won't be fired in that case
+	getScrollElem().bind( "scrollstop", delayedSetLastScroll );
+
+	// Make the iOS clock quick-scroll work again if we're using native overflow scrolling
+	/*
+	if( $.support.touchOverflow ){
+		if( $.mobile.touchOverflowEnabled ){
+			$( window ).bind( "scrollstop", function(){
+				if( $( this ).scrollTop() === 0 ){
+					$.mobile.activePage.scrollTop( 0 );
+				}
+			});
+		}
+	}
+	*/
+
+	//function for transitioning between two existing pages
+	function transitionPages( toPage, fromPage, transition, reverse ) {
+
+		//get current scroll distance
+		var active	= $.mobile.urlHistory.getActive(),
+			touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled,
+			toScroll = active.lastScroll || ( touchOverflow ? 0 : $.mobile.defaultHomeScroll ),
+			screenHeight = getScreenHeight();
+
+		// Scroll to top, hide addr bar
+		window.scrollTo( 0, $.mobile.defaultHomeScroll );
+
+		if( fromPage ) {
+			//trigger before show/hide events
+			fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } );
+		}
+
+		if( !touchOverflow){
+			toPage.height( screenHeight + toScroll );
+		}
+
+		toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } );
+
+		//clear page loader
+		$.mobile.hidePageLoadingMsg();
+
+		if( touchOverflow && toScroll ){
+
+			toPage.addClass( "ui-mobile-pre-transition" );
+			// Send focus to page as it is now display: block
+			reFocus( toPage );
+
+			//set page's scrollTop to remembered distance
+			if( toPage.is( ".ui-native-fixed" ) ){
+				toPage.find( ".ui-content" ).scrollTop( toScroll );
+			}
+			else{
+				toPage.scrollTop( toScroll );
+			}
+		}
+
+		//find the transition handler for the specified transition. If there
+		//isn't one in our transitionHandlers dictionary, use the default one.
+		//call the handler immediately to kick-off the transition.
+		var th = $.mobile.transitionHandlers[transition || "none"] || $.mobile.defaultTransitionHandler,
+			promise = th( transition, reverse, toPage, fromPage );
+
+		promise.done(function() {
+			//reset toPage height back
+			if( !touchOverflow ){
+				toPage.height( "" );
+				// Send focus to the newly shown page
+				reFocus( toPage );
+			}
+
+			// Jump to top or prev scroll, sometimes on iOS the page has not rendered yet.
+			if( !touchOverflow ){
+				$.mobile.silentScroll( toScroll );
+			}
+
+			//trigger show/hide events
+			if( fromPage ) {
+				if( !touchOverflow ){
+					fromPage.height( "" );
+				}
+
+				fromPage.data( "page" )._trigger( "hide", null, { nextPage: toPage } );
+			}
+
+			//trigger pageshow, define prevPage as either fromPage or empty jQuery obj
+			toPage.data( "page" )._trigger( "show", null, { prevPage: fromPage || $( "" ) } );
+		});
+
+		return promise;
+	}
+
+	//simply set the active page's minimum height to screen height, depending on orientation
+	function getScreenHeight(){
+		var orientation 	= $.event.special.orientationchange.orientation(),
+			port			= orientation === "portrait",
+			winMin			= port ? 480 : 320,
+			screenHeight	= port ? screen.availHeight : screen.availWidth,
+			winHeight		= Math.max( winMin, $( window ).height() ),
+			pageMin			= Math.min( screenHeight, winHeight );
+
+		return pageMin;
+	}
+
+	$.mobile.getScreenHeight = getScreenHeight;
+
+	//simply set the active page's minimum height to screen height, depending on orientation
+	function resetActivePageHeight(){
+		// Don't apply this height in touch overflow enabled mode
+		if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){
+			return;
+		}
+		$( "." + $.mobile.activePageClass ).css( "min-height", getScreenHeight() );
+	}
+
+	//shared page enhancements
+	function enhancePage( $page, role ) {
+		// If a role was specified, make sure the data-role attribute
+		// on the page element is in sync.
+		if( role ) {
+			$page.attr( "data-" + $.mobile.ns + "role", role );
+		}
+
+		//run page plugin
+		$page.page();
+	}
+
+/* exposed $.mobile methods	 */
+
+	//animation complete callback
+	$.fn.animationComplete = function( callback ) {
+		if( $.support.cssTransitions ) {
+			return $( this ).one( 'webkitAnimationEnd', callback );
+		}
+		else{
+			// defer execution for consistency between webkit/non webkit
+			setTimeout( callback, 0 );
+			return $( this );
+		}
+	};
+
+	//expose path object on $.mobile
+	$.mobile.path = path;
+
+	//expose base object on $.mobile
+	$.mobile.base = base;
+
+	//history stack
+	$.mobile.urlHistory = urlHistory;
+
+	$.mobile.dialogHashKey = dialogHashKey;
+
+	//default non-animation transition handler
+	$.mobile.noneTransitionHandler = function( name, reverse, $toPage, $fromPage ) {
+		if ( $fromPage ) {
+			$fromPage.removeClass( $.mobile.activePageClass );
+		}
+		$toPage.addClass( $.mobile.activePageClass );
+
+		return $.Deferred().resolve( name, reverse, $toPage, $fromPage ).promise();
+	};
+
+	//default handler for unknown transitions
+	$.mobile.defaultTransitionHandler = $.mobile.noneTransitionHandler;
+
+	//transition handler dictionary for 3rd party transitions
+	$.mobile.transitionHandlers = {
+		none: $.mobile.defaultTransitionHandler
+	};
+
+	//enable cross-domain page support
+	$.mobile.allowCrossDomainPages = false;
+
+	//return the original document url
+	$.mobile.getDocumentUrl = function(asParsedObject) {
+		return asParsedObject ? $.extend( {}, documentUrl ) : documentUrl.href;
+	};
+
+	//return the original document base url
+	$.mobile.getDocumentBase = function(asParsedObject) {
+		return asParsedObject ? $.extend( {}, documentBase ) : documentBase.href;
+	};
+
+	$.mobile._bindPageRemove = function() {
+		var page = $(this);
+
+		// when dom caching is not enabled or the page is embedded bind to remove the page on hide
+		if( !page.data("page").options.domCache
+				&& page.is(":jqmData(external-page='true')") ) {
+
+			page.bind( 'pagehide.remove', function() {
+				var $this = $( this ),
+					prEvent = new $.Event( "pageremove" );
+
+				$this.trigger( prEvent );
+
+				if( !prEvent.isDefaultPrevented() ){
+					$this.removeWithDependents();
+				}
+			});
+		}
+	};
+
+	// Load a page into the DOM.
+	$.mobile.loadPage = function( url, options ) {
+		// This function uses deferred notifications to let callers
+		// know when the page is done loading, or if an error has occurred.
+		var deferred = $.Deferred(),
+
+			// The default loadPage options with overrides specified by
+			// the caller.
+			settings = $.extend( {}, $.mobile.loadPage.defaults, options ),
+
+			// The DOM element for the page after it has been loaded.
+			page = null,
+
+			// If the reloadPage option is true, and the page is already
+			// in the DOM, dupCachedPage will be set to the page element
+			// so that it can be removed after the new version of the
+			// page is loaded off the network.
+			dupCachedPage = null,
+
+			// determine the current base url
+			findBaseWithDefault = function(){
+				var closestBase = ( $.mobile.activePage && getClosestBaseUrl( $.mobile.activePage ) );
+				return closestBase || documentBase.hrefNoHash;
+			},
+
+			// The absolute version of the URL passed into the function. This
+			// version of the URL may contain dialog/subpage params in it.
+			absUrl = path.makeUrlAbsolute( url, findBaseWithDefault() );
+
+
+		// If the caller provided data, and we're using "get" request,
+		// append the data to the URL.
+		if ( settings.data && settings.type === "get" ) {
+			absUrl = path.addSearchParams( absUrl, settings.data );
+			settings.data = undefined;
+		}
+
+		// If the caller is using a "post" request, reloadPage must be true
+		if(  settings.data && settings.type === "post" ){
+			settings.reloadPage = true;
+		}
+
+			// The absolute version of the URL minus any dialog/subpage params.
+			// In otherwords the real URL of the page to be loaded.
+		var fileUrl = path.getFilePath( absUrl ),
+
+			// The version of the Url actually stored in the data-url attribute of
+			// the page. For embedded pages, it is just the id of the page. For pages
+			// within the same domain as the document base, it is the site relative
+			// path. For cross-domain pages (Phone Gap only) the entire absolute Url
+			// used to load the page.
+			dataUrl = path.convertUrlToDataUrl( absUrl );
+
+		// Make sure we have a pageContainer to work with.
+		settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
+
+		// Check to see if the page already exists in the DOM.
+		page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" );
+
+		// If we failed to find the page, check to see if the url is a
+		// reference to an embedded page. If so, it may have been dynamically
+		// injected by a developer, in which case it would be lacking a data-url
+		// attribute and in need of enhancement.
+		if ( page.length === 0 && dataUrl && !path.isPath( dataUrl ) ) {
+			page = settings.pageContainer.children( "#" + dataUrl )
+				.attr( "data-" + $.mobile.ns + "url", dataUrl );
+		}
+
+		// If we failed to find a page in the DOM, check the URL to see if it
+		// refers to the first page in the application. If it isn't a reference
+		// to the first page and refers to non-existent embedded page, error out.
+		if ( page.length === 0 ) {
+			if ( $.mobile.firstPage && path.isFirstPageUrl( fileUrl ) ) {
+				// Check to make sure our cached-first-page is actually
+				// in the DOM. Some user deployed apps are pruning the first
+				// page from the DOM for various reasons, we check for this
+				// case here because we don't want a first-page with an id
+				// falling through to the non-existent embedded page error
+				// case. If the first-page is not in the DOM, then we let
+				// things fall through to the ajax loading code below so
+				// that it gets reloaded.
+				if ( $.mobile.firstPage.parent().length ) {
+					page = $( $.mobile.firstPage );
+				}
+			} else if ( path.isEmbeddedPage( fileUrl )  ) {
+				deferred.reject( absUrl, options );
+				return deferred.promise();
+			}
+		}
+
+		// Reset base to the default document base.
+		if ( base ) {
+			base.reset();
+		}
+
+		// If the page we are interested in is already in the DOM,
+		// and the caller did not indicate that we should force a
+		// reload of the file, we are done. Otherwise, track the
+		// existing page as a duplicated.
+		if ( page.length ) {
+			if ( !settings.reloadPage ) {
+				enhancePage( page, settings.role );
+				deferred.resolve( absUrl, options, page );
+				return deferred.promise();
+			}
+			dupCachedPage = page;
+		}
+
+		var mpc = settings.pageContainer,
+			pblEvent = new $.Event( "pagebeforeload" ),
+			triggerData = { url: url, absUrl: absUrl, dataUrl: dataUrl, deferred: deferred, options: settings };
+
+		// Let listeners know we're about to load a page.
+		mpc.trigger( pblEvent, triggerData );
+
+		// If the default behavior is prevented, stop here!
+		if( pblEvent.isDefaultPrevented() ){
+			return deferred.promise();
+		}
+
+		if ( settings.showLoadMsg ) {
+
+			// This configurable timeout allows cached pages a brief delay to load without showing a message
+			var loadMsgDelay = setTimeout(function(){
+					$.mobile.showPageLoadingMsg();
+				}, settings.loadMsgDelay ),
+
+				// Shared logic for clearing timeout and removing message.
+				hideMsg = function(){
+
+					// Stop message show timer
+					clearTimeout( loadMsgDelay );
+
+					// Hide loading message
+					$.mobile.hidePageLoadingMsg();
+				};
+		}
+
+		if ( !( $.mobile.allowCrossDomainPages || path.isSameDomain( documentUrl, absUrl ) ) ) {
+			deferred.reject( absUrl, options );
+		} else {
+			// Load the new page.
+			$.ajax({
+				url: fileUrl,
+				type: settings.type,
+				data: settings.data,
+				dataType: "html",
+				success: function( html, textStatus, xhr ) {
+					//pre-parse html to check for a data-url,
+					//use it as the new fileUrl, base path, etc
+					var all = $( "<div></div>" ),
+
+						//page title regexp
+						newPageTitle = html.match( /<title[^>]*>([^<]*)/ ) && RegExp.$1,
+
+						// TODO handle dialogs again
+						pageElemRegex = new RegExp( "(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>)" ),
+						dataUrlRegex = new RegExp( "\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?" );
+
+
+					// data-url must be provided for the base tag so resource requests can be directed to the
+					// correct url. loading into a temprorary element makes these requests immediately
+					if( pageElemRegex.test( html )
+							&& RegExp.$1
+							&& dataUrlRegex.test( RegExp.$1 )
+							&& RegExp.$1 ) {
+						url = fileUrl = path.getFilePath( RegExp.$1 );
+					}
+
+					if ( base ) {
+						base.set( fileUrl );
+					}
+
+					//workaround to allow scripts to execute when included in page divs
+					all.get( 0 ).innerHTML = html;
+					page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first();
+
+					//if page elem couldn't be found, create one and insert the body element's contents
+					if( !page.length ){
+						page = $( "<div data-" + $.mobile.ns + "role='page'>" + html.split( /<\/?body[^>]*>/gmi )[1] + "</div>" );
+					}
+
+					if ( newPageTitle && !page.jqmData( "title" ) ) {
+						if ( ~newPageTitle.indexOf( "&" ) ) {
+							newPageTitle = $( "<div>" + newPageTitle + "</div>" ).text();
+						}
+						page.jqmData( "title", newPageTitle );
+					}
+
+					//rewrite src and href attrs to use a base url
+					if( !$.support.dynamicBaseTag ) {
+						var newPath = path.get( fileUrl );
+						page.find( "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]" ).each(function() {
+							var thisAttr = $( this ).is( '[href]' ) ? 'href' :
+									$(this).is('[src]') ? 'src' : 'action',
+								thisUrl = $( this ).attr( thisAttr );
+
+							// XXX_jblas: We need to fix this so that it removes the document
+							//            base URL, and then prepends with the new page URL.
+							//if full path exists and is same, chop it - helps IE out
+							thisUrl = thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' );
+
+							if( !/^(\w+:|#|\/)/.test( thisUrl ) ) {
+								$( this ).attr( thisAttr, newPath + thisUrl );
+							}
+						});
+					}
+
+					//append to page and enhance
+					// TODO taging a page with external to make sure that embedded pages aren't removed
+					//      by the various page handling code is bad. Having page handling code in many
+					//      places is bad. Solutions post 1.0
+					page
+						.attr( "data-" + $.mobile.ns + "url", path.convertUrlToDataUrl( fileUrl ) )
+						.attr( "data-" + $.mobile.ns + "external-page", true )
+						.appendTo( settings.pageContainer );
+
+					// wait for page creation to leverage options defined on widget
+					page.one( 'pagecreate', $.mobile._bindPageRemove );
+
+					enhancePage( page, settings.role );
+
+					// Enhancing the page may result in new dialogs/sub pages being inserted
+					// into the DOM. If the original absUrl refers to a sub-page, that is the
+					// real page we are interested in.
+					if ( absUrl.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ) {
+						page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" );
+					}
+
+					//bind pageHide to removePage after it's hidden, if the page options specify to do so
+
+					// Remove loading message.
+					if ( settings.showLoadMsg ) {
+						hideMsg();
+					}
+
+					// Add the page reference and xhr to our triggerData.
+					triggerData.xhr = xhr;
+					triggerData.textStatus = textStatus;
+					triggerData.page = page;
+
+					// Let listeners know the page loaded successfully.
+					settings.pageContainer.trigger( "pageload", triggerData );
+
+					deferred.resolve( absUrl, options, page, dupCachedPage );
+				},
+				error: function( xhr, textStatus, errorThrown ) {
+					//set base back to current path
+					if( base ) {
+						base.set( path.get() );
+					}
+
+					// Add error info to our triggerData.
+					triggerData.xhr = xhr;
+					triggerData.textStatus = textStatus;
+					triggerData.errorThrown = errorThrown;
+
+					var plfEvent = new $.Event( "pageloadfailed" );
+
+					// Let listeners know the page load failed.
+					settings.pageContainer.trigger( plfEvent, triggerData );
+
+					// If the default behavior is prevented, stop here!
+					// Note that it is the responsibility of the listener/handler
+					// that called preventDefault(), to resolve/reject the
+					// deferred object within the triggerData.
+					if( plfEvent.isDefaultPrevented() ){
+						return;
+					}
+
+					// Remove loading message.
+					if ( settings.showLoadMsg ) {
+
+						// Remove loading message.
+						hideMsg();
+
+						//show error message
+						$( "<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>"+ $.mobile.pageLoadErrorMessage +"</h1></div>" )
+							.css({ "display": "block", "opacity": 0.96, "top": $window.scrollTop() + 100 })
+							.appendTo( settings.pageContainer )
+							.delay( 800 )
+							.fadeOut( 400, function() {
+								$( this ).remove();
+							});
+					}
+
+					deferred.reject( absUrl, options );
+				}
+			});
+		}
+
+		return deferred.promise();
+	};
+
+	$.mobile.loadPage.defaults = {
+		type: "get",
+		data: undefined,
+		reloadPage: false,
+		role: undefined, // By default we rely on the role defined by the @data-role attribute.
+		showLoadMsg: false,
+		pageContainer: undefined,
+		loadMsgDelay: 50 // This delay allows loads that pull from browser cache to occur without showing the loading message.
+	};
+
+	// Show a specific page in the page container.
+	$.mobile.changePage = function( toPage, options ) {
+		// If we are in the midst of a transition, queue the current request.
+		// We'll call changePage() once we're done with the current transition to
+		// service the request.
+		if( isPageTransitioning ) {
+			pageTransitionQueue.unshift( arguments );
+			return;
+		}
+
+		var settings = $.extend( {}, $.mobile.changePage.defaults, options );
+
+		// Make sure we have a pageContainer to work with.
+		settings.pageContainer = settings.pageContainer || $.mobile.pageContainer;
+
+		// Make sure we have a fromPage.
+		settings.fromPage = settings.fromPage || $.mobile.activePage;
+
+		var mpc = settings.pageContainer,
+			pbcEvent = new $.Event( "pagebeforechange" ),
+			triggerData = { toPage: toPage, options: settings };
+
+		// Let listeners know we're about to change the current page.
+		mpc.trigger( pbcEvent, triggerData );
+
+		// If the default behavior is prevented, stop here!
+		if( pbcEvent.isDefaultPrevented() ){
+			return;
+		}
+
+		// We allow "pagebeforechange" observers to modify the toPage in the trigger
+		// data to allow for redirects. Make sure our toPage is updated.
+
+		toPage = triggerData.toPage;
+
+		// Set the isPageTransitioning flag to prevent any requests from
+		// entering this method while we are in the midst of loading a page
+		// or transitioning.
+
+		isPageTransitioning = true;
+
+		// If the caller passed us a url, call loadPage()
+		// to make sure it is loaded into the DOM. We'll listen
+		// to the promise object it returns so we know when
+		// it is done loading or if an error ocurred.
+		if ( typeof toPage == "string" ) {
+			$.mobile.loadPage( toPage, settings )
+				.done(function( url, options, newPage, dupCachedPage ) {
+					isPageTransitioning = false;
+					options.duplicateCachedPage = dupCachedPage;
+					$.mobile.changePage( newPage, options );
+				})
+				.fail(function( url, options ) {
+					isPageTransitioning = false;
+
+					//clear out the active button state
+					removeActiveLinkClass( true );
+
+					//release transition lock so navigation is free again
+					releasePageTransitionLock();
+					settings.pageContainer.trigger( "pagechangefailed", triggerData );
+				});
+			return;
+		}
+
+		// If we are going to the first-page of the application, we need to make
+		// sure settings.dataUrl is set to the application document url. This allows
+		// us to avoid generating a document url with an id hash in the case where the
+		// first-page of the document has an id attribute specified.
+		if ( toPage[ 0 ] === $.mobile.firstPage[ 0 ] && !settings.dataUrl ) {
+			settings.dataUrl = documentUrl.hrefNoHash;
+		}
+
+		// The caller passed us a real page DOM element. Update our
+		// internal state and then trigger a transition to the page.
+		var fromPage = settings.fromPage,
+			url = ( settings.dataUrl && path.convertUrlToDataUrl( settings.dataUrl ) ) || toPage.jqmData( "url" ),
+			// The pageUrl var is usually the same as url, except when url is obscured as a dialog url. pageUrl always contains the file path
+			pageUrl = url,
+			fileUrl = path.getFilePath( url ),
+			active = urlHistory.getActive(),
+			activeIsInitialPage = urlHistory.activeIndex === 0,
+			historyDir = 0,
+			pageTitle = document.title,
+			isDialog = settings.role === "dialog" || toPage.jqmData( "role" ) === "dialog";
+
+		// By default, we prevent changePage requests when the fromPage and toPage
+		// are the same element, but folks that generate content manually/dynamically
+		// and reuse pages want to be able to transition to the same page. To allow
+		// this, they will need to change the default value of allowSamePageTransition
+		// to true, *OR*, pass it in as an option when they manually call changePage().
+		// It should be noted that our default transition animations assume that the
+		// formPage and toPage are different elements, so they may behave unexpectedly.
+		// It is up to the developer that turns on the allowSamePageTransitiona option
+		// to either turn off transition animations, or make sure that an appropriate
+		// animation transition is used.
+		if( fromPage && fromPage[0] === toPage[0] && !settings.allowSamePageTransition ) {
+			isPageTransitioning = false;
+			mpc.trigger( "pagechange", triggerData );
+			return;
+		}
+
+		// We need to make sure the page we are given has already been enhanced.
+		enhancePage( toPage, settings.role );
+
+		// If the changePage request was sent from a hashChange event, check to see if the
+		// page is already within the urlHistory stack. If so, we'll assume the user hit
+		// the forward/back button and will try to match the transition accordingly.
+		if( settings.fromHashChange ) {
+			urlHistory.directHashChange({
+				currentUrl:	url,
+				isBack:		function() { historyDir = -1; },
+				isForward:	function() { historyDir = 1; }
+			});
+		}
+
+		// Kill the keyboard.
+		// XXX_jblas: We need to stop crawling the entire document to kill focus. Instead,
+		//            we should be tracking focus with a live() handler so we already have
+		//            the element in hand at this point.
+		// Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement
+		// is undefined when we are in an IFrame.
+		try {
+			if(document.activeElement && document.activeElement.nodeName.toLowerCase() != 'body') {
+				$(document.activeElement).blur();
+			} else {
+				$( "input:focus, textarea:focus, select:focus" ).blur();
+			}
+		} catch(e) {}
+
+		// If we're displaying the page as a dialog, we don't want the url
+		// for the dialog content to be used in the hash. Instead, we want
+		// to append the dialogHashKey to the url of the current page.
+		if ( isDialog && active ) {
+			// on the initial page load active.url is undefined and in that case should
+			// be an empty string. Moving the undefined -> empty string back into
+			// urlHistory.addNew seemed imprudent given undefined better represents
+			// the url state
+			url = ( active.url || "" ) + dialogHashKey;
+		}
+
+		// Set the location hash.
+		if( settings.changeHash !== false && url ) {
+			//disable hash listening temporarily
+			urlHistory.ignoreNextHashChange = true;
+			//update hash and history
+			path.set( url );
+		}
+
+		// if title element wasn't found, try the page div data attr too
+		// If this is a deep-link or a reload ( active === undefined ) then just use pageTitle
+		var newPageTitle = ( !active )? pageTitle : toPage.jqmData( "title" ) || toPage.children(":jqmData(role='header')").find(".ui-title" ).getEncodedText();
+		if( !!newPageTitle && pageTitle == document.title ) {
+			pageTitle = newPageTitle;
+		}
+		if ( !toPage.jqmData( "title" ) ) {
+			toPage.jqmData( "title", pageTitle );
+		}
+
+		// Make sure we have a transition defined.
+		settings.transition = settings.transition
+			|| ( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined )
+			|| ( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition );
+
+		//add page to history stack if it's not back or forward
+		if( !historyDir ) {
+			urlHistory.addNew( url, settings.transition, pageTitle, pageUrl, settings.role );
+		}
+
+		//set page title
+		document.title = urlHistory.getActive().title;
+
+		//set "toPage" as activePage
+		$.mobile.activePage = toPage;
+
+		// If we're navigating back in the URL history, set reverse accordingly.
+		settings.reverse = settings.reverse || historyDir < 0;
+
+		transitionPages( toPage, fromPage, settings.transition, settings.reverse )
+			.done(function() {
+				removeActiveLinkClass();
+
+				//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
+				if ( settings.duplicateCachedPage ) {
+					settings.duplicateCachedPage.remove();
+				}
+
+				//remove initial build class (only present on first pageshow)
+				$html.removeClass( "ui-mobile-rendering" );
+
+				releasePageTransitionLock();
+
+				// Let listeners know we're all done changing the current page.
+				mpc.trigger( "pagechange", triggerData );
+			});
+	};
+
+	$.mobile.changePage.defaults = {
+		transition: undefined,
+		reverse: false,
+		changeHash: true,
+		fromHashChange: false,
+		role: undefined, // By default we rely on the role defined by the @data-role attribute.
+		duplicateCachedPage: undefined,
+		pageContainer: undefined,
+		showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage
+		dataUrl: undefined,
+		fromPage: undefined,
+		allowSamePageTransition: false
+	};
+
+/* Event Bindings - hashchange, submit, and click */
+	function findClosestLink( ele )
+	{
+		while ( ele ) {
+			// Look for the closest element with a nodeName of "a".
+			// Note that we are checking if we have a valid nodeName
+			// before attempting to access it. This is because the
+			// node we get called with could have originated from within
+			// an embedded SVG document where some symbol instance elements
+			// don't have nodeName defined on them, or strings are of type
+			// SVGAnimatedString.
+			if ( ( typeof ele.nodeName === "string" ) && ele.nodeName.toLowerCase() == "a" ) {
+				break;
+			}
+			ele = ele.parentNode;
+		}
+		return ele;
+	}
+
+	// The base URL for any given element depends on the page it resides in.
+	function getClosestBaseUrl( ele )
+	{
+		// Find the closest page and extract out its url.
+		var url = $( ele ).closest( ".ui-page" ).jqmData( "url" ),
+			base = documentBase.hrefNoHash;
+
+		if ( !url || !path.isPath( url ) ) {
+			url = base;
+		}
+
+		return path.makeUrlAbsolute( url, base);
+	}
+
+
+	//The following event bindings should be bound after mobileinit has been triggered
+	//the following function is called in the init file
+	$.mobile._registerInternalEvents = function(){
+
+		//bind to form submit events, handle with Ajax
+		$( "form" ).live('submit', function( event ) {
+			var $this = $( this );
+			if( !$.mobile.ajaxEnabled ||
+				$this.is( ":jqmData(ajax='false')" ) ) {
+					return;
+				}
+
+			var type = $this.attr( "method" ),
+				target = $this.attr( "target" ),
+				url = $this.attr( "action" );
+
+			// If no action is specified, browsers default to using the
+			// URL of the document containing the form. Since we dynamically
+			// pull in pages from external documents, the form should submit
+			// to the URL for the source document of the page containing
+			// the form.
+			if ( !url ) {
+				// Get the @data-url for the page containing the form.
+				url = getClosestBaseUrl( $this );
+				if ( url === documentBase.hrefNoHash ) {
+					// The url we got back matches the document base,
+					// which means the page must be an internal/embedded page,
+					// so default to using the actual document url as a browser
+					// would.
+					url = documentUrl.hrefNoSearch;
+				}
+			}
+
+			url = path.makeUrlAbsolute(  url, getClosestBaseUrl($this) );
+
+			//external submits use regular HTTP
+			if( path.isExternal( url ) || target ) {
+				return;
+			}
+
+			$.mobile.changePage(
+				url,
+				{
+					type:		type && type.length && type.toLowerCase() || "get",
+					data:		$this.serialize(),
+					transition:	$this.jqmData( "transition" ),
+					direction:	$this.jqmData( "direction" ),
+					reloadPage:	true
+				}
+			);
+			event.preventDefault();
+		});
+
+		//add active state on vclick
+		$( document ).bind( "vclick", function( event ) {
+			// if this isn't a left click we don't care. Its important to note
+			// that when the virtual event is generated it will create
+			if ( event.which > 1 || !$.mobile.linkBindingEnabled ){
+				return;
+			}
+
+			var link = findClosestLink( event.target );
+			if ( link ) {
+				if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) {
+					removeActiveLinkClass( true );
+					$activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" );
+					$activeClickedLink.addClass( $.mobile.activeBtnClass );
+					$( "." + $.mobile.activePageClass + " .ui-btn" ).not( link ).blur();
+				}
+			}
+		});
+
+		// click routing - direct to HTTP or Ajax, accordingly
+		$( document ).bind( "click", function( event ) {
+			if( !$.mobile.linkBindingEnabled ){
+				return;
+			}
+
+			var link = findClosestLink( event.target );
+
+			// If there is no link associated with the click or its not a left
+			// click we want to ignore the click
+			if ( !link || event.which > 1) {
+				return;
+			}
+
+			var $link = $( link ),
+				//remove active link class if external (then it won't be there if you come back)
+				httpCleanup = function(){
+					window.setTimeout( function() { removeActiveLinkClass( true ); }, 200 );
+				};
+
+			//if there's a data-rel=back attr, go back in history
+			if( $link.is( ":jqmData(rel='back')" ) ) {
+				window.history.back();
+				return false;
+			}
+
+			var baseUrl = getClosestBaseUrl( $link ),
+
+				//get href, if defined, otherwise default to empty hash
+				href = path.makeUrlAbsolute( $link.attr( "href" ) || "#", baseUrl );
+
+			//if ajax is disabled, exit early
+			if( !$.mobile.ajaxEnabled && !path.isEmbeddedPage( href ) ){
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			// XXX_jblas: Ideally links to application pages should be specified as
+			//            an url to the application document with a hash that is either
+			//            the site relative path or id to the page. But some of the
+			//            internal code that dynamically generates sub-pages for nested
+			//            lists and select dialogs, just write a hash in the link they
+			//            create. This means the actual URL path is based on whatever
+			//            the current value of the base tag is at the time this code
+			//            is called. For now we are just assuming that any url with a
+			//            hash in it is an application page reference.
+			if ( href.search( "#" ) != -1 ) {
+				href = href.replace( /[^#]*#/, "" );
+				if ( !href ) {
+					//link was an empty hash meant purely
+					//for interaction, so we ignore it.
+					event.preventDefault();
+					return;
+				} else if ( path.isPath( href ) ) {
+					//we have apath so make it the href we want to load.
+					href = path.makeUrlAbsolute( href, baseUrl );
+				} else {
+					//we have a simple id so use the documentUrl as its base.
+					href = path.makeUrlAbsolute( "#" + href, documentUrl.hrefNoHash );
+				}
+			}
+
+				// Should we handle this link, or let the browser deal with it?
+			var useDefaultUrlHandling = $link.is( "[rel='external']" ) || $link.is( ":jqmData(ajax='false')" ) || $link.is( "[target]" ),
+
+				// Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR
+				// requests if the document doing the request was loaded via the file:// protocol.
+				// This is usually to allow the application to "phone home" and fetch app specific
+				// data. We normally let the browser handle external/cross-domain urls, but if the
+				// allowCrossDomainPages option is true, we will allow cross-domain http/https
+				// requests to go through our page loading logic.
+				isCrossDomainPageLoad = ( $.mobile.allowCrossDomainPages && documentUrl.protocol === "file:" && href.search( /^https?:/ ) != -1 ),
+
+				//check for protocol or rel and its not an embedded page
+				//TODO overlap in logic from isExternal, rel=external check should be
+				//     moved into more comprehensive isExternalLink
+				isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !isCrossDomainPageLoad );
+
+			if( isExternal ) {
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			//use ajax
+			var transition = $link.jqmData( "transition" ),
+				direction = $link.jqmData( "direction" ),
+				reverse = ( direction && direction === "reverse" ) ||
+							// deprecated - remove by 1.0
+							$link.jqmData( "back" ),
+
+				//this may need to be more specific as we use data-rel more
+				role = $link.attr( "data-" + $.mobile.ns + "rel" ) || undefined;
+
+			$.mobile.changePage( href, { transition: transition, reverse: reverse, role: role } );
+			event.preventDefault();
+		});
+
+		//prefetch pages when anchors with data-prefetch are encountered
+		$( ".ui-page" ).live( "pageshow.prefetch", function() {
+			var urls = [];
+			$( this ).find( "a:jqmData(prefetch)" ).each(function(){
+				var $link = $(this),
+					url = $link.attr( "href" );
+
+				if ( url && $.inArray( url, urls ) === -1 ) {
+					urls.push( url );
+
+					$.mobile.loadPage( url, {role: $link.attr("data-" + $.mobile.ns + "rel")} );
+				}
+			});
+		});
+
+		$.mobile._handleHashChange = function( hash ) {
+			//find first page via hash
+			var to = path.stripHash( hash ),
+				//transition is false if it's the first page, undefined otherwise (and may be overridden by default)
+				transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined,
+
+				// default options for the changPage calls made after examining the current state
+				// of the page and the hash
+				changePageOptions = {
+					transition: transition,
+					changeHash: false,
+					fromHashChange: true
+				};
+
+			//if listening is disabled (either globally or temporarily), or it's a dialog hash
+			if( !$.mobile.hashListeningEnabled || urlHistory.ignoreNextHashChange ) {
+				urlHistory.ignoreNextHashChange = false;
+				return;
+			}
+
+			// special case for dialogs
+			if( urlHistory.stack.length > 1 && to.indexOf( dialogHashKey ) > -1 ) {
+
+				// If current active page is not a dialog skip the dialog and continue
+				// in the same direction
+				if(!$.mobile.activePage.is( ".ui-dialog" )) {
+					//determine if we're heading forward or backward and continue accordingly past
+					//the current dialog
+					urlHistory.directHashChange({
+						currentUrl: to,
+						isBack: function() { window.history.back(); },
+						isForward: function() { window.history.forward(); }
+					});
+
+					// prevent changePage()
+					return;
+				} else {
+					// if the current active page is a dialog and we're navigating
+					// to a dialog use the dialog objected saved in the stack
+					urlHistory.directHashChange({
+						currentUrl: to,
+
+						// regardless of the direction of the history change
+						// do the following
+						either: function( isBack ) {
+							var active = $.mobile.urlHistory.getActive();
+
+							to = active.pageUrl;
+
+							// make sure to set the role, transition and reversal
+							// as most of this is lost by the domCache cleaning
+							$.extend( changePageOptions, {
+								role: active.role,
+								transition:	 active.transition,
+								reverse: isBack
+							});
+						}
+					});
+				}
+			}
+
+			//if to is defined, load it
+			if ( to ) {
+				// At this point, 'to' can be one of 3 things, a cached page element from
+				// a history stack entry, an id, or site-relative/absolute URL. If 'to' is
+				// an id, we need to resolve it against the documentBase, not the location.href,
+				// since the hashchange could've been the result of a forward/backward navigation
+				// that crosses from an external page/dialog to an internal page/dialog.
+				to = ( typeof to === "string" && !path.isPath( to ) ) ? ( path.makeUrlAbsolute( '#' + to, documentBase ) ) : to;
+				$.mobile.changePage( to, changePageOptions );
+			}	else {
+				//there's no hash, go to the first page in the dom
+				$.mobile.changePage( $.mobile.firstPage, changePageOptions );
+			}
+		};
+
+		//hashchange event handler
+		$window.bind( "hashchange", function( e, triggered ) {
+			$.mobile._handleHashChange( location.hash );
+		});
+
+		//set page min-heights to be device specific
+		$( document ).bind( "pageshow", resetActivePageHeight );
+		$( window ).bind( "throttledresize", resetActivePageHeight );
+
+	};//_registerInternalEvents callback
+
+})( jQuery );
+/*
+* history.pushState support, layered on top of hashchange
+*/
+
+( function( $, window ) {
+	// For now, let's Monkeypatch this onto the end of $.mobile._registerInternalEvents
+	// Scope self to pushStateHandler so we can reference it sanely within the
+	// methods handed off as event handlers
+	var	pushStateHandler = {},
+		self = pushStateHandler,
+		$win = $( window ),
+		url = $.mobile.path.parseUrl( location.href );
+
+	$.extend( pushStateHandler, {
+		// TODO move to a path helper, this is rather common functionality
+		initialFilePath: (function() {
+			return url.pathname + url.search;
+		})(),
+
+		initialHref: url.hrefNoHash,
+
+		// Flag for tracking if a Hashchange naturally occurs after each popstate + replace
+		hashchangeFired: false,
+
+		state: function() {
+			return {
+				hash: location.hash || "#" + self.initialFilePath,
+				title: document.title,
+
+				// persist across refresh
+				initialHref: self.initialHref
+			};
+		},
+
+		resetUIKeys: function( url ) {
+			var dialog = $.mobile.dialogHashKey,
+				subkey = "&" + $.mobile.subPageUrlKey,
+				dialogIndex = url.indexOf( dialog );
+
+			if( dialogIndex > -1 ) {
+				url = url.slice( 0, dialogIndex ) + "#" + url.slice( dialogIndex );
+			} else if( url.indexOf( subkey ) > -1 ) {
+				url = url.split( subkey ).join( "#" + subkey );
+			}
+
+			return url;
+		},
+
+		// TODO sort out a single barrier to hashchange functionality
+		nextHashChangePrevented: function( value ) {
+			$.mobile.urlHistory.ignoreNextHashChange = value;
+			self.onHashChangeDisabled = value;
+		},
+
+		// on hash change we want to clean up the url
+		// NOTE this takes place *after* the vanilla navigation hash change
+		// handling has taken place and set the state of the DOM
+		onHashChange: function( e ) {
+			// disable this hash change
+			if( self.onHashChangeDisabled ){
+				return;
+			}
+			
+			var href, state,
+				hash = location.hash,
+				isPath = $.mobile.path.isPath( hash ),
+				resolutionUrl = isPath ? location.href : $.mobile.getDocumentUrl();
+			hash = isPath ? hash.replace( "#", "" ) : hash;
+
+			// propulate the hash when its not available
+			state = self.state();
+
+			// make the hash abolute with the current href
+			href = $.mobile.path.makeUrlAbsolute( hash, resolutionUrl );
+
+			if ( isPath ) {
+				href = self.resetUIKeys( href );
+			}
+
+			// replace the current url with the new href and store the state
+			// Note that in some cases we might be replacing an url with the
+			// same url. We do this anyways because we need to make sure that
+			// all of our history entries have a state object associated with
+			// them. This allows us to work around the case where window.history.back()
+			// is called to transition from an external page to an embedded page.
+			// In that particular case, a hashchange event is *NOT* generated by the browser.
+			// Ensuring each history entry has a state object means that onPopState()
+			// will always trigger our hashchange callback even when a hashchange event
+			// is not fired.
+			history.replaceState( state, document.title, href );
+		},
+
+		// on popstate (ie back or forward) we need to replace the hash that was there previously
+		// cleaned up by the additional hash handling
+		onPopState: function( e ) {
+			var poppedState = e.originalEvent.state, holdnexthashchange = false;
+
+			// if there's no state its not a popstate we care about, ie chrome's initial popstate
+			// or forward popstate
+			if( poppedState ) {
+				// disable any hashchange triggered by the browser
+				self.nextHashChangePrevented( true );
+
+				// defer our manual hashchange until after the browser fired
+				// version has come and gone
+				setTimeout(function() {
+					// make sure that the manual hash handling takes place
+					self.nextHashChangePrevented( false );
+
+					// change the page based on the hash
+					$.mobile._handleHashChange( poppedState.hash );
+				}, 100);
+			}
+		},
+
+		init: function() {
+			$win.bind( "hashchange", self.onHashChange );
+
+			// Handle popstate events the occur through history changes
+			$win.bind( "popstate", self.onPopState );
+
+			// if there's no hash, we need to replacestate for returning to home
+			if ( location.hash === "" ) {
+				history.replaceState( self.state(), document.title, location.href );
+			}
+		}
+	});
+
+	$( function() {
+		if( $.mobile.pushStateEnabled && $.support.pushState ){
+			pushStateHandler.init();
+		}
+	});
+})( jQuery, this );
+/*
+* "transitions" plugin - Page change tranistions
+*/
+
+(function( $, window, undefined ) {
+
+function css3TransitionHandler( name, reverse, $to, $from ) {
+
+	var deferred = new $.Deferred(),
+		reverseClass = reverse ? " reverse" : "",
+		viewportClass = "ui-mobile-viewport-transitioning viewport-" + name,
+		doneFunc = function() {
+
+			$to.add( $from ).removeClass( "out in reverse " + name );
+
+			if ( $from && $from[ 0 ] !== $to[ 0 ] ) {
+				$from.removeClass( $.mobile.activePageClass );
+			}
+
+			$to.parent().removeClass( viewportClass );
+
+			deferred.resolve( name, reverse, $to, $from );
+		};
+
+	$to.animationComplete( doneFunc );
+
+	$to.parent().addClass( viewportClass );
+
+	if ( $from ) {
+		$from.addClass( name + " out" + reverseClass );
+	}
+	$to.addClass( $.mobile.activePageClass + " " + name + " in" + reverseClass );
+
+	return deferred.promise();
+}
+
+// Make our transition handler public.
+$.mobile.css3TransitionHandler = css3TransitionHandler;
+
+// If the default transition handler is the 'none' handler, replace it with our handler.
+if ( $.mobile.defaultTransitionHandler === $.mobile.noneTransitionHandler ) {
+	$.mobile.defaultTransitionHandler = css3TransitionHandler;
+}
+
+})( jQuery, this );
+/*
+* "degradeInputs" plugin - degrades inputs to another type after custom enhancements are made.
+*/
+
+(function( $, undefined ) {
+
+$.mobile.page.prototype.options.degradeInputs = {
+	color: false,
+	date: false,
+	datetime: false,
+	"datetime-local": false,
+	email: false,
+	month: false,
+	number: false,
+	range: "number",
+	search: "text",
+	tel: false,
+	time: false,
+	url: false,
+	week: false
+};
+
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+
+	var page = $(e.target).closest(':jqmData(role="page")').data("page"), options;
+
+	if( !page ) {
+		return;
+	}
+
+	options = page.options;
+
+	// degrade inputs to avoid poorly implemented native functionality
+	$( e.target ).find( "input" ).not( page.keepNativeSelector() ).each(function() {
+		var $this = $( this ),
+			type = this.getAttribute( "type" ),
+			optType = options.degradeInputs[ type ] || "text";
+
+		if ( options.degradeInputs[ type ] ) {
+			var html = $( "<div>" ).html( $this.clone() ).html(),
+				// In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead
+				hasType = html.indexOf( " type=" ) > -1,
+				findstr = hasType ? /\s+type=["']?\w+['"]?/ : /\/?>/,
+				repstr = " type=\"" + optType + "\" data-" + $.mobile.ns + "type=\"" + type + "\"" + ( hasType ? "" : ">" );
+
+			$this.replaceWith( html.replace( findstr, repstr ) );
+		}
+	});
+
+});
+
+})( jQuery );/*
+* "dialog" plugin.
+*/
+
+(function( $, window, undefined ) {
+
+$.widget( "mobile.dialog", $.mobile.widget, {
+	options: {
+		closeBtnText 	: "Close",
+		overlayTheme	: "a",
+		initSelector	: ":jqmData(role='dialog')"
+	},
+	_create: function() {
+		var self = this,
+			$el = this.element,
+			headerCloseButton = $( "<a href='#' data-" + $.mobile.ns + "icon='delete' data-" + $.mobile.ns + "iconpos='notext'>"+ this.options.closeBtnText + "</a>" );
+
+		$el.addClass( "ui-overlay-" + this.options.overlayTheme );
+
+		// Class the markup for dialog styling
+		// Set aria role
+		$el.attr( "role", "dialog" )
+			.addClass( "ui-dialog" )
+			.find( ":jqmData(role='header')" )
+			.addClass( "ui-corner-top ui-overlay-shadow" )
+				.prepend( headerCloseButton )
+			.end()
+			.find( ":jqmData(role='content'),:jqmData(role='footer')" )
+				.addClass( "ui-overlay-shadow" )
+				.last()
+				.addClass( "ui-corner-bottom" );
+
+		// this must be an anonymous function so that select menu dialogs can replace
+		// the close method. This is a change from previously just defining data-rel=back
+		// on the button and letting nav handle it
+		headerCloseButton.bind( "vclick", function() {
+			self.close();
+		});
+
+		/* bind events
+			- clicks and submits should use the closing transition that the dialog opened with
+			  unless a data-transition is specified on the link/form
+			- if the click was on the close button, or the link has a data-rel="back" it'll go back in history naturally
+		*/
+		$el.bind( "vclick submit", function( event ) {
+			var $target = $( event.target ).closest( event.type === "vclick" ? "a" : "form" ),
+				active;
+
+			if ( $target.length && !$target.jqmData( "transition" ) ) {
+
+				active = $.mobile.urlHistory.getActive() || {};
+
+				$target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) )
+					.attr( "data-" + $.mobile.ns + "direction", "reverse" );
+			}
+		})
+		.bind( "pagehide", function() {
+			$( this ).find( "." + $.mobile.activeBtnClass ).removeClass( $.mobile.activeBtnClass );
+		});
+	},
+
+	// Close method goes back in history
+	close: function() {
+		window.history.back();
+	}
+});
+
+//auto self-init widgets
+$( $.mobile.dialog.prototype.options.initSelector ).live( "pagecreate", function(){
+	$( this ).dialog();
+});
+
+})( jQuery, this );
+/*
+* This plugin handles theming and layout of headers, footers, and content areas
+*/
+
+/*
+ * Page can be created using the calendarpicker() method or by adding a
+ * data-role="page" attribute to an element.
+ *
+ * Page has 3 main sub element. Header, Footer, Content
+ * 3 sub element can be created using <div> element
+ *
+ * Attribute:
+ *
+ *    data-back-Btn-Text:	determine which text is displayed in back button
+ *    data-add-Back-Btn:	Defines if header/footer has back button or not (default false)
+ *    data-back-Btn-Theme:	defines back button's theme
+ *    data-header-Theme:	defines header <div>'s theme
+ *    data-footer-Theme:	defines footer <div>'s theme
+ *    data-content-Theme:	defines content <div>'s theme
+ *    data-footer-Exist:	defines to show default footer or not in each page (default true)
+ *    data-footer-User-Control-Theme: defines to show default footer in whole page
+ *				(default false. if true, all document do not has footer)
+ *
+ * Examples:
+ *
+ *     HTML markup for creating Page:
+ *     <div data-role="page">
+ *
+ *     How to show back button
+ *     <div data-role="page" id="no-contents-0" data-add-back-btn="true">
+ *
+ *     How to  remove footer of specific page
+ *     <div data-role="page" id="no-contents-0" data-footer-Exist="false">
+ *
+ *     How to  remove footer of whole page
+ *     <div data-role="page" id="no-contents-0" data-footer-User-Control="true">
+ */
+
+(function( $, undefined ) {
+
+$.mobile.page.prototype.options.backBtnText  = "Back";
+$.mobile.page.prototype.options.addBackBtn   = false;
+$.mobile.page.prototype.options.backBtnTheme = null;
+$.mobile.page.prototype.options.headerTheme  = "a";
+$.mobile.page.prototype.options.footerTheme  = "a";
+$.mobile.page.prototype.options.contentTheme = null;
+$.mobile.page.prototype.options.footerExist = true;
+$.mobile.page.prototype.options.footerUserControl = false;
+
+$( ":jqmData(role='page'), :jqmData(role='dialog')" ).live( "pagecreate", function( e ) {
+	
+	var $page = $( this ),
+		o = $page.data( "page" ).options,
+		pageRole = $page.jqmData( "role" ),
+		pageTheme = o.theme;
+	
+	$( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", this ).each(function() {
+		var $this = $( this ),
+			role = $this.jqmData( "role" ),
+			theme = $this.jqmData( "theme" ),
+			contentTheme = theme || o.contentTheme || pageTheme,
+			$headeranchors,
+			leftbtn,
+			rightbtn,
+			backBtn;
+
+		var normalFooter,
+			footerExist = $this.jqmData("footerexist");
+
+		if ( footerExist != undefined ) {
+			o.footerExist = footerExist;
+		}
+			
+		$this.addClass( "ui-" + role );	
+
+		//apply theming and markup modifications to page,header,content,footer
+		if ( role === "header" || role === "footer" ) {
+			var thisTheme = theme || ( role === "header" ? o.headerTheme : o.footerTheme ) || pageTheme;
+
+			$this
+				//add theme class
+				.addClass( "ui-bar-" + thisTheme )
+				// Add ARIA role
+				.attr( "role", role === "header" ? "banner" : "contentinfo" );
+
+			// Right,left buttons
+			$headeranchors	= $this.children( "a" );
+			leftbtn	= $headeranchors.hasClass( "ui-btn-left" );
+			rightbtn = $headeranchors.hasClass( "ui-btn-right" );
+
+			leftbtn = leftbtn || $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length;
+			rightbtn = rightbtn || $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length;
+
+			// set default userControl value
+			if ( o.footerUserControl ) {
+				$.mobile.page.prototype.options.footerUserControl = "true";
+			}
+			
+			// Auto-add back btn on pages beyond first view
+			// create backbtn in case footer exist
+			if ( o.addBackBtn && 
+				role === "footer" &&
+				o.footerExist &&
+				$this.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) &&
+				!leftbtn ) {
+
+				backBtn = $( "<a href='#' class='ui-btn-back' data-"+ $.mobile.ns +"rel='back' data-"+ $.mobile.ns +"icon='header-back-btn'></a>" )
+					// If theme is provided, override default inheritance
+					.attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme || thisTheme )
+					.prependTo( $this );				
+
+
+				backBtn.bind( "vclick", function( event ) {
+					window.history.back();
+					return false;
+				});
+			}
+
+			// Page title
+			$this.children( "h1, h2, h3, h4, h5, h6" )
+				.addClass( "ui-title" )
+				// Regardless of h element number in src, it becomes h1 for the enhanced page
+				.attr({
+					"tabindex": "0",
+					"role": "heading",
+					"aria-level": "1"
+				});
+
+		} else if ( role === "content" ) {
+			if ( contentTheme ) {
+			    $this.addClass( "ui-body-" + ( contentTheme ) );
+			}
+
+			// Add ARIA role
+			$this.attr( "role", "main" );
+
+			/* Add default footer to add backbtn */
+			thisTheme = "s";
+
+			if ( o.footerExist ) {
+				backBtn = $( "<a href='#' class='ui-btn-back' data-" +
+						$.mobile.ns + "rel='back' data-" +
+						$.mobile.ns + "icon='header-back-btn'></a>" )
+						.attr( "data-" + $.mobile.ns + "theme", o.backBtnTheme || thisTheme );
+				var footer = $page.find("div:jqmData(role='footer')");
+
+				if ( footer.length != 0 ) {
+					if ( !footer.find("jqmData(role='navbar')").is("jqmData(style='tabbar')") ) {
+						backBtn.appendTo( footer );
+					}
+				} else {
+					if ( !$.mobile.page.prototype.options.footerUserControl ) {
+						normalFooter = $( "<div data-role='footer' class='ui-footer ui-bar-s ui-footer-fixed fade ui-fixed-overlay' data-position='fixed'></div>" )
+								.insertAfter( $page.find( ".ui-content" ) );
+						backBtn.appendTo( normalFooter );
+					}
+				}
+
+				if ( backBtn ) {
+					backBtn.bind( "vclick", function( event ) {
+						window.history.back();
+						return false;
+					});
+				}
+			}
+		}
+	});
+});
+
+})( jQuery );
+/*
+* "collapsible" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.collapsible", $.mobile.widget, {
+	options: {
+		expandCueText: " click to expand contents",
+		collapseCueText: " click to collapse contents",
+		collapsed: true,
+		heading: "h1,h2,h3,h4,h5,h6,legend",
+		theme: null,
+		contentTheme: null,
+		iconTheme: "d",
+		initSelector: ":jqmData(role='collapsible')"
+	},
+	_create: function() {
+
+		var $el = this.element,
+			o = this.options,
+			collapsible = $el.addClass( "ui-collapsible" ),
+			collapsibleHeading = $el.children( o.heading ).first(),
+			collapsibleContent = collapsible.wrapInner( "<div class='ui-collapsible-content'></div>" ).find( ".ui-collapsible-content" ),
+			collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ),
+			collapsiblesInSet = collapsibleSet.children( ":jqmData(role='collapsible')" );
+
+		// Replace collapsibleHeading if it's a legend
+		if ( collapsibleHeading.is( "legend" ) ) {
+			collapsibleHeading = $( "<div role='heading'>"+ collapsibleHeading.html() +"</div>" ).insertBefore( collapsibleHeading );
+			collapsibleHeading.next().remove();
+		}
+
+		// If we are in a collapsible set
+		if ( collapsibleSet.length ) {
+			// Inherit the theme from collapsible-set
+			if ( !o.theme ) {
+				o.theme = collapsibleSet.jqmData( "theme" );
+			}
+			// Inherit the content-theme from collapsible-set
+			if ( !o.contentTheme ) {
+				o.contentTheme = collapsibleSet.jqmData( "content-theme" );
+			}
+		}
+
+		collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : "");
+
+		collapsibleHeading
+			//drop heading in before content
+			.insertBefore( collapsibleContent )
+			//modify markup & attributes
+			.addClass( "ui-collapsible-heading" )
+			.append( "<span class='ui-collapsible-heading-status'></span>" )
+			.wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" )
+			.find( "a" )
+				.first()
+				.buttonMarkup({
+					shadow: false,
+					corners: false,
+					iconPos: "left",
+					icon: "plus",
+					theme: o.theme
+				});
+
+		if ( !collapsibleSet.length ) {
+			collapsibleHeading
+				.find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) )
+					.addClass( "ui-corner-top ui-corner-bottom" );
+		} else {
+			// If we are in a collapsible set
+
+			// Initialize the collapsible set if it's not already initialized
+			if ( !collapsibleSet.jqmData( "collapsiblebound" ) ) {
+
+				collapsibleSet
+					.jqmData( "collapsiblebound", true )
+					.bind( "expand", function( event ) {
+
+						$( event.target )
+							.closest( ".ui-collapsible" )
+							.siblings( ".ui-collapsible" )
+							.trigger( "collapse" );
+
+					});
+			}
+
+			collapsiblesInSet.first()
+				.find( "a" )
+					.first()
+					.addClass( "ui-corner-top" )
+						.find( ".ui-btn-inner" )
+							.addClass( "ui-corner-top" );
+
+			collapsiblesInSet.last()
+				.jqmData( "collapsible-last", true )
+				.find( "a" )
+					.first()
+					.addClass( "ui-corner-bottom" )
+						.find( ".ui-btn-inner" )
+							.addClass( "ui-corner-bottom" );
+
+
+			if ( collapsible.jqmData( "collapsible-last" ) ) {
+				collapsibleHeading
+					.find( "a" ).first().add ( collapsibleHeading.find( ".ui-btn-inner" ) )
+						.addClass( "ui-corner-bottom" );
+			}
+		}
+
+		//events
+		collapsible
+			.bind( "expand collapse", function( event ) {
+				if ( !event.isDefaultPrevented() ) {
+
+					event.preventDefault();
+
+					var $this = $( this ),
+						isCollapse = ( event.type === "collapse" ),
+					    contentTheme = o.contentTheme;
+
+					collapsibleHeading
+						.toggleClass( "ui-collapsible-heading-collapsed", isCollapse)
+						.find( ".ui-collapsible-heading-status" )
+							.text( isCollapse ? o.expandCueText : o.collapseCueText )
+						.end()
+						.find( ".ui-icon" )
+							.toggleClass( "ui-icon-minus", !isCollapse )
+							.toggleClass( "ui-icon-plus", isCollapse );
+
+					$this.toggleClass( "ui-collapsible-collapsed", isCollapse );
+					collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse );
+
+					if ( contentTheme && ( !collapsibleSet.length || collapsible.jqmData( "collapsible-last" ) ) ) {
+						collapsibleHeading
+							.find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) )
+							.toggleClass( "ui-corner-bottom", isCollapse );
+						collapsibleContent.toggleClass( "ui-corner-bottom", !isCollapse );
+					}
+					collapsibleContent.trigger( "updatelayout" );
+				}
+			})
+			.trigger( o.collapsed ? "collapse" : "expand" );
+
+		collapsibleHeading
+			.bind( "click", function( event ) {
+
+				var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ?
+										"expand" : "collapse";
+
+				collapsible.trigger( type );
+
+				event.preventDefault();
+			});
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( $.mobile.collapsible.prototype.options.initSelector, e.target ).collapsible();
+});
+
+})( jQuery );
+/*
+* "fieldcontain" plugin - simple class additions to make form row separators
+*/
+
+(function( $, undefined ) {
+
+$.fn.fieldcontain = function( options ) {
+	return this.addClass( "ui-field-contain ui-body ui-br" );
+};
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( ":jqmData(role='fieldcontain')", e.target ).fieldcontain();
+});
+
+})( jQuery );/*
+* plugin for creating CSS grids
+*/
+
+(function( $, undefined ) {
+
+$.fn.grid = function( options ) {
+	return this.each(function() {
+
+		var $this = $( this ),
+			o = $.extend({
+				grid: null
+			},options),
+			$kids = $this.children(),
+			gridCols = {solo:1, a:2, b:3, c:4, d:5},
+			grid = o.grid,
+			iterator;
+
+			if ( !grid ) {
+				if ( $kids.length <= 5 ) {
+					for ( var letter in gridCols ) {
+						if ( gridCols[ letter ] === $kids.length ) {
+							grid = letter;
+						}
+					}
+				} else {
+					grid = "a";
+				}
+			}
+			iterator = gridCols[grid];
+
+		$this.addClass( "ui-grid-" + grid );
+
+		$kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" );
+
+		if ( iterator > 1 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" );
+		}
+		if ( iterator > 2 ) {
+			$kids.filter( ":nth-child(3n+3)" ).addClass( "ui-block-c" );
+		}
+		if ( iterator > 3 ) {
+			$kids.filter( ":nth-child(4n+4)" ).addClass( "ui-block-d" );
+		}
+		if ( iterator > 4 ) {
+			$kids.filter( ":nth-child(5n+5)" ).addClass( "ui-block-e" );
+		}
+	});
+};
+})( jQuery );/*
+* "navbar" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.navbar", $.mobile.widget, {
+	options: {
+		iconpos: "top",
+		grid: null,
+		initSelector: ":jqmData(role='navbar')"
+	},
+
+	_create: function(){
+
+		var $navbar = this.element,
+			$navbtns = $navbar.find( "a" ),
+			iconpos = $navbtns.filter( ":jqmData(icon)" ).length ?
+									this.options.iconpos : undefined;
+
+		$navbar.addClass( "ui-navbar" )
+			.attr( "role","navigation" )
+			.find( "ul" )
+				.grid({ grid: this.options.grid });
+
+		if ( !iconpos ) {
+			$navbar.addClass( "ui-navbar-noicons" );
+		}
+
+		$navbtns.buttonMarkup({
+			corners:	false,
+			shadow:		false,
+			iconpos:	iconpos
+		});
+
+		$navbar.delegate( "a", "vclick", function( event ) {
+			$navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass );
+			$( this ).addClass( $.mobile.activeBtnClass );
+		});
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( $.mobile.navbar.prototype.options.initSelector, e.target ).navbar();
+});
+
+})( jQuery );
+/*
+* "listview" plugin
+*/
+
+(function( $, undefined ) {
+
+//Keeps track of the number of lists per page UID
+//This allows support for multiple nested list in the same page
+//https://github.com/jquery/jquery-mobile/issues/1617
+var listCountPerPage = {};
+
+$.widget( "mobile.listview", $.mobile.widget, {
+	options: {
+		theme: null,
+		countTheme: "c",
+		headerTheme: "b",
+		dividerTheme: "b",
+		splitIcon: "arrow-r",
+		splitTheme: "b",
+		inset: false,
+		initSelector: ":jqmData(role='listview')"
+	},
+
+	_create: function() {
+		var t = this;
+
+		// create listview markup
+		t.element.addClass(function( i, orig ) {
+			return orig + " ui-listview " + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
+		});
+
+		t.refresh( true );
+	},
+
+	_removeCorners: function( li, which ) {
+		var top = "ui-corner-top ui-corner-tr ui-corner-tl",
+			bot = "ui-corner-bottom ui-corner-br ui-corner-bl";
+
+		li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) );
+
+		if ( which === "top" ) {
+			li.removeClass( top );
+		} else if ( which === "bottom" ) {
+			li.removeClass( bot );
+		} else {
+			li.removeClass( top + " " + bot );
+		}
+	},
+
+	_refreshCorners: function( create ) {
+		var $li,
+			$visibleli,
+			$topli,
+			$bottomli;
+
+		if ( this.options.inset ) {
+			$li = this.element.children( "li" );
+			// at create time the li are not visible yet so we need to rely on .ui-screen-hidden
+			$visibleli = create?$li.not( ".ui-screen-hidden" ):$li.filter( ":visible" );
+
+			this._removeCorners( $li );
+
+			// Select the first visible li element
+			$topli = $visibleli.first()
+				.addClass( "ui-corner-top" );
+
+			$topli.add( $topli.find( ".ui-btn-inner" )
+					.not( ".ui-li-link-alt span:first-child" ) )
+                                .addClass( "ui-corner-top" )
+                                .end()
+				.find( ".ui-li-link-alt, .ui-li-link-alt span:first-child" )
+					.addClass( "ui-corner-tr" )
+				.end()
+				.find( ".ui-li-thumb" )
+					.not(".ui-li-icon")
+					.addClass( "ui-corner-tl" );
+
+			// Select the last visible li element
+			$bottomli = $visibleli.last()
+				.addClass( "ui-corner-bottom" );
+
+			$bottomli.add( $bottomli.find( ".ui-btn-inner" ) )
+				.find( ".ui-li-link-alt" )
+					.addClass( "ui-corner-br" )
+				.end()
+				.find( ".ui-li-thumb" )
+					.not(".ui-li-icon")
+					.addClass( "ui-corner-bl" );
+		}
+		if ( !create ) {
+			this.element.trigger( "updatelayout" );
+		}
+	},
+
+	// This is a generic utility method for finding the first
+	// node with a given nodeName. It uses basic DOM traversal
+	// to be fast and is meant to be a substitute for simple
+	// $.fn.closest() and $.fn.children() calls on a single
+	// element. Note that callers must pass both the lowerCase
+	// and upperCase version of the nodeName they are looking for.
+	// The main reason for this is that this function will be
+	// called many times and we want to avoid having to lowercase
+	// the nodeName from the element every time to ensure we have
+	// a match. Note that this function lives here for now, but may
+	// be moved into $.mobile if other components need a similar method.
+	_findFirstElementByTagName: function( ele, nextProp, lcName, ucName )
+	{
+		var dict = {};
+		dict[ lcName ] = dict[ ucName ] = true;
+		while ( ele ) {
+			if ( dict[ ele.nodeName ] ) {
+				return ele;
+			}
+			ele = ele[ nextProp ];
+		}
+		return null;
+	},
+	_getChildrenByTagName: function( ele, lcName, ucName )
+	{
+		var results = [],
+			dict = {};
+		dict[ lcName ] = dict[ ucName ] = true;
+		ele = ele.firstChild;
+		while ( ele ) {
+			if ( dict[ ele.nodeName ] ) {
+				results.push( ele );
+			}
+			ele = ele.nextSibling;
+		}
+		return $( results );
+	},
+
+	_addThumbClasses: function( containers )
+	{
+		var i, img, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			img = $( this._findFirstElementByTagName( containers[ i ].firstChild, "nextSibling", "img", "IMG" ) );
+			if ( img.length ) {
+				img.addClass( "ui-li-thumb" );
+				$( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+			}
+		}
+	},
+
+	refresh: function( create ) {
+		this.parentPage = this.element.closest( ".ui-page" );
+		this._createSubPages();
+
+		var o = this.options,
+			$list = this.element,
+			self = this,
+			dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,
+			listsplittheme = $list.jqmData( "splittheme" ),
+			listspliticon = $list.jqmData( "spliticon" ),
+			li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ),
+			counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,
+			itemClassDict = {},
+			item, itemClass, itemTheme,
+			a, last, splittheme, countParent, icon, imgParents, img;
+
+		if ( counter ) {
+			$list.find( ".ui-li-dec" ).remove();
+		}
+		
+		if ( !o.theme ) {
+			o.theme = $.mobile.getInheritedTheme( this.element, "c" );
+		}
+
+		for ( var pos = 0, numli = li.length; pos < numli; pos++ ) {
+			item = li.eq( pos );
+			itemClass = "ui-li";
+
+			// If we're creating the element, we update it regardless
+			if ( create || !item.hasClass( "ui-li" ) ) {
+				itemTheme = item.jqmData("theme") || o.theme;
+				a = this._getChildrenByTagName( item[ 0 ], "a", "A" );
+
+				if ( a.length ) {
+					icon = item.jqmData("icon");
+
+					icon = false;
+					item.buttonMarkup({
+						wrapperEls: "div",
+						shadow: false,
+						corners: false,
+						iconpos: "right",
+						icon: a.length > 1 || icon === false ? false : icon || "arrow-r",
+						theme: itemTheme
+					});
+
+					if ( ( icon != false ) && ( a.length == 1 ) ) {
+						item.addClass( "ui-li-has-arrow" );
+					}
+
+					a.first().addClass( "ui-link-inherit" );
+
+					if ( a.length > 1 ) {
+						itemClass += " ui-li-has-alt";
+
+						last = a.last();
+						splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;
+
+						last.appendTo(item)
+							.attr( "title", last.getEncodedText() )
+							.addClass( "ui-li-link-alt" )
+							.empty()
+							.buttonMarkup({
+								shadow: false,
+								corners: false,
+								theme: itemTheme,
+								icon: false,
+								iconpos: false
+							})
+							.find( ".ui-btn-inner" )
+								.append(
+									$( document.createElement( "span" ) ).buttonMarkup({
+										shadow: true,
+										corners: true,
+										theme: splittheme,
+										iconpos: "notext",
+										icon: listspliticon || last.jqmData( "icon" ) || o.splitIcon
+									})
+								);
+					}
+				} else if ( item.jqmData( "role" ) === "list-divider" ) {
+
+					itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;
+					item.attr( "role", "heading" );
+
+					//reset counter when a divider heading is encountered
+					if ( counter ) {
+						counter = 1;
+					}
+
+				} else {
+					itemClass += " ui-li-static ui-body-" + itemTheme;
+				}
+			}
+
+			if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+				countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );
+
+				countParent.addClass( "ui-li-jsnumbering" )
+					.prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );
+			}
+
+			// Instead of setting item class directly on the list item and its
+			// btn-inner at this point in time, push the item into a dictionary
+			// that tells us what class to set on it so we can do this after this
+			// processing loop is finished.
+
+			if ( !itemClassDict[ itemClass ] ) {
+				itemClassDict[ itemClass ] = [];
+			}
+
+			itemClassDict[ itemClass ].push( item[ 0 ] );
+		}
+
+		// Set the appropriate listview item classes on each list item
+		// and their btn-inner elements. The main reason we didn't do this
+		// in the for-loop above is because we can eliminate per-item function overhead
+		// by calling addClass() and children() once or twice afterwards. This
+		// can give us a significant boost on platforms like WP7.5.
+
+		for ( itemClass in itemClassDict ) {
+			$( itemClassDict[ itemClass ] ).addClass( itemClass ).children( ".ui-btn-inner" ).addClass( itemClass );
+		}
+
+		$list.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" )
+			.end()
+
+			.find( "p, dl" ).addClass( "ui-li-desc" )
+			.end()
+
+			.find( ".ui-li-aside" ).each(function() {
+					var $this = $(this);
+					$this.prependTo( $this.parent() ); //shift aside to front for css float
+				})
+			.end()
+
+			.find( ".ui-li-count" ).each( function() {
+					$( this ).closest( "li" ).addClass( "ui-li-has-count" );
+				}).addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" );
+
+		// The idea here is to look at the first image in the list item
+		// itself, and any .ui-link-inherit element it may contain, so we
+		// can place the appropriate classes on the image and list item.
+		// Note that we used to use something like:
+		//
+		//    li.find(">img:eq(0), .ui-link-inherit>img:eq(0)").each( ... );
+		//
+		// But executing a find() like that on Windows Phone 7.5 took a
+		// really long time. Walking things manually with the code below
+		// allows the 400 listview item page to load in about 3 seconds as
+		// opposed to 30 seconds.
+
+		this._addThumbClasses( li );
+		this._addThumbClasses( $list.find( ".ui-link-inherit" ) );
+
+		this._refreshCorners( create );
+	},
+
+	//create a string for ID/subpage url creation
+	_idStringEscape: function( str ) {
+		return str.replace(/[^a-zA-Z0-9]/g, '-');
+	},
+
+	_createSubPages: function() {
+		var parentList = this.element,
+			parentPage = parentList.closest( ".ui-page" ),
+			parentUrl = parentPage.jqmData( "url" ),
+			parentId = parentUrl || parentPage[ 0 ][ $.expando ],
+			parentListId = parentList.attr( "id" ),
+			o = this.options,
+			dns = "data-" + $.mobile.ns,
+			self = this,
+			persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),
+			hasSubPages;
+
+		if ( typeof listCountPerPage[ parentId ] === "undefined" ) {
+			listCountPerPage[ parentId ] = -1;
+		}
+
+		parentListId = parentListId || ++listCountPerPage[ parentId ];
+
+		$( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) {
+			var self = this,
+				list = $( this ),
+				listId = list.attr( "id" ) || parentListId + "-" + i,
+				parent = list.parent(),
+				nodeEls = $( list.prevAll().toArray().reverse() ),
+				nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim(parent.contents()[ 0 ].nodeValue) + "</span>" ),
+				title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text
+				id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,
+				theme = list.jqmData( "theme" ) || o.theme,
+				countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,
+				newPage, anchor;
+
+			//define hasSubPages for use in later removal
+			hasSubPages = true;
+
+			newPage = list.detach()
+						.wrap( "<div " + dns + "role='page' " +	dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )
+						.parent()
+							.before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )
+							.after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='"+ persistentFooterID +"'>") : "" )
+							.parent()
+								.appendTo( $.mobile.pageContainer );
+
+			newPage.page();
+
+			anchor = parent.find('a:first');
+
+			if ( !anchor.length ) {
+				anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );
+			}
+
+			anchor.attr( "href", "#" + id );
+
+		}).listview();
+
+		// on pagehide, remove any nested pages along with the parent page, as long as they aren't active
+		// and aren't embedded
+		if( hasSubPages &&
+			parentPage.is( ":jqmData(external-page='true')" ) &&
+			parentPage.data("page").options.domCache === false ) {
+
+			var newRemove = function( e, ui ){
+				var nextPage = ui.nextPage, npURL;
+
+				if( ui.nextPage ){
+					npURL = nextPage.jqmData( "url" );
+					if( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ){
+						self.childPages().remove();
+						parentPage.remove();
+					}
+				}
+			};
+
+			// unbind the original page remove and replace with our specialized version
+			parentPage
+				.unbind( "pagehide.remove" )
+				.bind( "pagehide.remove", newRemove);
+		}
+	},
+
+	// TODO sort out a better way to track sub pages of the listview this is brittle
+	childPages: function(){
+		var parentUrl = this.parentPage.jqmData( "url" );
+
+		return $( ":jqmData(url^='"+  parentUrl + "&" + $.mobile.subPageUrlKey +"')");
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( $.mobile.listview.prototype.options.initSelector, e.target ).listview();
+});
+
+})( jQuery );
+/*
+* "listview" filter extension
+*/
+
+(function( $, undefined ) {
+
+$.mobile.listview.prototype.options.filter = false;
+$.mobile.listview.prototype.options.filterPlaceholder = "Filter items...";
+$.mobile.listview.prototype.options.filterTheme = "c";
+$.mobile.listview.prototype.options.filterCallback = function( text, searchValue ){
+	return text.toLowerCase().indexOf( searchValue ) === -1;
+};
+
+$( ":jqmData(role='listview')" ).live( "listviewcreate", function() {
+
+	var list = $( this ),
+		listview = list.data( "listview" );
+
+	if ( !listview.options.filter ) {
+		return;
+	}
+
+	var wrapper = $( "<form>", {
+			"class": "ui-listview-filter ui-bar-" + listview.options.filterTheme,
+			"role": "search"
+		}),
+		search = $( "<input>", {
+			placeholder: listview.options.filterPlaceholder
+		})
+		.attr( "data-" + $.mobile.ns + "type", "search" )
+		.jqmData( "lastval", "" )
+		.bind( "keyup change", function() {
+
+			var $this = $(this),
+				val = this.value.toLowerCase(),
+				listItems = null,
+				lastval = $this.jqmData( "lastval" ) + "",
+				childItems = false,
+				itemtext = "",
+				item, change;
+
+			// Change val as lastval for next execution
+			$this.jqmData( "lastval" , val );
+			change = val.substr( 0 , lastval.length - 1 ).replace( lastval , "" );
+
+			if ( val.length < lastval.length || change.length != ( val.length - lastval.length ) ) {
+
+				// Removed chars or pasted something totally different, check all items
+				listItems = list.children();
+			} else {
+
+				// Only chars added, not removed, only use visible subset
+				listItems = list.children( ":not(.ui-screen-hidden)" );
+			}
+
+			if ( val ) {
+
+				// This handles hiding regular rows without the text we search for
+				// and any list dividers without regular rows shown under it
+
+				for ( var i = listItems.length - 1; i >= 0; i-- ) {
+					item = $( listItems[ i ] );
+					itemtext = item.jqmData( "filtertext" ) || item.text();
+
+					if ( item.is( "li:jqmData(role=list-divider)" ) ) {
+
+						item.toggleClass( "ui-filter-hidequeue" , !childItems );
+
+						// New bucket!
+						childItems = false;
+
+					} else if ( listview.options.filterCallback( itemtext, val ) ) {
+
+						//mark to be hidden
+						item.toggleClass( "ui-filter-hidequeue" , true );
+					} else {
+
+						// There's a shown item in the bucket
+						childItems = true;
+					}
+				}
+
+				// Show items, not marked to be hidden
+				listItems
+					.filter( ":not(.ui-filter-hidequeue)" )
+					.toggleClass( "ui-screen-hidden", false );
+
+				// Hide items, marked to be hidden
+				listItems
+					.filter( ".ui-filter-hidequeue" )
+					.toggleClass( "ui-screen-hidden", true )
+					.toggleClass( "ui-filter-hidequeue", false );
+
+			} else {
+
+				//filtervalue is empty => show all
+				listItems.toggleClass( "ui-screen-hidden", false );
+			}
+			listview._refreshCorners();
+		})
+		.appendTo( wrapper )
+		.textinput();
+
+	if ( $( this ).jqmData( "inset" ) ) {
+		wrapper.addClass( "ui-listview-filter-inset" );
+	}
+
+	wrapper.bind( "submit", function() {
+		return false;
+	})
+	.insertBefore( list );
+});
+
+})( jQuery );/*
+* "nojs" plugin - class to make elements hidden to A grade browsers
+*/
+
+(function( $, undefined ) {
+
+$( document ).bind( "pagecreate create", function( e ){
+	$( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" );
+	
+});
+
+})( jQuery );/*
+* "checkboxradio" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.checkboxradio", $.mobile.widget, {
+	options: {
+		theme: null,
+		initSelector: "input[type='checkbox'],input[type='radio']"
+	},
+	_create: function() {
+		var self = this,
+			input = this.element,
+			// NOTE: Windows Phone could not find the label through a selector
+			// filter works though.
+			label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label[for='" + input[ 0 ].id + "']"),
+			inputtype = input.attr( "type" ),
+			checkedState = inputtype + "-on",
+			uncheckedState = inputtype + "-off",
+			icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState,
+			activeBtn = icon ? "" : " " + $.mobile.activeBtnClass,
+			checkedClass = "ui-" + checkedState + activeBtn,
+			uncheckedClass = "ui-" + uncheckedState,
+			checkedicon = "ui-icon-" + checkedState,
+			uncheckedicon = "ui-icon-" + uncheckedState;
+
+		var checkedpressedicon = checkedicon + "-press",
+			uncheckedpressedicon = uncheckedicon + "-press";
+
+		if ( inputtype !== "checkbox" && inputtype !== "radio" ) {
+			return;
+		}
+
+		// Support fake label
+		if ( label.length == 0 ) {
+			label = $( "<label for='" + input[ 0 ].id  +
+				"' style='display:block;width:1px;height:1px;'></label>" );
+		}
+
+		// Wrap the input + label in a div
+		input.add( label )
+			.wrapAll( "<div class='ui-" + inputtype + "'></div>" );
+
+		// Expose for other methods
+		$.extend( this, {
+			label: label,
+			inputtype: inputtype,
+			checkedClass: checkedClass,
+			uncheckedClass: uncheckedClass,
+			checkedicon: checkedicon,
+			checkedpressedicon: checkedpressedicon,
+			uncheckedpressedicon: uncheckedpressedicon,
+			uncheckedicon: uncheckedicon
+		});
+
+		// If there's no selected theme...
+		if( !this.options.theme ) {
+			this.options.theme = this.element.jqmData( "theme" );
+		}
+
+		label.buttonMarkup({
+			theme: this.options.theme,
+			icon: icon,
+			shadow: false
+		});
+
+		if ( input.hasClass( "favorite" ) ) {
+			input.parent().addClass( "favorite" ).end();
+		}
+
+		label.bind({
+			vmousedown: function() {
+				self.press();
+			},
+			vmouseup: function() {
+				self.unpress();
+			},
+
+
+			vmouseover: function( event ) {
+				if ( $( this ).parent().is( ".ui-disabled" ) ) {
+					event.stopPropagation();
+				}
+			},
+
+			vclick: function( event ) {
+				if ( input.is( ":disabled" ) ) {
+					event.preventDefault();
+					return;
+				}
+
+				self._cacheVals();
+
+				input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) );
+
+				// trigger click handler's bound directly to the input as a substitute for
+				// how label clicks behave normally in the browsers
+				// TODO: it would be nice to let the browser's handle the clicks and pass them
+				//       through to the associate input. we can swallow that click at the parent
+				//       wrapper element level
+				input.triggerHandler( 'click' );
+
+				// Input set for common radio buttons will contain all the radio
+				// buttons, but will not for checkboxes. clearing the checked status
+				// of other radios ensures the active button state is applied properly
+				self._getInputSet().not( input ).prop( "checked", false );
+
+				self._updateAll();
+				return false;
+			}
+
+		});
+
+		input
+			.bind({
+				vmousedown: function() {
+					self._cacheVals();
+				},
+
+				vclick: function() {
+					var $this = $(this);
+
+					// Adds checked attribute to checked input when keyboard is used
+					if ( $this.is( ":checked" ) ) {
+
+						$this.prop( "checked", true);
+						self._getInputSet().not($this).prop( "checked", false );
+					} else {
+
+						$this.prop( "checked", false );
+					}
+
+					self._updateAll();
+				},
+
+				focus: function() {
+					label.addClass( "ui-focus" );
+				},
+
+				blur: function() {
+					label.removeClass( "ui-focus" );
+				}
+			});
+
+		this.refresh();
+	},
+
+	_cacheVals: function() {
+		this._getInputSet().each(function() {
+			var $this = $(this);
+
+			$this.jqmData( "cacheVal", $this.is( ":checked" ) );
+		});
+	},
+
+	//returns either a set of radios with the same name attribute, or a single checkbox
+	_getInputSet: function(){
+		if(this.inputtype == "checkbox") {
+			return this.element;
+		}
+
+		return this.element.closest( "form,fieldset,:jqmData(role='page')" )
+			.find( "input[name='"+ this.element.attr( "name" ) +"'][type='"+ this.inputtype +"']" );
+	},
+
+	_updateAll: function() {
+		var self = this;
+
+		this._getInputSet().each(function() {
+			var $this = $(this);
+
+			if ( $this.is( ":checked" ) || self.inputtype === "checkbox" ) {
+				$this.trigger( "change" );
+			}
+		})
+		.checkboxradio( "refresh" );
+	},
+
+	press: function() {
+		var input = this.element,
+			label = this.label,
+			icon = label.find( ".ui-icon" );
+
+		if ( !$( input[ 0 ] ).is( ":disabled" ) ) {
+			if ( $( input[ 0 ] ).prop( "checked" ) ) {
+				icon.addClass( this.uncheckedpressedicon ).removeClass( this.checkedicon );
+			} else {
+				icon.removeClass( this.uncheckedicon ).addClass( this.checkedpressedicon );
+			}
+		}
+	},
+
+	unpress: function() {
+		var input = this.element,
+			label = this.label,
+			icon = label.find( ".ui-icon" );
+
+		if ( !$( input[ 0 ] ).is( ":disabled" ) ) {
+			if ( $( input[ 0 ] ).prop( "checked" ) ) {
+				icon.removeClass( this.uncheckedpressedicon ).addClass( this.uncheckedicon );
+			} else {
+				icon.addClass( this.checkedicon ).removeClass( this.checkedpressedicon );
+			}
+		}
+	},
+
+	refresh: function() {
+		var input = this.element,
+			label = this.label,
+			icon = label.find( ".ui-icon" );
+
+		// input[0].checked expando doesn't always report the proper value
+		// for checked='checked'
+		if ( $( input[ 0 ] ).prop( "checked" ) ) {
+
+			label.addClass( this.checkedClass ).removeClass( this.uncheckedClass );
+			icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon );
+
+		} else {
+
+			label.removeClass( this.checkedClass ).addClass( this.uncheckedClass );
+			icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon );
+		}
+
+		if ( input.is( ":disabled" ) ) {
+			this.disable();
+		} else {
+			this.enable();
+		}
+	},
+
+	disable: function() {
+		this.element.prop( "disabled", true ).parent().addClass( "ui-disabled" );
+	},
+
+	enable: function() {
+		this.element.prop( "disabled", false ).parent().removeClass( "ui-disabled" );
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.checkboxradio.prototype.enhanceWithin( e.target );
+});
+
+})( jQuery );
+/*
+* "button" plugin - links that proxy to native input/buttons
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.button", $.mobile.widget, {
+	options: {
+		theme: null,
+		icon: null,
+		iconpos: null,
+		inline: null,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		initSelector: "button, [type='button'], [type='submit'], [type='reset'], [type='image']"
+	},
+	_create: function() {
+		var $el = this.element,
+			o = this.options,
+			type,
+			name,
+			$buttonPlaceholder;
+
+		// Add ARIA role
+		this.button = $( "<div></div>" )
+			.text( $el.text() || $el.val() )
+			.insertBefore( $el )
+			.buttonMarkup({
+				theme: o.theme,
+				icon: o.icon,
+				iconpos: o.iconpos,
+				inline: o.inline,
+				corners: o.corners,
+				shadow: o.shadow,
+				iconshadow: o.iconshadow
+			})
+			.append( $el.addClass( "ui-btn-hidden" ) );
+
+		type = $el.attr( "type" );
+		name = $el.attr( "name" );
+
+		// Add hidden input during submit if input type="submit" has a name.
+		if ( type !== "button" && type !== "reset" && name ) {
+				$el.bind( "vclick", function() {
+					// Add hidden input if it doesn’t already exist.
+					if( $buttonPlaceholder === undefined ) {
+						$buttonPlaceholder = $( "<input>", {
+							type: "hidden",
+							name: $el.attr( "name" ),
+							value: $el.attr( "value" )
+						}).insertBefore( $el );
+
+						// Bind to doc to remove after submit handling
+						$( document ).one("submit", function(){
+							$buttonPlaceholder.remove();
+
+							// reset the local var so that the hidden input
+							// will be re-added on subsequent clicks
+							$buttonPlaceholder = undefined;
+						});
+					}
+				});
+		}
+
+		this.refresh();
+	},
+
+	enable: function() {
+		this.element.attr( "disabled", false );
+		this.button.removeClass( "ui-disabled" ).attr( "aria-disabled", false );
+		return this._setOption( "disabled", false );
+	},
+
+	disable: function() {
+		this.element.attr( "disabled", true );
+		this.button.addClass( "ui-disabled" ).attr( "aria-disabled", true );
+		return this._setOption( "disabled", true );
+	},
+
+	refresh: function() {
+		var $el = this.element;
+
+		if ( $el.prop("disabled") ) {
+			this.disable();
+		} else {
+			this.enable();
+		}
+
+		// the textWrapper is stored as a data element on the button object
+		// to prevent referencing by it's implementation details (eg 'class')
+		this.button.data( 'textWrapper' ).text( $el.text() || $el.val() );
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.button.prototype.enhanceWithin( e.target );
+});
+
+})( jQuery );/*
+* "slider" plugin
+*/
+
+( function( $, undefined ) {
+
+$.widget( "mobile.slider", $.mobile.widget, {
+	options: {
+		theme: null,
+		trackTheme: null,
+		disabled: false,
+		initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')"
+	},
+
+	_create: function() {
+
+		// TODO: Each of these should have comments explain what they're for
+		var self = this,
+
+			control = this.element,
+
+			parentTheme = $.mobile.getInheritedTheme( control, "c" ),
+
+			theme = this.options.theme || parentTheme,
+
+			trackTheme = this.options.trackTheme || parentTheme,
+
+			cType = control[ 0 ].nodeName.toLowerCase(),
+
+			selectClass = ( cType == "select" ) ? "ui-slider-switch" : "",
+
+			controlID = control.attr( "id" ),
+
+			labelID = controlID + "-label",
+
+			label = $( "[for='"+ controlID +"']" ).attr( "id", labelID ),
+
+			val = function() {
+				return  cType == "input"  ? parseFloat( control.val() ) : control[0].selectedIndex;
+			},
+
+			min =  cType == "input" ? parseFloat( control.attr( "min" ) ) : 0,
+
+			max =  cType == "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length-1,
+
+			step = window.parseFloat( control.attr( "step" ) || 1 ),
+
+			slider = $( "<div class='ui-slider " + selectClass + " ui-btn-down-" + trackTheme +
+									" ui-btn-corner-all' role='application'></div>" ),
+
+			handle = $( "<a href='#' class='ui-slider-handle'></a>" )
+				.appendTo( slider )
+				.buttonMarkup({ corners: true, theme: theme, shadow: true })
+				.attr({
+					"role": "slider",
+					"aria-valuemin": min,
+					"aria-valuemax": max,
+					"aria-valuenow": val(),
+					"aria-valuetext": val(),
+					"title": val(),
+					"aria-labelledby": labelID
+				}),
+			options;
+
+		$.extend( this, {
+			slider: slider,
+			handle: handle,
+			dragging: false,
+			beforeStart: null,
+			userModified: false,
+			mouseMoved: false
+		});
+
+		if ( cType == "select" ) {
+
+			slider.wrapInner( "<div class='ui-slider-inneroffset'></div>" );
+			
+			// make the handle move with a smooth transition
+			handle.addClass( "ui-slider-handle-snapping" );
+
+			options = control.find( "option" );
+
+			control.find( "option" ).each(function( i ) {
+
+				var side = !i ? "b":"a",
+					corners = !i ? "right" :"left",
+					theme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass );
+
+				$( "<div class='ui-slider-labelbg ui-slider-labelbg-" + side + theme + " ui-btn-corner-" + corners + "'></div>" )
+					.prependTo( slider );
+
+				$( "<span class='ui-slider-label ui-slider-label-" + side + theme + " ui-btn-corner-" + corners + "' role='img'>" + $( this ).getEncodedText() + "</span>" )
+					.prependTo( handle );
+			});
+
+		}
+
+		label.addClass( "ui-slider" );
+
+		// monitor the input for updated values
+		control.addClass( cType === "input" ? "ui-slider-input" : "ui-slider-switch" )
+			.change( function() {
+				// if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again
+				if (!self.mouseMoved) {
+					self.refresh( val(), true );
+				}
+			})
+			.keyup( function() { // necessary?
+				self.refresh( val(), true, true );
+			})
+			.blur( function() {
+				self.refresh( val(), true );
+			});
+
+		// prevent screen drag when slider activated
+		$( document ).bind( "vmousemove", function( event ) {
+			if ( self.dragging ) {
+				// self.mouseMoved must be updated before refresh() because it will be used in the control "change" event
+				self.mouseMoved = true;
+				
+				if ( cType === "select" ) {
+					// make the handle move in sync with the mouse
+					handle.removeClass( "ui-slider-handle-snapping" );
+				}
+				
+				self.refresh( event );
+				
+				// only after refresh() you can calculate self.userModified
+				self.userModified = self.beforeStart !== control[0].selectedIndex;
+				return false;
+			}
+		});
+
+		slider.bind( "vmousedown", function( event ) {
+			self.dragging = true;
+			self.userModified = false;
+			self.mouseMoved = false;
+
+			if ( cType === "select" ) {
+				self.beforeStart = control[0].selectedIndex;
+			}
+			
+			self.refresh( event );
+			return false;
+		});
+
+		slider.add( document )
+			.bind( "vmouseup", function() {
+				if ( self.dragging ) {
+
+					self.dragging = false;
+
+					if ( cType === "select") {
+					
+						// make the handle move with a smooth transition
+						handle.addClass( "ui-slider-handle-snapping" );
+					
+						if ( self.mouseMoved ) {
+						
+							// this is a drag, change the value only if user dragged enough
+							if ( self.userModified ) {
+								self.refresh( self.beforeStart == 0 ? 1 : 0 );
+							}
+							else {
+								self.refresh( self.beforeStart );
+							}
+							
+						}
+						else {
+							// this is just a click, change the value
+							self.refresh( self.beforeStart == 0 ? 1 : 0 );
+						}
+						
+					}
+					
+					self.mouseMoved = false;
+					
+					return false;
+				}
+			});
+
+		slider.insertAfter( control );
+
+		// NOTE force focus on handle
+		this.handle
+			.bind( "vmousedown", function() {
+				$( this ).focus();
+			})
+			.bind( "vclick", false );
+
+		this.handle
+			.bind( "keydown", function( event ) {
+				var index = val();
+
+				if ( self.options.disabled ) {
+					return;
+				}
+
+				// In all cases prevent the default and mark the handle as active
+				switch ( event.keyCode ) {
+				 case $.mobile.keyCode.HOME:
+				 case $.mobile.keyCode.END:
+				 case $.mobile.keyCode.PAGE_UP:
+				 case $.mobile.keyCode.PAGE_DOWN:
+				 case $.mobile.keyCode.UP:
+				 case $.mobile.keyCode.RIGHT:
+				 case $.mobile.keyCode.DOWN:
+				 case $.mobile.keyCode.LEFT:
+					event.preventDefault();
+
+					if ( !self._keySliding ) {
+						self._keySliding = true;
+						$( this ).addClass( "ui-state-active" );
+					}
+					break;
+				}
+
+				// move the slider according to the keypress
+				switch ( event.keyCode ) {
+				 case $.mobile.keyCode.HOME:
+					self.refresh( min );
+					break;
+				 case $.mobile.keyCode.END:
+					self.refresh( max );
+					break;
+				 case $.mobile.keyCode.PAGE_UP:
+				 case $.mobile.keyCode.UP:
+				 case $.mobile.keyCode.RIGHT:
+					self.refresh( index + step );
+					break;
+				 case $.mobile.keyCode.PAGE_DOWN:
+				 case $.mobile.keyCode.DOWN:
+				 case $.mobile.keyCode.LEFT:
+					self.refresh( index - step );
+					break;
+				}
+			}) // remove active mark
+			.keyup( function( event ) {
+				if ( self._keySliding ) {
+					self._keySliding = false;
+					$( this ).removeClass( "ui-state-active" );
+				}
+			});
+
+		this.refresh(undefined, undefined, true);
+	},
+
+	refresh: function( val, isfromControl, preventInputUpdate ) {
+
+		if ( this.options.disabled || this.element.attr('disabled')) { 
+			this.disable();
+		}
+
+		var control = this.element, percent,
+			cType = control[0].nodeName.toLowerCase(),
+			min = cType === "input" ? parseFloat( control.attr( "min" ) ) : 0,
+			max = cType === "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length - 1;
+
+		if ( typeof val === "object" ) {
+			var data = val,
+				// a slight tolerance helped get to the ends of the slider
+				tol = 8;
+			if ( !this.dragging ||
+					data.pageX < this.slider.offset().left - tol ||
+					data.pageX > this.slider.offset().left + this.slider.width() + tol ) {
+				return;
+			}
+			percent = Math.round( ( ( data.pageX - this.slider.offset().left ) / this.slider.width() ) * 100 );
+		} else {
+			if ( val == null ) {
+				val = cType === "input" ? parseFloat( control.val() ) : control[0].selectedIndex;
+			}
+			percent = ( parseFloat( val ) - min ) / ( max - min ) * 100;
+		}
+
+		if ( isNaN( percent ) ) {
+			return;
+		}
+
+		if ( percent < 0 ) {
+			percent = 0;
+		}
+
+		if ( percent > 100 ) {
+			percent = 100;
+		}
+
+		var newval = Math.round( ( percent / 100 ) * ( max - min ) ) + min;
+
+		if ( newval < min ) {
+			newval = min;
+		}
+
+		if ( newval > max ) {
+			newval = max;
+		}
+
+		// Flip the stack of the bg colors
+		if ( percent > 60 && cType === "select" ) {
+			// TODO: Dead path?
+		}
+		this.handle.css( "left", percent + "%" );
+		this.handle.attr( {
+				"aria-valuenow": cType === "input" ? newval : control.find( "option" ).eq( newval ).attr( "value" ),
+				"aria-valuetext": cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText(),
+				title: newval
+			});
+
+		// add/remove classes for flip toggle switch
+		if ( cType === "select" ) {
+			if ( newval === 0 ) {
+				this.slider.addClass( "ui-slider-switch-a" )
+					.removeClass( "ui-slider-switch-b" );
+			} else {
+				this.slider.addClass( "ui-slider-switch-b" )
+					.removeClass( "ui-slider-switch-a" );
+			}
+		}
+
+		if ( !preventInputUpdate ) {
+			var valueChanged = false;
+
+			// update control"s value
+			if ( cType === "input" ) {
+				valueChanged = control.val() !== newval;
+				control.val( newval );
+			} else {
+				valueChanged = control[ 0 ].selectedIndex !== newval;
+				control[ 0 ].selectedIndex = newval;
+			}
+			if ( !isfromControl && valueChanged ) {
+				control.trigger( "change" );
+			}
+		}
+	},
+
+	enable: function() {
+		this.element.attr( "disabled", false );
+		this.slider.removeClass( "ui-disabled" ).attr( "aria-disabled", false );
+		return this._setOption( "disabled", false );
+	},
+
+	disable: function() {
+		this.element.attr( "disabled", true );
+		this.slider.addClass( "ui-disabled" ).attr( "aria-disabled", true );
+		return this._setOption( "disabled", true );
+	}
+
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.slider.prototype.enhanceWithin( e.target );
+});
+
+})( jQuery );
+/*
+* "textinput" plugin for text inputs, textareas
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.textinput", $.mobile.widget, {
+	options: {
+		theme: null,
+		initSelector: "input[type='text'], input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])"
+	},
+
+	_create: function() {
+
+		var input = this.element,
+			o = this.options,
+			theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
+			themeclass  = " ui-body-" + theme,
+			focusedEl, clearbtn;
+
+		$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+		focusedEl = input.addClass("ui-input-text ui-body-"+ theme );
+
+		// XXX: Temporary workaround for issue 785 (Apple bug 8910589).
+		//      Turn off autocorrect and autocomplete on non-iOS 5 devices
+		//      since the popup they use can't be dismissed by the user. Note
+		//      that we test for the presence of the feature by looking for
+		//      the autocorrect property on the input element. We currently
+		//      have no test for iOS 5 or newer so we're temporarily using
+		//      the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas
+		if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) {
+			// Set the attribute instead of the property just in case there
+			// is code that attempts to make modifications via HTML.
+			input[0].setAttribute( "autocorrect", "off" );
+			input[0].setAttribute( "autocomplete", "off" );
+		}
+
+
+		input.addClass( "ui-corner-all ui-shadow-inset" + themeclass );
+
+		input.focus(function() {
+				focusedEl.addClass( "ui-focus" );
+			})
+			.blur(function(){
+				focusedEl.removeClass( "ui-focus" );
+			});
+
+		// Autogrow
+		if ( input.is( "textarea" ) ) {
+			var extraLineHeight = 15,
+				keyupTimeoutBuffer = 100,
+				keyup = function() {
+					var scrollHeight = input[ 0 ].scrollHeight,
+						clientHeight = input[ 0 ].clientHeight;
+
+					if ( clientHeight < scrollHeight ) {
+						input.height(scrollHeight + extraLineHeight);
+					}
+				},
+				keyupTimeout;
+
+			input.keyup(function() {
+				clearTimeout( keyupTimeout );
+				keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer );
+			});
+
+			// Issue 509: the browser is not providing scrollHeight properly until the styles load
+			if ( $.trim( input.val() ) ) {
+				// bind to the window load to make sure the height is calculated based on BOTH
+				// the DOM and CSS
+				$( window ).load( keyup );
+
+				// binding to pagechange here ensures that for pages loaded via
+				// ajax the height is recalculated without user input
+				$( document ).one( "pagechange", keyup );
+			}
+		}
+	},
+
+	disable: function(){
+		this.element.attr( "disabled", true ).addClass( "ui-disabled" );
+	},
+
+	enable: function(){
+		this.element.attr( "disabled", false).removeClass( "ui-disabled" );
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.textinput.prototype.enhanceWithin( e.target );
+});
+
+})( jQuery );
+/*
+* custom "selectmenu" plugin
+*/
+
+(function( $, undefined ) {
+	var extendSelect = function( widget ){
+
+		var select = widget.select,
+			selectID  = widget.selectID,
+			label = widget.label,
+			thisPage = widget.select.closest( ".ui-page" ),
+			screen = $( "<div>", {"class": "ui-selectmenu-screen ui-screen-hidden"} ).appendTo( thisPage ),
+			selectOptions = widget._selectOptions(),
+			isMultiple = widget.isMultiple = widget.select[ 0 ].multiple,
+			buttonId = selectID + "-button",
+			menuId = selectID + "-menu",
+			menuPage = $( "<div data-" + $.mobile.ns + "role='dialog' data-" +$.mobile.ns + "theme='"+ widget.options.theme +"' data-" +$.mobile.ns + "overlay-theme='"+ widget.options.overlayTheme +"'>" +
+				"<div data-" + $.mobile.ns + "role='header'>" +
+				"<div class='ui-title'>" + label.getEncodedText() + "</div>"+
+				"</div>"+
+				"<div data-" + $.mobile.ns + "role='content'></div>"+
+				"</div>" ).appendTo( $.mobile.pageContainer ).page(),
+
+			listbox =  $("<div>", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-" + widget.options.overlayTheme + " " + $.mobile.defaultDialogTransition } ).insertAfter(screen),
+
+			list = $( "<ul>", {
+				"class": "ui-selectmenu-list",
+				"id": menuId,
+				"role": "listbox",
+				"aria-labelledby": buttonId
+			}).attr( "data-" + $.mobile.ns + "theme", widget.options.theme ).appendTo( listbox ),
+
+			header = $( "<div>", {
+				"class": "ui-header ui-bar-" + widget.options.theme
+			}).prependTo( listbox ),
+
+			headerTitle = $( "<h1>", {
+				"class": "ui-title"
+			}).appendTo( header ),
+
+			headerClose = $( "<a>", {
+				"text": widget.options.closeText,
+				"href": "#",
+				"class": "ui-btn-left"
+			}).attr( "data-" + $.mobile.ns + "iconpos", "notext" ).attr( "data-" + $.mobile.ns + "icon", "delete" ).appendTo( header ).buttonMarkup(),
+
+			menuPageContent = menuPage.find( ".ui-content" ),
+
+			menuPageClose = menuPage.find( ".ui-header a" );
+
+
+		$.extend( widget, {
+			select: widget.select,
+			selectID: selectID,
+			buttonId: buttonId,
+			menuId: menuId,
+			thisPage: thisPage,
+			menuPage: menuPage,
+			label: label,
+			screen: screen,
+			selectOptions: selectOptions,
+			isMultiple: isMultiple,
+			theme: widget.options.theme,
+			listbox: listbox,
+			list: list,
+			header: header,
+			headerTitle: headerTitle,
+			headerClose: headerClose,
+			menuPageContent: menuPageContent,
+			menuPageClose: menuPageClose,
+			placeholder: "",
+
+			build: function() {
+				var self = this;
+
+				// Create list from select, update state
+				self.refresh();
+
+				self.select.attr( "tabindex", "-1" ).focus(function() {
+					$( this ).blur();
+					self.button.focus();
+				});
+
+				// Button events
+				self.button.bind( "vclick keydown" , function( event ) {
+					if ( event.type == "vclick" ||
+							 event.keyCode && ( event.keyCode === $.mobile.keyCode.ENTER ||
+																	event.keyCode === $.mobile.keyCode.SPACE ) ) {
+
+						self.open();
+						event.preventDefault();
+					}
+				});
+
+				// Events for list items
+				self.list.attr( "role", "listbox" )
+					.delegate( ".ui-li>a", "focusin", function() {
+						$( this ).attr( "tabindex", "0" );
+					})
+					.delegate( ".ui-li>a", "focusout", function() {
+						$( this ).attr( "tabindex", "-1" );
+					})
+					.delegate( "li:not(.ui-disabled, .ui-li-divider)", "click", function( event ) {
+
+						// index of option tag to be selected
+						var oldIndex = self.select[ 0 ].selectedIndex,
+							newIndex = self.list.find( "li:not(.ui-li-divider)" ).index( this ),
+							option = self._selectOptions().eq( newIndex )[ 0 ];
+
+						// toggle selected status on the tag for multi selects
+						option.selected = self.isMultiple ? !option.selected : true;
+
+						// toggle checkbox class for multiple selects
+						if ( self.isMultiple ) {
+							$( this ).find( ".ui-icon" )
+								.toggleClass( "ui-icon-checkbox-on", option.selected )
+								.toggleClass( "ui-icon-checkbox-off", !option.selected );
+						}
+
+						// trigger change if value changed
+						if ( self.isMultiple || oldIndex !== newIndex ) {
+							self.select.trigger( "change" );
+						}
+
+						//hide custom select for single selects only
+						if ( !self.isMultiple ) {
+							self.close();
+						}
+
+						event.preventDefault();
+					})
+					.keydown(function( event ) {  //keyboard events for menu items
+						var target = $( event.target ),
+							li = target.closest( "li" ),
+							prev, next;
+
+						// switch logic based on which key was pressed
+						switch ( event.keyCode ) {
+							// up or left arrow keys
+						 case 38:
+							prev = li.prev();
+
+							// if there's a previous option, focus it
+							if ( prev.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								prev.find( "a" ).first().focus();
+							}
+
+							return false;
+							break;
+
+							// down or right arrow keys
+						 case 40:
+							next = li.next();
+
+							// if there's a next option, focus it
+							if ( next.length ) {
+								target
+									.blur()
+									.attr( "tabindex", "-1" );
+
+								next.find( "a" ).first().focus();
+							}
+
+							return false;
+							break;
+
+							// If enter or space is pressed, trigger click
+						 case 13:
+						 case 32:
+							target.trigger( "click" );
+
+							return false;
+							break;
+						}
+					});
+
+				// button refocus ensures proper height calculation
+				// by removing the inline style and ensuring page inclusion
+				self.menuPage.bind( "pagehide", function() {
+					self.list.appendTo( self.listbox );
+					self._focusButton();
+
+					// TODO centralize page removal binding / handling in the page plugin.
+					// Suggestion from @jblas to do refcounting
+					//
+					// TODO extremely confusing dependency on the open method where the pagehide.remove
+					// bindings are stripped to prevent the parent page from disappearing. The way
+					// we're keeping pages in the DOM right now sucks
+					//
+					// rebind the page remove that was unbound in the open function
+					// to allow for the parent page removal from actions other than the use
+					// of a dialog sized custom select
+					//
+					// doing this here provides for the back button on the custom select dialog
+					$.mobile._bindPageRemove.call( self.thisPage );
+				});
+
+				// Events on "screen" overlay
+				self.screen.bind( "vclick", function( event ) {
+					self.close();
+				});
+
+				// Close button on small overlays
+				self.headerClose.click( function() {
+					if ( self.menuType == "overlay" ) {
+						self.close();
+						return false;
+					}
+				});
+
+				// track this dependency so that when the parent page
+				// is removed on pagehide it will also remove the menupage
+				self.thisPage.addDependents( this.menuPage );
+			},
+
+			_isRebuildRequired: function() {
+				var list = this.list.find( "li" ),
+					options = this._selectOptions();
+
+				// TODO exceedingly naive method to determine difference
+				// ignores value changes etc in favor of a forcedRebuild
+				// from the user in the refresh method
+				return options.text() !== list.text();
+			},
+
+			refresh: function( forceRebuild , foo ){
+				var self = this,
+				select = this.element,
+				isMultiple = this.isMultiple,
+				options = this._selectOptions(),
+				selected = this.selected(),
+				// return an array of all selected index's
+				indicies = this.selectedIndices();
+
+				if (  forceRebuild || this._isRebuildRequired() ) {
+					self._buildList();
+				}
+
+				self.setButtonText();
+				self.setButtonCount();
+
+				self.list.find( "li:not(.ui-li-divider)" )
+					.removeClass( $.mobile.activeBtnClass )
+					.attr( "aria-selected", false )
+					.each(function( i ) {
+
+						if ( $.inArray( i, indicies ) > -1 ) {
+							var item = $( this );
+
+							// Aria selected attr
+							item.attr( "aria-selected", true );
+
+							// Multiple selects: add the "on" checkbox state to the icon
+							if ( self.isMultiple ) {
+								item.find( ".ui-icon" ).removeClass( "ui-icon-checkbox-off" ).addClass( "ui-icon-checkbox-on" );
+							} else {
+								item.addClass( $.mobile.activeBtnClass );
+							}
+						}
+					});
+			},
+
+			close: function() {
+				if ( this.options.disabled || !this.isOpen ) {
+					return;
+				}
+
+				var self = this;
+
+				if ( self.menuType == "page" ) {
+					// doesn't solve the possible issue with calling change page
+					// where the objects don't define data urls which prevents dialog key
+					// stripping - changePage has incoming refactor
+					window.history.back();
+				} else {
+					self.screen.addClass( "ui-screen-hidden" );
+					self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass( "in" );
+					self.list.appendTo( self.listbox );
+					self._focusButton();
+				}
+
+				// allow the dialog to be closed again
+				self.isOpen = false;
+			},
+
+			open: function() {
+				if ( this.options.disabled ) {
+					return;
+				}
+
+				var self = this,
+					menuHeight = self.list.parent().outerHeight(),
+					menuWidth = self.list.parent().outerWidth(),
+					activePage = $( ".ui-page-active" ),
+					tOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled,
+					tScrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage;
+					scrollTop = tOverflow ? tScrollElem.scrollTop() : $( window ).scrollTop(),
+					btnOffset = self.button.offset().top,
+					screenHeight = window.innerHeight,
+					screenWidth = window.innerWidth;
+
+				//add active class to button
+				self.button.addClass( $.mobile.activeBtnClass );
+
+				//remove after delay
+				setTimeout( function() {
+					self.button.removeClass( $.mobile.activeBtnClass );
+				}, 300);
+
+				function focusMenuItem() {
+					self.list.find( $.mobile.activeBtnClass ).focus();
+				}
+
+				if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
+					// prevent the parent page from being removed from the DOM,
+					// otherwise the results of selecting a list item in the dialog
+					// fall into a black hole
+					self.thisPage.unbind( "pagehide.remove" );
+
+					//for WebOS/Opera Mini (set lastscroll using button offset)
+					if ( scrollTop == 0 && btnOffset > screenHeight ) {
+						self.thisPage.one( "pagehide", function() {
+							$( this ).jqmData( "lastScroll", btnOffset );
+						});
+					}
+
+					self.menuPage.one( "pageshow", function() {
+						// silentScroll() is called whenever a page is shown to restore
+						// any previous scroll position the page may have had. We need to
+						// wait for the "silentscroll" event before setting focus to avoid
+						// the browser"s "feature" which offsets rendering to make sure
+						// whatever has focus is in view.
+						$( window ).one( "silentscroll", function() {
+							focusMenuItem();
+						});
+
+						self.isOpen = true;
+					});
+
+					self.menuType = "page";
+					self.menuPageContent.append( self.list );
+					self.menuPage.find("div .ui-title").text(self.label.text());
+					$.mobile.changePage( self.menuPage, {
+						transition: $.mobile.defaultDialogTransition
+					});
+				} else {
+					self.menuType = "overlay";
+
+					self.screen.height( $(document).height() )
+						.removeClass( "ui-screen-hidden" );
+
+					// Try and center the overlay over the button
+					var roomtop = btnOffset - scrollTop,
+						roombot = scrollTop + screenHeight - btnOffset,
+						halfheight = menuHeight / 2,
+						maxwidth = parseFloat( self.list.parent().css( "max-width" ) ),
+						newtop, newleft;
+
+					if ( roomtop > menuHeight / 2 && roombot > menuHeight / 2 ) {
+						newtop = btnOffset + ( self.button.outerHeight() / 2 ) - halfheight;
+					} else {
+						// 30px tolerance off the edges
+						newtop = roomtop > roombot ? scrollTop + screenHeight - menuHeight - 30 : scrollTop + 30;
+					}
+
+					// If the menuwidth is smaller than the screen center is
+					if ( menuWidth < maxwidth ) {
+						newleft = ( screenWidth - menuWidth ) / 2;
+					} else {
+
+						//otherwise insure a >= 30px offset from the left
+						newleft = self.button.offset().left + self.button.outerWidth() / 2 - menuWidth / 2;
+
+						// 30px tolerance off the edges
+						if ( newleft < 30 ) {
+							newleft = 30;
+						} else if ( (newleft + menuWidth) > screenWidth ) {
+							newleft = screenWidth - menuWidth - 30;
+						}
+					}
+
+					self.listbox.append( self.list )
+						.removeClass( "ui-selectmenu-hidden" )
+						.css({
+							top: newtop,
+							left: newleft
+						})
+						.addClass( "in" );
+
+					focusMenuItem();
+
+					// duplicate with value set in page show for dialog sized selects
+					self.isOpen = true;
+				}
+			},
+
+			_buildList: function() {
+				var self = this,
+					o = this.options,
+					placeholder = this.placeholder,
+					optgroups = [],
+					lis = [],
+					dataIcon = self.isMultiple ? "checkbox-off" : "false";
+
+				self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
+
+				// Populate menu with options from select element
+				self.select.find( "option" ).each( function( i ) {
+					var $this = $( this ),
+						$parent = $this.parent(),
+						text = $this.getEncodedText(),
+						anchor = "<a href='#'>"+ text +"</a>",
+						classes = [],
+						extraAttrs = [];
+
+					// Are we inside an optgroup?
+					if ( $parent.is( "optgroup" ) ) {
+						var optLabel = $parent.attr( "label" );
+
+						// has this optgroup already been built yet?
+						if ( $.inArray( optLabel, optgroups ) === -1 ) {
+							lis.push( "<li data-" + $.mobile.ns + "role='list-divider'>"+ optLabel +"</li>" );
+							optgroups.push( optLabel );
+						}
+					}
+
+					// Find placeholder text
+					// TODO: Are you sure you want to use getAttribute? ^RW
+					if ( !this.getAttribute( "value" ) || text.length == 0 || $this.jqmData( "placeholder" ) ) {
+						if ( o.hidePlaceholderMenuItems ) {
+							classes.push( "ui-selectmenu-placeholder" );
+						}
+						placeholder = self.placeholder = text;
+					}
+
+					// support disabled option tags
+					if ( this.disabled ) {
+						classes.push( "ui-disabled" );
+						extraAttrs.push( "aria-disabled='true'" );
+					}
+
+					lis.push( "<li data-" + $.mobile.ns + "option-index='" + i + "' data-" + $.mobile.ns + "icon='"+ dataIcon +"' class='"+ classes.join(" ") + "' " + extraAttrs.join(" ") +">"+ anchor +"</li>" );
+				});
+
+				self.list.html( lis.join(" ") );
+
+				self.list.find( "li" )
+					.attr({ "role": "option", "tabindex": "-1" })
+					.first().attr( "tabindex", "0" );
+
+				// Hide header close link for single selects
+				if ( !this.isMultiple ) {
+					this.headerClose.hide();
+				}
+
+				// Hide header if it's not a multiselect and there's no placeholder
+				if ( !this.isMultiple && !placeholder.length ) {
+					this.header.hide();
+				} else {
+					this.headerTitle.text( this.placeholder );
+				}
+
+				// Now populated, create listview
+				self.list.listview();
+			},
+
+			_button: function(){
+				return $( "<a>", {
+					"href": "#",
+					"role": "button",
+					// TODO value is undefined at creation
+					"id": this.buttonId,
+					"aria-haspopup": "true",
+
+					// TODO value is undefined at creation
+					"aria-owns": this.menuId
+				});
+			}
+		});
+	};
+
+	$( "select" ).live( "selectmenubeforecreate", function(){
+		var selectmenuWidget = $( this ).data( "selectmenu" );
+
+		if( !selectmenuWidget.options.nativeMenu ){
+			extendSelect( selectmenuWidget );
+		}
+	});
+})( jQuery );
+/*
+* "selectmenu" plugin
+*/
+
+(function( $, undefined ) {
+
+$.widget( "mobile.selectmenu", $.mobile.widget, {
+	options: {
+		theme: null,
+		disabled: false,
+		icon: "arrow-d",
+		iconpos: "right",
+		inline: null,
+		corners: true,
+		shadow: true,
+		iconshadow: true,
+		menuPageTheme: "b",
+		overlayTheme: "a",
+		hidePlaceholderMenuItems: true,
+		closeText: "Close",
+		nativeMenu: true,
+		initSelector: "select:not(:jqmData(role='slider'))"
+	},
+
+	_button: function(){
+		return $( "<div/>" );
+	},
+
+	_setDisabled: function( value ) {
+		this.element.attr( "disabled", value );
+		this.button.attr( "aria-disabled", value );
+		return this._setOption( "disabled", value );
+	},
+
+	_focusButton : function() {
+		var self = this;
+
+		setTimeout( function() {
+			self.button.focus();
+		}, 40);
+	},
+
+  _selectOptions: function() {
+    return this.select.find( "option" );
+  },
+
+	// setup items that are generally necessary for select menu extension
+	_preExtension: function(){
+		this.select = this.element.wrap( "<div class='ui-select'>" );
+		this.selectID  = this.select.attr( "id" );
+		this.label = $( "label[for='"+ this.selectID +"']" ).addClass( "ui-select" );
+		this.isMultiple = this.select[ 0 ].multiple;
+		if ( !this.options.theme ) {
+			this.options.theme = $.mobile.getInheritedTheme( this.select, "c" );
+		}
+	},
+
+	_create: function() {
+		this._preExtension();
+
+ 		// Allows for extension of the native select for custom selects and other plugins
+		// see select.custom for example extension
+		// TODO explore plugin registration
+		this._trigger( "beforeCreate" );
+
+		this.button = this._button();
+
+		var self = this,
+
+			options = this.options,
+
+			// IE throws an exception at options.item() function when
+			// there is no selected item
+			// select first in this case
+			selectedIndex = this.select[ 0 ].selectedIndex == -1 ? 0 : this.select[ 0 ].selectedIndex,
+
+			// TODO values buttonId and menuId are undefined here
+			button = this.button
+				.text( $( this.select[ 0 ].options.item( selectedIndex ) ).text() )
+				.insertBefore( this.select )
+				.buttonMarkup( {
+					theme: options.theme,
+					icon: options.icon,
+					iconpos: options.iconpos,
+					inline: options.inline,
+					corners: options.corners,
+					shadow: options.shadow,
+					iconshadow: options.iconshadow
+				});
+
+		// Opera does not properly support opacity on select elements
+		// In Mini, it hides the element, but not its text
+		// On the desktop,it seems to do the opposite
+		// for these reasons, using the nativeMenu option results in a full native select in Opera
+		if ( options.nativeMenu && window.opera && window.opera.version ) {
+			this.select.addClass( "ui-select-nativeonly" );
+		}
+
+		// Add counter for multi selects
+		if ( this.isMultiple ) {
+			this.buttonCount = $( "<span>" )
+				.addClass( "ui-li-count ui-btn-up-c ui-btn-corner-all" )
+				.hide()
+				.appendTo( button.addClass('ui-li-has-count') );
+		}
+
+		// Disable if specified
+		if ( options.disabled || this.element.attr('disabled')) {
+			this.disable();
+		}
+
+		// Events on native select
+		this.select.change( function() {
+			self.refresh();
+		});
+
+		this.build();
+	},
+
+	build: function() {
+		var self = this;
+
+		this.select
+			.appendTo( self.button )
+			.bind( "vmousedown", function() {
+				// Add active class to button
+				self.button.addClass( $.mobile.activeBtnClass );
+			})
+			.bind( "focus vmouseover", function() {
+				self.button.trigger( "vmouseover" );
+			})
+			.bind( "vmousemove", function() {
+				// Remove active class on scroll/touchmove
+				self.button.removeClass( $.mobile.activeBtnClass );
+			})
+			.bind( "change blur vmouseout", function() {
+				self.button.trigger( "vmouseout" )
+					.removeClass( $.mobile.activeBtnClass );
+			})
+			.bind( "change blur", function() {
+				self.button.removeClass( "ui-btn-down-" + self.options.theme );
+			});
+	},
+
+	selected: function() {
+		return this._selectOptions().filter( ":selected" );
+	},
+
+	selectedIndices: function() {
+		var self = this;
+
+		return this.selected().map( function() {
+			return self._selectOptions().index( this );
+		}).get();
+	},
+
+	setButtonText: function() {
+		var self = this, selected = this.selected();
+
+		this.button.find( ".ui-btn-text" ).text( function() {
+			if ( !self.isMultiple ) {
+				return selected.text();
+			}
+
+			return selected.length ? selected.map( function() {
+				return $( this ).text();
+			}).get().join( ", " ) : self.placeholder;
+		});
+	},
+
+	setButtonCount: function() {
+		var selected = this.selected();
+
+		// multiple count inside button
+		if ( this.isMultiple ) {
+			this.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length );
+		}
+	},
+
+	refresh: function() {
+		this.setButtonText();
+		this.setButtonCount();
+	},
+
+	// open and close preserved in native selects
+	// to simplify users code when looping over selects
+	open: $.noop,
+	close: $.noop,
+
+	disable: function() {
+		this._setDisabled( true );
+		this.button.addClass( "ui-disabled" );
+	},
+
+	enable: function() {
+		this._setDisabled( false );
+		this.button.removeClass( "ui-disabled" );
+	}
+});
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$.mobile.selectmenu.prototype.enhanceWithin( e.target );
+});
+})( jQuery );
+/*
+* "buttons" plugin - for making button-like links
+*/
+
+/*
+ * Button Markup modified for TIZEN style.
+ *
+ * HTML Attributes:
+ *
+ *		data-role: button
+ *		data-style: circle, nobg, edit
+ *
+ * Examples:
+ *
+ *  	<div data-role="button" data-inline="true" data-icon="send" data-style="circle"></div>
+ *  	<div data-role="button" data-inline="true" data-icon="favorite" data-style="nobg">
+ *  	<div data-role="button" data-inline="true" data-icon="editminus" data-style="edit"></div>
+ */
+
+( function( $, undefined ) {
+
+$.fn.buttonMarkup = function( options ) {
+	options = options || {};
+
+	for ( var i = 0; i < this.length; i++ ) {
+		var el = this.eq( i ),
+			e = el[ 0 ],
+			o = $.extend( {}, $.fn.buttonMarkup.defaults, {
+				icon:       options.icon       !== undefined ? options.icon       : el.jqmData( "icon" ),
+				iconpos:    options.iconpos    !== undefined ? options.iconpos    : el.jqmData( "iconpos" ),
+				theme:      options.theme      !== undefined ? options.theme      : el.jqmData( "theme" ),
+				inline:     options.inline     !== undefined ? options.inline     : el.jqmData( "inline" ),
+				shadow:     options.shadow     !== undefined ? options.shadow     : el.jqmData( "shadow" ),
+				corners:    options.corners    !== undefined ? options.corners    : el.jqmData( "corners" ),
+				iconshadow: options.iconshadow !== undefined ? options.iconshadow : el.jqmData( "iconshadow" )
+			}, options ),
+
+			// Classes Defined
+			innerClass = "ui-btn-inner",
+			textClass = "ui-btn-text",
+			buttonClass, iconClass,
+
+			// Button inner markup
+			buttonInner = document.createElement( o.wrapperEls ),
+			buttonText = document.createElement( o.wrapperEls ),
+			buttonIcon = o.icon ? document.createElement( "span" ) : null;
+
+		if ( attachEvents ) {
+			attachEvents();
+		}
+
+		// if not, try to find closest theme container
+		if ( !o.theme ) {
+			o.theme = $.mobile.getInheritedTheme( el, "c" );
+		}
+
+		buttonClass = "ui-btn ui-btn-up-" + o.theme;
+
+		if ( o.inline ) {
+			buttonClass += " ui-btn-inline";
+		}
+
+		if ( o.icon ) {
+			o.icon = "ui-icon-" + o.icon;
+			o.iconpos = o.iconpos || "left";
+
+			iconClass = "ui-icon " + o.icon;
+
+			if ( o.iconshadow ) {
+				iconClass += " ui-icon-shadow";
+			}
+		}
+
+		if ( o.iconpos ) {
+			buttonClass += " ui-btn-icon-" + o.iconpos;
+
+			if ( o.iconpos == "notext" && !el.attr( "title" ) ) {
+				el.attr( "title", el.getEncodedText() );
+			}
+		}
+
+		if ( o.corners ) {
+			buttonClass += " ui-btn-corner-all";
+			innerClass += " ui-btn-corner-all";
+		}
+
+		if ( o.shadow ) {
+			buttonClass += " ui-shadow";
+		}
+
+		/* TIZEN style markup */
+		buttonStyle = el.jqmData("style");
+
+		if ( buttonStyle == "circle" ) {
+			/* style : no text, Icon only */
+			buttonClass += " ui-btn-corner-circle";
+			buttonClass += " ui-btn-icon_only";
+		} else if ( buttonStyle == "nobg" ) {
+			/* style : no text, Icon only, no bg */
+			buttonClass += " ui-btn-icon-nobg";
+			buttonClass += " ui-btn-icon_only";
+		} else if ( buttonStyle == "edit" ) {
+			buttonClass += " ui-btn-edit";
+		}
+
+		if ( o.icon ) {
+			if ( $(el).text().length > 0 ) {
+				o.iconpos == "right" ?
+					textClass += " ui-btn-text-padding-right" :
+					textClass += " ui-btn-text-padding-left";
+
+				innerClass += " ui-btn-hastxt";
+			} else {
+				if ( buttonStyle == "circle" ) {
+					/* style : no text, Icon only */
+					innerClass += " ui-btn-corner-circle";
+				} else if ( buttonStyle == "nobg" ) {
+					/* style : no text, Icon only, no bg */
+					innerClass += " ui-btn-icon-nobg";
+				}
+
+				buttonClass += " ui-btn-icon_only";
+				innerClass += " ui-btn-icon-only";
+			}
+		} else {
+			if ( $(el).text().length > 0 ) {
+				innerClass += " ui-btn-hastxt";
+			}
+		}
+
+		el.attr( "data-" + $.mobile.ns + "theme", o.theme )
+			.addClass( buttonClass );
+
+		buttonInner.className = innerClass;
+		buttonInner.setAttribute("aria-hidden", "true");
+
+		buttonText.className = textClass;
+		buttonInner.appendChild( buttonText );
+
+		if ( buttonIcon ) {
+			buttonIcon.className = iconClass;
+			buttonInner.appendChild( buttonIcon );
+		}
+
+		while ( e.firstChild ) {
+			buttonText.appendChild( e.firstChild );
+		}
+
+		e.appendChild( buttonInner );
+		
+		// TODO obviously it would be nice to pull this element out instead of
+		// retrieving it from the DOM again, but this change is much less obtrusive
+		// and 1.0 draws nigh
+		el.data( 'textWrapper', $( buttonText ) );
+	}
+
+	return this;
+};
+
+$.fn.buttonMarkup.defaults = {
+	corners: true,
+	shadow: true,
+	iconshadow: true,
+	inline: false,
+	wrapperEls: "span"
+};
+
+function closestEnabledButton( element ) {
+    var cname;
+
+    while ( element ) {
+		// Note that we check for typeof className below because the element we
+		// handed could be in an SVG DOM where className on SVG elements is defined to
+		// be of a different type (SVGAnimatedString). We only operate on HTML DOM
+		// elements, so we look for plain "string".
+
+        cname = ( typeof element.className === 'string' ) && element.className.split(' ');
+
+        if ( cname && $.inArray( "ui-btn", cname ) > -1 && $.inArray( "ui-disabled", cname ) < 0 ) {
+            break;
+        }
+        element = element.parentNode;
+    }
+
+    return element;
+}
+
+// Bug fix: When moving finger out of button after touching down button, button color MUST be returned.
+// button click event comes this order : vmouseover -> vmousedown -> vmouseup -> vmouseout
+
+var selectedButton = null;
+var useScrollview = false;
+
+var attachEvents = function() {
+	$( document ).bind( {
+		"vmouseover focus": function( event ) {
+			var $btn, theme;
+
+			// check if there is selected button... if so, make it to "btn-up" state.
+			if ( selectedButton ) {
+				$btn = $( selectedButton );
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+				$btn.removeClass( "ui-btn-down-" + theme ).removeClass( "ui-btn-hover-" + theme )
+					.addClass( "ui-btn-up-" + theme );
+			}
+
+			selectedButton = closestEnabledButton( event.target );
+			if ( selectedButton ) {
+				$btn = $( selectedButton );
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+				$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme );
+			}
+		},
+		"vmouseout blur": function( event ) {
+			var $btn, theme;
+
+			if ( selectedButton ) {
+				$btn = $( selectedButton );
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+				$btn.removeClass( "ui-btn-hover-" + theme ).removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+			}
+		},
+		"vmousedown": function( event ) {
+			var $btn, theme;
+
+			if ( !selectedButton ) {
+				selectedButton = closestEnabledButton( event.target );
+			}
+
+			$btn = $( selectedButton );
+			theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+			$btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme );
+		},
+		"vmousecancel vmouseup": function( event ) {
+			var $btn, theme;
+
+			if ( selectedButton ) {
+				$btn = $( selectedButton );
+				theme = $btn.attr( "data-" + $.mobile.ns + "theme" );
+				$btn.removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme );
+
+				if ( event.type === "vmousecancel" && useScrollview ) {
+					event.preventDefault();
+				}
+				selectedButton = null;
+			}
+		},
+		"scrollstart scrollview_scroll": function( event ) {
+			if ( event.type === "scrollview_scroll" ) {
+				useScrollview = true;
+			}
+			$( this ).trigger("vmousecancel");
+		}
+	});
+
+	attachEvents = null;
+};
+
+//links in bars, or those with  data-role become buttons
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+
+	$( ":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a", e.target )
+		.not( ".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.buttonMarkup();
+});
+
+})( jQuery );
+/* 
+* "controlgroup" plugin - corner-rounding for groups of buttons, checks, radios, etc
+*/
+
+(function( $, undefined ) {
+
+$.fn.controlgroup = function( options ) {
+
+	return this.each(function() {
+
+		var $el = $( this ),
+			o = $.extend({
+						direction: $el.jqmData( "type" ) || "vertical",
+						shadow: false,
+						excludeInvisible: true
+					}, options ),
+			groupheading = $el.children( "legend" ),
+			flCorners = o.direction == "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ],
+			type = $el.find( "input" ).first().attr( "type" );
+
+		// Replace legend with more stylable replacement div
+		if ( groupheading.length ) {
+			$el.wrapInner( "<div class='ui-controlgroup-controls'></div>" );
+			$( "<div role='heading' class='ui-controlgroup-label'>" + groupheading.html() + "</div>" ).insertBefore( $el.children(0) );
+			groupheading.remove();
+		}
+
+		$el.addClass( "ui-corner-all ui-controlgroup ui-controlgroup-" + o.direction );
+
+		// TODO: This should be moved out to the closure
+		// otherwise it is redefined each time controlgroup() is called
+		function flipClasses( els ) {
+			els.removeClass( "ui-btn-corner-all ui-shadow" )
+				.eq( 0 ).addClass( flCorners[ 0 ] )
+				.end()
+				.last().addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" );
+		}
+
+		flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ) );
+		flipClasses( $el.find( ".ui-btn-inner" ) );
+
+		if ( o.shadow ) {
+			$el.addClass( "ui-shadow" );
+		}
+	});
+};
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( e ){
+	$( ":jqmData(role='controlgroup')", e.target ).controlgroup({ excludeInvisible: false });
+});
+
+})(jQuery);/*
+* "links" plugin - simple class additions for links
+*/
+
+(function( $, undefined ) {
+
+$( document ).bind( "pagecreate create", function( e ){
+	
+	//links within content areas
+	$( e.target )
+		.find( "a" )
+		.not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.addClass( "ui-link" );
+
+});
+
+})( jQuery );/*
+* "fixHeaderFooter" plugin - on-demand positioning for headers,footers
+*/
+
+/*
+ * Header/Footer can be created using the
+ * data-role="header", data-role="footer" attribute to an element.
+ *
+ * Every page in SLP theme have Header&Footer and default footer contains back button
+ * Framework automatically generate footer even though web developer does not define footer
+ * For more detail footer usage, refer Page(page.section.js) guideline
+ *
+ * Attribute:
+ *    data-position : default value is fixed, automatically generated footer has fixed position,
+ *                   in header, web dev. defines header fix or not.
+ *
+ * Examples:
+ *
+ *     HTML markup for creating header :
+ *         <div data-role="header" data-position="fixed">
+ *             <h1>NBeat UI</h1>
+ *         </div>
+ *
+ *     HTML markup for creating 1 button title ( button is available 1~3 )
+ *         <div data-role="header" data-position="fixed">
+ *             <a>Text1</a>
+ *             <h1>Title Area</h1>
+ *         </div>
+ *
+ *     HTML markup for creating 2 button and groupControl title ( Groupcontrol is available 2~4 )
+ *     <div data-role="header" data-position="fixed">
+ *         <a>Text</a>
+ *         <h1>Title Extend 2 Button </h1>
+ *         <a>Text</a>
+ *         <div data-role="fieldcontain">
+ *             <fieldset data-role="controlgroup" data-type="horizontal">
+ *                 <input type="radio" name="radio-view-8" data-icon="segment-titlestyle-segonly" id="segment1" value="on" checked="checked" />
+ *                 <label for="segment1">All</label>
+ *                 <input type="radio" name="radio-view-8" data-icon="segment-titlestyle-segonly" id="segment2" value="off" />
+ *                 <label for="segment2">Call</label>
+ *             </fieldset>
+ *         </div>
+ *     </div>
+ *
+ *     HTML markup for creating footer
+ *         <div data-role="footer" data-position="fixed">
+ *         </div>
+ */
+
+(function( $, undefined ) {
+
+var slideDownClass = "ui-header-fixed ui-fixed-inline fade",
+	slideUpClass = "ui-footer-fixed ui-fixed-inline fade",
+
+	slideDownSelector = ".ui-header:jqmData(position='fixed')",
+	slideUpSelector = ".ui-footer:jqmData(position='fixed')";
+
+$.fn.fixHeaderFooter = function( options ) {
+
+	if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) {
+		return this;
+	}
+
+	return this.each(function() {
+		var $this = $( this );
+
+		if ( $this.jqmData( "fullscreen" ) ) {
+			$this.addClass( "ui-page-fullscreen" );
+		}
+
+		// Should be slidedown
+		$this.find( slideDownSelector ).addClass( slideDownClass );
+
+		// Should be slideup
+		$this.find( slideUpSelector ).addClass( slideUpClass );
+	});
+};
+
+// single controller for all showing,hiding,toggling
+$.mobile.fixedToolbars = (function() {
+
+	if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) {
+		return;
+	}
+
+	var stickyFooter, delayTimer,
+		currentstate = "inline",
+		autoHideMode = false,
+		showDelay = 100,
+		ignoreTargets = "a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed",
+		toolbarSelector = ".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last",
+		// for storing quick references to duplicate footers
+		supportTouch = $.support.touch,
+		touchStartEvent = supportTouch ? "touchstart" : "mousedown",
+		touchStopEvent = supportTouch ? "touchend" : "mouseup",
+		stateBefore = null,
+		scrollTriggered = false,
+//		defaultFooterHeight = 114,
+		touchToggleEnabled = true;
+
+	function showEventCallback( event ) {
+		// An event that affects the dimensions of the visual viewport has
+		// been triggered. If the header and/or footer for the current page are in overlay
+		// mode, we want to hide them, and then fire off a timer to show them at a later
+		// point. Events like a resize can be triggered continuously during a scroll, on
+		// some platforms, so the timer is used to delay the actual positioning until the
+		// flood of events have subsided.
+		//
+		// If we are in autoHideMode, we don't do anything because we know the scroll
+		// callbacks for the plugin will fire off a show when the scrolling has stopped.
+
+		var footer_filter;
+
+		if ( $( document ).find( ".ui-page-active" ).length ) {
+			footer_filter = $( document ).find( ".ui-page-active" ).find( ":jqmData(role='footer')" );
+		} else {
+			footer_filter = $( document ).find( ":jqmData(role='footer')" ).eq( 0 );
+		}
+
+//		if ( footer_filter.height() < defaultFooterHeight ) {
+//			footer_filter.css("height", defaultFooterHeight);
+//		}
+
+		footer_filter
+			.css( "top", $(window).height() - footer_filter.height() )
+			.show();
+
+		var footerNavbar = footer_filter.find(".ui-navbar");
+
+		if ( footerNavbar.jqmData("style") == "toolbar" ) {
+			footerNavbar
+				.css( "width", $(window).width() - footerNavbar.siblings(".ui-btn").width() );
+		}
+
+		// divide content mode scrollview and non-scrollview
+		// recalculate content area when resize callback occur
+		if ( event.type == "resize" ) {
+			var s_theme_header =
+				$( document ).find( ".ui-page-active" ).find( ":jqmData(role='header')" );
+			var s_theme_content =
+				$( document ).find( ".ui-page-active" ).find( ":jqmData(role='content')" );
+
+			if ( $.support.scrollview ) {
+				if ( s_theme_header.css("position") != "fixed" ) {
+					s_theme_header.css( "position", "fixed" );
+				}
+
+				s_theme_content.css( "top", s_theme_header.height() );
+				s_theme_content.css( "height",
+						document.documentElement.clientHeight -
+						footer_filter.height() - s_theme_header.height() );
+			} else {
+				if ( s_theme_header.css("position") != "fixed" ) {
+					s_theme_header.css( "position", "relative" );
+					s_theme_content
+						.css( "top", "0" )
+						.css( "height", "" );
+				}
+			}
+		}
+
+		if ( !autoHideMode && currentstate === "overlay" ) {
+			if ( !delayTimer ) {
+				$.mobile.fixedToolbars.hide( true );
+			}
+
+			$.mobile.fixedToolbars.startShowTimer();
+		}
+	}
+
+	$(function() {
+		var $document = $( document ),
+			$window = $( window );
+
+		$document
+			.bind( "vmousedown", function( event ) {
+				if ( touchToggleEnabled ) {
+					stateBefore = currentstate;
+				}
+			})
+			.bind( "vclick", function( event ) {
+				if ( touchToggleEnabled ) {
+
+					if ( $(event.target).closest( ignoreTargets ).length ) {
+						return;
+					}
+
+					if ( !scrollTriggered ) {
+						$.mobile.fixedToolbars.toggle( stateBefore );
+						stateBefore = null;
+					}
+				}
+			})
+			.bind( "silentscroll", showEventCallback );
+
+
+		// The below checks first for a $(document).scrollTop() value, and if zero, binds scroll events to $(window) instead.
+		// If the scrollTop value is actually zero, both will return zero anyway.
+		//
+		// Works with $(document), not $(window) : Opera Mobile (WinMO phone; kinda broken anyway)
+		// Works with $(window), not $(document) : IE 7/8
+		// Works with either $(window) or $(document) : Chrome, FF 3.6/4, Android 1.6/2.1, iOS
+		// Needs work either way : BB5, Opera Mobile (iOS)
+
+		( ( $document.scrollTop() === 0 ) ? $window : $document )
+			.bind( "scrollstart", function( event ) {
+				if ( $( event.target ).find(":jqmData(role='header')").is(":jqmData(position='fixed')") ) {
+					return;
+				}
+
+				scrollTriggered = true;
+
+				if ( stateBefore === null ) {
+					stateBefore = currentstate;
+				}
+
+				// We only enter autoHideMode if the headers/footers are in
+				// an overlay state or the show timer was started. If the
+				// show timer is set, clear it so the headers/footers don't
+				// show up until after we're done scrolling.
+				var isOverlayState = stateBefore == "overlay";
+
+				autoHideMode = isOverlayState || !!delayTimer;
+
+				if ( autoHideMode ) {
+					$.mobile.fixedToolbars.clearShowTimer();
+
+					if ( isOverlayState ) {
+						$.mobile.fixedToolbars.hide( true );
+					}
+				}
+			})
+			.bind( "scrollstop", function( event ) {
+				if ( $( event.target ).closest( ignoreTargets ).length ) {
+					return;
+				}
+
+				scrollTriggered = false;
+
+				if ( autoHideMode ) {
+					$.mobile.fixedToolbars.startShowTimer();
+					autoHideMode = false;
+				}
+				stateBefore = null;
+			});
+
+			$window.bind( "resize", showEventCallback );
+	});
+
+	// 1. Before page is shown, check for duplicate footer
+	// 2. After page is shown, append footer to new page
+	$( ".ui-page" )
+		.live( "pagebeforeshow", function( event, ui ) {
+			/* Fixed header modify for theme-s */
+			var s_theme_header = $( event.target ).find(":jqmData(role='header')");
+			var s_theme_fieldcontain = s_theme_header.find(":jqmData(role='fieldcontain')");
+			var s_theme_content = $( event.target ).find(".ui-content");
+			var title_style = "normal";
+
+			if ( s_theme_fieldcontain.length != 0 ) {
+				title_style = "extended";
+			}
+
+			if ( s_theme_header.jqmData("position") == "fixed" || window.S.frameworkData.theme.match(/tizen/).length ||
+				s_theme_header.css("position") == "fixed" ) {
+				s_theme_header
+					.css( "position", "fixed" )
+					.css( "top", "0px" );
+
+				if ( s_theme_header.children().is(".ui-navbar") ) {
+					s_theme_header.addClass("ui-title-controlbar-height");
+					$( event.target ).find( ".ui-content" )
+						.addClass("ui-title-content-controlbar-height");
+				} else {
+					$( event.target ).find( ".ui-content" )
+						.addClass("ui-title-content-" + title_style + "-height");
+				}
+			}
+
+			if ( s_theme_header.children().is(".ui-option-header") ) {
+				s_theme_content.removeClass("ui-title-content-" + title_style + "-height");
+
+				if ( s_theme_header.children().is(".input-search-bar") ) {
+					s_theme_content.addClass("ui-title-content-optionheader-search");
+				} else {
+					if ( $.tizen.optionheader.prototype.options.collapseOnInit == true ) {
+						s_theme_content
+							.addClass("ui-title-content-option-header-collapsed-1line-height");
+					} else {
+						s_theme_content
+							.addClass("ui-title-content-option-header-expanded-1line-height");
+					}
+				}
+			} else if( s_theme_header.find("input").attr("type") === "search" || s_theme_header.find("input").attr("type") === "tizen-search" ) {
+				s_theme_content
+					.removeClass("ui-title-content-" + title_style + "-height")
+					.addClass("ui-title-content-search");
+			}
+
+			if ( s_theme_header.children().is("a") ||
+				s_theme_header.children().find(".ui-radio").length != 0 ) {
+				if ( title_style == "normal" ) {
+					if ( s_theme_header.children("a").length == 3 ) {
+						s_theme_header.find( "a" ).eq( 1 )
+							.removeClass("ui-btn-right")
+							.addClass("ui-title-normal-3btn");
+
+						s_theme_header.find( "a" ).eq( 2 )
+							.addClass("ui-btn-right");
+					}
+				} else {
+					var group_length = s_theme_fieldcontain.find(".ui-radio").length;
+
+					s_theme_header
+						.addClass("ui-title-extended-height");
+
+					s_theme_fieldcontain
+						.find(".ui-controlgroup")
+						.addClass("ui-title-extended-controlgroup");
+
+					s_theme_fieldcontain
+						.find(".ui-controlgroup")
+						.addClass("ui-extended-controlgroup");
+
+					s_theme_fieldcontain
+						.addClass("ui-title-extended-segment-style");
+
+					if ( group_length == 2 || group_length == 3 || group_length == 4 ) {
+						s_theme_fieldcontain
+							.addClass("ui-title-extended-controlgroup-" + group_length + "btn");
+					}
+				}
+				s_theme_content.addClass("ui-title-content-" + title_style + "-height");
+			}
+
+			// divide content mode scrollview and non-scrollview
+			// recalculate content area when resize callback occur
+			if ( event.type == "resize" ) {
+				if ( $.support.scrollview ) {
+					if ( s_theme_header.css("position") != "fixed" ) {
+						s_theme_header.css( "position", "fixed" );
+					}
+
+					s_theme_content.css( "top", s_theme_header.height() );
+				} else {
+					if ( s_theme_header.css("position") != "fixed" ) {
+						s_theme_header.css( "position", "relative" );
+						s_theme_content.css( "top", "0" );
+					}
+				}
+			}
+
+			var footer_filter = $( document ).find(":jqmData(role='footer')");
+
+			if ( footer_filter.find(".ui-navbar").is(".ui-controlbar-s") ){
+				footer_filter
+					.css( "top", $(window).height() - footer_filter.height() )
+					.show();
+			}
+
+			if ( footer_filter.children().find(".ui-radio").length != 0 ) {
+				var footerGroup = footer_filter.find(":jqmData(role='fieldcontain')");
+				var groupLength = footerGroup.find(".ui-radio").length;
+
+				footerGroup.find(".ui-controlgroup")
+					.addClass("ui-extended-controlgroup")
+					.addClass("ui-footer-extended-controlgroup")
+					.css( "display", "inline" );
+
+					/* Groupcontrol cannot initialize inline property at first page */
+				footerGroup.addClass("ui-title-extended-controlgroup-" + groupLength + "btn");
+
+				footerButton = footer_filter.children("a");
+				footerButton.each(function( i ) {
+					if ( footerButton.eq( i ).is(".ui-btn") && !footerButton.eq( i ).is(".ui-btn-back") ){
+						footerButton.eq( i )
+							.removeClass("ui-btn-left")
+							.addClass("ui-btn-footer-right");
+					}
+				});
+			}
+
+			var page = $( event.target ),
+				footer = page.find( ":jqmData(role='footer')" ),
+				id = footer.data( "id" ),
+				prevPage = ui.prevPage,
+				prevFooter = prevPage && prevPage.find( ":jqmData(role='footer')" ),
+				prevFooterMatches = prevFooter.length && prevFooter.jqmData( "id" ) === id;
+
+			if ( id && prevFooterMatches ) {
+				stickyFooter = footer;
+				stickyFooter.removeClass( "fade in out" ).appendTo( $.mobile.pageContainer );
+				stickyFooter
+					.css("position", "fixed")
+					.css("top", $(".ui-page").find(":jqmData(role='footer')").eq( 0 ).css("top"));
+
+			}
+
+			if ( footer.is(".ui-footer-fixed") ) {
+				footer.css( "top", $(window).height() - footer.height() );
+			}
+
+			/* Increase Content size with dummy <div> because of footer height */
+			if ( footer.length != 0 && $( event.target ).find(".dummy-div").length == 0 ) {
+				$( event.target ).find( ":jqmData(role='content')" ).append( '<div class="dummy-div"></div>' );
+				$( ".dummy-div" )
+					.css( "width", footer.width() )
+					.css( "height", footer.height() );
+
+//				if ( $(".dummy-div").height() < defaultFooterHeight ) {
+//					$( ".dummy-div" ).css( "height", defaultFooterHeight );
+//				}
+			}
+
+			/* Header position fix(remove transition) */
+			var next_id = $( event.target ).attr( "id" );
+
+			$( "#"+next_id ).find( ":jqmData(role='header')" )
+				.removeClass( "fade in out" )
+				.appendTo( $.mobile.pageContainer );
+		})
+		.live( "pageshow", function( event, ui ) {
+			/* Fixed header modify for theme-s */
+			var s_theme_header = $( event.target ).find( ":jqmData(role='header')" );
+			if ( s_theme_header.is(".ui-header-fixed") && s_theme_header.is(".ui-bar-s") ) {
+				$( event.target ).find(":jqmData(role='header')")
+					.css( "position", "fixed" )
+					.css( "top", "0px" );
+
+				 ( $( document ).scrollTop() === 0 ? $( window ) : $( document ) )
+					.unbind("scrollstart")
+					.unbind("silentscroll")
+					.unbind("scrollstop");
+			}
+
+			var $this = $( this );
+
+			if ( stickyFooter && stickyFooter.length ) {
+				setTimeout(function() {
+					setTop( stickyFooter.appendTo( $this ).addClass( "fade" ) );
+					stickyFooter = null;
+				}, 500);
+			}
+
+			$.mobile.fixedToolbars.show( true, this );
+
+			/* Header position fix(remove transition) */
+			$("body").children(":jqmData(role='header')")
+				.insertBefore( $(event.target).find(":jqmData(role='content')").eq( 0 ) );
+		});
+
+
+	// When a collapsiable is hidden or shown we need to trigger the fixed toolbar to reposition itself (#1635)
+	$( ".ui-collapsible-contain" ).live( "collapse expand", showEventCallback );
+
+	// element.getBoundingClientRect() is broken in iOS 3.2.1 on the iPad. The
+	// coordinates inside of the rect it returns don't have the page scroll position
+	// factored out of it like the other platforms do. To get around this,
+	// we'll just calculate the top offset the old fashioned way until core has
+	// a chance to figure out how to handle this situation.
+	//
+	// TODO: We'll need to get rid of getOffsetTop() once a fix gets folded into core.
+
+	function getOffsetTop( ele ) {
+		var top = 0,
+			op, body;
+
+		if ( ele ) {
+			body = document.body;
+			op = ele.offsetParent;
+			top = ele.offsetTop;
+
+			while ( ele && ele != body ) {
+				top += ele.scrollTop || 0;
+
+				if ( ele == op ) {
+					top += op.offsetTop;
+					op = ele.offsetParent;
+				}
+
+				ele = ele.parentNode;
+			}
+		}
+		return top;
+	}
+
+	function setTop( el ) {
+		if ( el.parents(".ui-page").find(":jqmData(role='header')").is(".ui-header-fixed") &&
+			el.parents(".ui-page").find(":jqmData(role='header')").is(".ui-bar-s") ) {
+			return;
+		}
+
+		var fromTop = $(window).scrollTop(),
+			thisTop = getOffsetTop( el[ 0 ] ), // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead.
+			thisCSStop = el.css( "top" ) == "auto" ? 0 : parseFloat(el.css( "top" )),
+			screenHeight = $(window).height(),
+			thisHeight = el.outerHeight(),
+			useRelative = el.parents( ".ui-page:not(.ui-page-fullscreen)" ).length,
+			relval;
+
+		if ( el.is( ".ui-header-fixed" ) ) {
+
+			relval = fromTop - thisTop + thisCSStop;
+
+			if ( relval < thisTop ) {
+				relval = 0;
+			}
+
+			return el.css( "top", useRelative ? relval : fromTop );
+		} else {
+			// relval = -1 * (thisTop - (fromTop + screenHeight) + thisCSStop + thisHeight);
+			// if ( relval > thisTop ) { relval = 0; }
+			relval = fromTop + screenHeight - thisHeight - (thisTop - thisCSStop );
+
+			return el.css( "top", useRelative ? relval : fromTop + screenHeight - thisHeight );
+		}
+	}
+
+	// Exposed methods
+	return {
+
+		show: function( immediately, page ) {
+
+			$.mobile.fixedToolbars.clearShowTimer();
+
+			currentstate = "overlay";
+
+			var $ap = page ? $( page ) :
+					( $.mobile.activePage ? $.mobile.activePage :
+						$( ".ui-page-active" ) );
+
+			return $ap.children( toolbarSelector ).each(function() {
+
+				var el = $( this ),
+					fromTop = $( window ).scrollTop(),
+					// el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead.
+					thisTop = getOffsetTop( el[ 0 ] ),
+					screenHeight = $(window).height(),
+					thisHeight = el.outerHeight(),
+					alreadyVisible = ( el.is( ".ui-header-fixed" ) && fromTop <= thisTop + thisHeight ) ||
+														( el.is( ".ui-footer-fixed" ) && thisTop <= fromTop + screenHeight );
+			});
+		},
+
+		hide: function( immediately ) {
+
+			currentstate = "inline";
+
+			var $ap = $.mobile.activePage ? $.mobile.activePage :
+									$( ".ui-page-active" );
+
+			return $ap.children( toolbarSelector ).each(function() {
+
+				var el = $(this),
+					thisCSStop = el.css( "top" ),
+					classes;
+
+				thisCSStop = thisCSStop == "auto" ? 0 :
+											parseFloat(thisCSStop);
+
+				// Add state class
+				el.addClass( "ui-fixed-inline" ).removeClass( "ui-fixed-overlay" );
+
+				if ( thisCSStop < 0 || ( el.is( ".ui-header-fixed" ) && thisCSStop !== 0 ) ) {
+
+					if ( immediately ) {
+						el.css( "top", 0);
+					} else {
+
+						if ( el.css( "top" ) !== "auto" && parseFloat( el.css( "top" ) ) !== 0 ) {
+
+							classes = "out reverse";
+
+							el.animationComplete(function() {
+								el.removeClass( classes ).css( "top", 0 );
+							}).addClass( classes );
+						}
+					}
+				}
+			});
+		},
+
+		startShowTimer: function() {
+
+			$.mobile.fixedToolbars.clearShowTimer();
+
+			var args = [].slice.call( arguments );
+
+			delayTimer = setTimeout(function() {
+				delayTimer = undefined;
+				$.mobile.fixedToolbars.show.apply( null, args );
+			}, showDelay);
+		},
+
+		clearShowTimer: function() {
+			if ( delayTimer ) {
+				clearTimeout( delayTimer );
+			}
+			delayTimer = undefined;
+		},
+
+		toggle: function( from ) {
+			if ( from ) {
+				currentstate = from;
+			}
+			return ( currentstate === "overlay" ) ? $.mobile.fixedToolbars.hide() :
+								$.mobile.fixedToolbars.show();
+		},
+
+		setTouchToggleEnabled: function( enabled ) {
+			touchToggleEnabled = enabled;
+		}
+	};
+})();
+
+//auto self-init widgets
+$( document ).bind( "pagecreate create", function( event ) {
+
+	if ( $( ":jqmData(position='fixed')", event.target ).length ) {
+
+		$( event.target ).each(function() {
+
+			if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) {
+				return this;
+			}
+
+			var $this = $( this );
+
+			if ( $this.jqmData( "fullscreen" ) ) {
+				$this.addClass( "ui-page-fullscreen" );
+			}
+
+			// Should be slidedown
+			$this.find( slideDownSelector ).addClass( slideDownClass );
+
+			// Should be slideup
+			$this.find( slideUpSelector ).addClass( slideUpClass );
+
+		})
+
+	}
+});
+
+})( jQuery );
+/*
+* "fixHeaderFooter" native plugin - Behavior for "fixed" headers,footers, and scrolling inner content
+*/
+
+(function( $, undefined ) {
+
+// Enable touch overflow scrolling when it's natively supported
+$.mobile.touchOverflowEnabled = false;
+
+// Enabled zoom when touch overflow is enabled. Can cause usability issues, unfortunately
+$.mobile.touchOverflowZoomEnabled = false;
+
+$( document ).bind( "pagecreate", function( event ) {
+	if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){
+		
+		var $target = $( event.target ),
+			scrollStartY = 0;
+			
+		if( $target.is( ":jqmData(role='page')" ) ){
+			
+			$target.each(function() {
+				var $page = $( this ),
+					$fixies = $page.find( ":jqmData(role='header'), :jqmData(role='footer')" ).filter( ":jqmData(position='fixed')" ),
+					fullScreen = $page.jqmData( "fullscreen" ),
+					$scrollElem = $fixies.length ? $page.find( ".ui-content" ) : $page;
+				
+				$page.addClass( "ui-mobile-touch-overflow" );
+				
+				$scrollElem.bind( "scrollstop", function(){
+					if( $scrollElem.scrollTop() > 0 ){
+						window.scrollTo( 0, $.mobile.defaultHomeScroll );
+					}
+				});	
+				
+				if( $fixies.length ){
+					
+					$page.addClass( "ui-native-fixed" );
+					
+					if( fullScreen ){
+
+						$page.addClass( "ui-native-fullscreen" );
+
+						$fixies.addClass( "fade in" );
+
+						$( document ).bind( "vclick", function(){
+							$fixies
+								.removeClass( "ui-native-bars-hidden" )
+								.toggleClass( "in out" )
+								.animationComplete(function(){
+									$(this).not( ".in" ).addClass( "ui-native-bars-hidden" );
+								});
+						});
+					}
+				}
+			});
+		}
+	}
+});
+
+})( jQuery );
+/*
+* "init" - Initialize the framework
+*/
+
+(function( $, window, undefined ) {
+	var	$html = $( "html" ),
+			$head = $( "head" ),
+			$window = $( window );
+
+ 	// trigger mobileinit event - useful hook for configuring $.mobile settings before they're used
+	$( window.document ).trigger( "mobileinit" );
+
+	// support conditions
+	// if device support condition(s) aren't met, leave things as they are -> a basic, usable experience,
+	// otherwise, proceed with the enhancements
+	if ( !$.mobile.gradeA() ) {
+		return;
+	}
+
+	// override ajaxEnabled on platforms that have known conflicts with hash history updates
+	// or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini)
+	if ( $.mobile.ajaxBlacklist ) {
+		$.mobile.ajaxEnabled = false;
+	}
+
+	// add mobile, initial load "rendering" classes to docEl
+	$html.addClass( "ui-mobile ui-mobile-rendering" );
+
+	// loading div which appears during Ajax requests
+	// will not appear if $.mobile.loadingMessage is false
+	var $loader = $( "<div class='ui-loader ui-body-a ui-corner-all'><span class='ui-icon ui-icon-loading spin'></span><h1></h1></div>" );
+
+	$.extend($.mobile, {
+		// turn on/off page loading message.
+		showPageLoadingMsg: function() {
+			if ( $.mobile.loadingMessage ) {
+				var activeBtn = $( "." + $.mobile.activeBtnClass ).first();
+
+				$loader
+					.find( "h1" )
+						.text( $.mobile.loadingMessage )
+						.end()
+					.appendTo( $.mobile.pageContainer )
+					// position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
+					.css({
+						top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 ||
+						activeBtn.length && activeBtn.offset().top || 100
+					});
+			}
+
+			$html.addClass( "ui-loading" );
+		},
+
+		hidePageLoadingMsg: function() {
+			$html.removeClass( "ui-loading" );
+		},
+
+		// find and enhance the pages in the dom and transition to the first page.
+		initializePage: function() {
+			// find present pages
+			var $pages = $( ":jqmData(role='page')" );
+
+			// if no pages are found, create one with body's inner html
+			if ( !$pages.length ) {
+				$pages = $( "body" ).wrapInner( "<div data-" + $.mobile.ns + "role='page'></div>" ).children( 0 );
+			}
+
+			// add dialogs, set data-url attrs
+			$pages.add( ":jqmData(role='dialog')" ).each(function() {
+				var $this = $(this);
+
+				// unless the data url is already set set it to the pathname
+				if ( !$this.jqmData("url") ) {
+					$this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search );
+				}
+			});
+
+			// define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback)
+			$.mobile.firstPage = $pages.first();
+
+			// define page container
+			$.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" );
+
+			// alert listeners that the pagecontainer has been determined for binding
+			// to events triggered on it
+			$window.trigger( "pagecontainercreate" );
+
+			// cue page loading message
+			$.mobile.showPageLoadingMsg();
+
+			// if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM
+			if ( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ) {
+				$.mobile.changePage( $.mobile.firstPage, { transition: "none", reverse: true, changeHash: false, fromHashChange: true } );
+			}
+			// otherwise, trigger a hashchange to load a deeplink
+			else {
+				$window.trigger( "hashchange", [ true ] );
+			}
+		}
+	});
+	
+	// This function injects a meta viewport tag to prevent scaling. Off by default, on by default when touchOverflow scrolling is enabled
+	function disableZoom() {
+		var cont = "user-scalable=no",
+			meta = $( "meta[name='viewport']" );
+			
+		if( meta.length ){
+			meta.attr( "content", meta.attr( "content" ) + ", " + cont );
+		}
+		else{
+			$( "head" ).prepend( "<meta>", { "name": "viewport", "content": cont } );
+		}
+	}
+	
+	// if touch-overflow is enabled, disable user scaling, as it creates usability issues
+	if( $.support.touchOverflow && $.mobile.touchOverflowEnabled && !$.mobile.touchOverflowZoomEnabled ){
+		disableZoom();
+	}
+
+	// initialize events now, after mobileinit has occurred
+	$.mobile._registerInternalEvents();
+
+	// check which scrollTop value should be used by scrolling to 1 immediately at domready
+	// then check what the scroll top is. Android will report 0... others 1
+	// note that this initial scroll won't hide the address bar. It's just for the check.
+	$(function() {
+		window.scrollTo( 0, 1 );
+
+		// if defaultHomeScroll hasn't been set yet, see if scrollTop is 1
+		// it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar)
+		// so if it's 1, use 0 from now on
+		$.mobile.defaultHomeScroll = ( !$.support.scrollTop || $(window).scrollTop() === 1 ) ? 0 : 1;
+
+		//dom-ready inits
+		if( $.mobile.autoInitializePage ){
+			$.mobile.initializePage();
+		}
+
+		// window load event
+		// hide iOS browser chrome on load
+		$window.load( $.mobile.silentScroll );
+	});
+})( jQuery, this );
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw.js
new file mode 100644
index 0000000..c69fa5e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/js/tizen-web-ui-fw.js
@@ -0,0 +1,16145 @@
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Base class for widgets that need the following features:
+//
+// I. HTML prototype loading
+//
+// This class provides HTML prototype loading for widgets. That is, the widget implementation specifies its HTML portions
+// in one continuous HTML snippet, and it optionally provides an object containing selectors into the various parts of the
+// HTML snippet. This widget loads the HTML snippet into a jQuery object, and optionally assigns jQuery objects to each of
+// the selectors in the optionally provided object.
+//
+// To use this functionality you can either derive from this class, or you can call its prototype's gtype method.
+//
+// 1. Widgets deriving from this class should define _htmlProto as part of their prototype declaration. _htmlProto looks like
+// this:
+//
+// _htmlProto: {
+//     source: string|jQuery object (optional) default: string - The name of the widget
+//     ui: {
+//         uiElement1: "#ui-element-1-selector",
+//         uiElement2: "#ui-element-2-selector",
+//         ...
+//         subElement: {
+//             subElement1: "#sub-element-1-selector",
+//             subElement2: "#sub-element-2-selector",
+//             ...
+//         }
+//         ...
+//     }
+// }
+//
+// If neither 'source' nor 'ui' are defined, you must still include an empty _htmlProto key (_htmlProto: {}) to indicate
+// that you wish to make use of this feature. This will cause a prototype HTML file named after your widget to be loaded.
+// The loaded prototype will be placed into your widget's prototype's _protoHtml.source key.
+//
+// If 'source' is defined as a string, it is the name of the widget (including namespace). This is the default. If your
+// widget's HTML prototype is loaded via AJAX and the name of the AJAX file is different from the name of your widget
+// (that is, it is not "<widgetName>.prototype.html", then you should explicitly define 'source' as:
+//
+// If you wish to load HTML prototypes via AJAX, modify the getProtoPath() function defined below to reflect the directory
+// structure holding your widget HTML prototypes.
+//
+// source: "alternateWidgetName"
+//
+// If AJAX loading fails, source is set to a jQuery object containing a div with an error message. You can check whether
+// loading failed via the jQuery object's jqmData( "tizen.widgetex.ajax.fail" ) data item. If false, then the jQuery object
+// is the actual prototype loaded via AJAX or present inline. Otherwise, the jQuery object is the error message div.
+//
+// If 'source' is defined as a jQuery object, it is considered already loaded.
+//
+// if 'ui' is defined inside _htmlProto, It is assumed to be an object such that every one of its keys is either a string,
+// or another object with the same properties as itself.
+//
+// When a widget is instantiated, the HTML prototype is loaded if not already present in the prototype. If 'ui' is present
+// inside _htmlProto, the prototype is cloned. Then, a new structure is created based on 'ui' with each selector replaced
+// by a jQuery object containing the results of performing .find() on the prototype's clone with the filter set to the
+// value of the string. In the special case where the selector starts with a '#', the ID is removed from the element after
+// it is assigned into the structure being created. This structure is then made accessible from the widget instance via
+// the '_ui' key (i.e., this._ui).
+//
+// 2. Use the loadPrototype method when your widget does not derive from $.tizen.widgetex:
+// Add _htmlProto to your widget's prototype as described above. Then, in your widget's _create() method, call
+// loadPrototype in the following manner:
+//
+// $.tizen.widgetex.loadPrototype.call(this, "namespace.widgetName" );
+//
+// Thereafter, you may use the HTML prototype from your widget's prototype or, if you have specified a 'ui' key in your
+// _htmlProto key, you may use this._ui from your widget instance.
+//
+// II. realize method
+//
+// When a widget is created, some of its properties cannot be set immediately, because they depend on the widths/heights
+// of its constituent elements. They can only be calculated when the page containing the widget is made visible via the
+// "pageshow" event, because widths/heights always evaluate to 0 when retrieved from a widget that is not visible. When
+// you inherit from widgetex, you can add a "_realize" function to your prototype. This function will be called once right
+// after _create() if the element that anchors your widget is on a visible page. Otherwise, it will be called when the
+// page to which the widget belongs emits the "pageshow" event.
+//
+// NB: If your widget is inside a container which is itself not visible, such as an expandable or a collapsible, your
+// widget will remain hidden even though "pageshow" is fired and therefore _realize is called. In this case, widths and
+// heights will be unreliable even during _realize.
+//
+// III. systematic option handling
+//
+// If a widget has lots of options, the _setOption function can become a long switch for setting each recognized option.
+// It is also tempting to allow options to determine the way a widget is created, by basing decisions on various options
+// during _create(). Often, the actions based on option values in _create() are the same as those in _setOption. To avoid
+// such code duplication, this class calls _setOption once for each option after _create() has completed.
+//
+// Furthermore, to avoid writing long switches in a widget's _setOption method, this class implements _setOption in such
+// a way that, for any given option (e.g. "myOption" ), _setOption looks for a method _setMyOption in the widget's
+// implementation, and if found, calls the method with the value of the option.
+//
+// If your widget does not inherit from widgetex, you can still use widgetex' systematic option handling:
+// 1. define the _setOption method for your widget as follows:
+//      _setOption: $.tizen.widgetex.prototype._setOption
+// 2. Call this._setOptions(this.options) from your widget's _create() function.
+// 3. As with widgetex-derived widgets, implement a corresponding _setMyOptionName function for each option myOptionName
+// you wish to handle.
+//
+// IV. systematic value handling for input elements
+//
+// If your widget happens to be constructed from an <input> element, you have to handle the "value" attribute specially,
+// and you have to emit the "change" signal whenever it changes, in addition to your widget's normal signals and option
+// changes. With widgetex, you can assign one of your widget's "data-*" properties to be synchronized to the "value"
+// property whenever your widget is constructed onto an <input> element. To do this, define, in your prototype:
+//
+// _value: {
+//      attr: "data-my-attribute",
+//      signal: "signal-to-emit"
+// }
+//
+// Then, call this._setValue(newValue) whenever you wish to set the value for your widget. This will set the data-*
+// attribute, emit the custom signal (if set) with the new value as its parameter, and, if the widget is based on an
+// <input> element, it will also set the "value" attribute and emit the "change" signal.
+//
+// "attr" is required if you choose to define "_value", and identifies the data-attribute to set in addition to "value",
+// if your widget's element is an input.
+// "signal" is optional, and will be emitted when setting the data-attribute via this._setValue(newValue).
+//
+// If your widget does not derive from widgetex, you can still define "_value" as described above and call
+// $.tizen.widgetex.setValue(widget, newValue).
+//
+// V. Systematic enabled/disabled handling for input elements
+//
+// widgetex implements _setDisabled which will disable the input associated with this widget, if any. Thus, if you derive
+// from widgetex and you plan on implementing the disabled state, you should chain up to
+// $.tizen.widgetex.prototype._setDisabled(value), rather than $.Widget.prototype._setOption( "disabled", value).
+
+(function ($, undefined) {
+
+// Framework-specific HTML prototype path for AJAX loads
+	function getProtoPath() {
+		var theScriptTag = $( "script[data-framework-version][data-framework-root][data-framework-theme]" );
+
+		return (theScriptTag.attr( "data-framework-root" ) + "/" +
+				theScriptTag.attr( "data-framework-version" ) + "/themes/" +
+				theScriptTag.attr( "data-framework-theme" ) + "/proto-html" );
+	}
+
+	$.widget( "tizen.widgetex", $.mobile.widget, {
+		_createWidget: function () {
+			$.tizen.widgetex.loadPrototype.call( this, this.namespace + "." + this.widgetName );
+			$.mobile.widget.prototype._createWidget.apply( this, arguments );
+		},
+
+		_init: function () {
+			// TODO THIS IS TEMPORARY PATCH TO AVOID CTXPOPUP PAGE CRASH
+			if ( this.element === undefined ) {
+				return;
+			}
+
+			var page = this.element.closest( ".ui-page" ),
+				self = this,
+				myOptions = {};
+
+			if ( page.is( ":visible" ) ) {
+				this._realize();
+			} else {
+				page.bind( "pageshow", function () { self._realize(); } );
+			}
+
+			$.extend( myOptions, this.options );
+
+			this.options = {};
+
+			this._setOptions( myOptions );
+		},
+
+		_getCreateOptions: function () {
+			// if we're dealing with an <input> element, value takes precedence over corresponding data-* attribute, if a
+			// mapping has been established via this._value. So, assign the value to the data-* attribute, so that it may
+			// then be assigned to this.options in the superclass' _getCreateOptions
+
+			if (this.element.is( "input" ) && this._value !== undefined) {
+				var theValue =
+					( ( this.element.attr( "type" ) === "checkbox" || this.element.attr( "type" ) === "radio" )
+							? this.element.is( ":checked" )
+									: this.element.is( "[value]" )
+									? this.element.attr( "value" )
+											: undefined);
+
+				if ( theValue != undefined ) {
+					this.element.attr( this._value.attr, theValue );
+				}
+			}
+
+			return $.mobile.widget.prototype._getCreateOptions.apply( this, arguments );
+		},
+
+		_setOption: function ( key, value ) {
+			var setter = "_set" + key.replace(/^[a-z]/, function (c) { return c.toUpperCase(); } );
+
+			if ( this[setter] !== undefined ) {
+				this[setter]( value );
+			} else {
+				$.mobile.widget.prototype._setOption.apply( this, arguments );
+			}
+		},
+
+		_setDisabled: function ( value ) {
+			$.Widget.prototype._setOption.call( this, "disabled", value );
+			if ( this.element.is( "input" ) ) {
+				this.element.attr( "disabled", value );
+			}
+		},
+
+		_setValue: function ( newValue ) {
+			$.tizen.widgetex.setValue( this, newValue );
+		},
+
+		_realize: function () {}
+	} );
+
+	$.tizen.widgetex.setValue = function ( widget, newValue ) {
+		if ( widget._value !== undefined ) {
+			var valueString = ( widget._value.makeString ? widget._value.makeString(newValue) : newValue ),
+				inputType;
+
+			widget.element.attr( widget._value.attr, valueString );
+			if ( widget._value.signal !== undefined ) {
+				widget.element.triggerHandler( widget._value.signal, newValue );
+			}
+
+			if ( widget.element.is( "input" ) ) {
+				inputType = widget.element.attr( "type" );
+
+				// Special handling for checkboxes and radio buttons, where the presence of the "checked" attribute is really
+				// the value
+				if ( inputType === "checkbox" || inputType === "radio" ) {
+					if ( newValue ) {
+						widget.element.attr( "checked", true );
+					} else {
+						widget.element.removeAttr( "checked" );
+					}
+				} else {
+					widget.element.attr( "value", valueString );
+				}
+
+				widget.element.trigger( "change" );
+			}
+		}
+	};
+
+	$.tizen.widgetex.assignElements = function (proto, obj) {
+		var ret = {},
+			key;
+
+		for ( key in obj ) {
+			if ( ( typeof obj[key] ) === "string" ) {
+				ret[key] = proto.find( obj[key] );
+				if ( obj[key].match(/^#/) ) {
+					ret[key].removeAttr( "id" );
+				}
+			} else {
+				if ( (typeof obj[key]) === "object" ) {
+					ret[key] = $.tizen.widgetex.assignElements( proto, obj[key] );
+				}
+			}
+		}
+
+		return ret;
+	};
+
+	$.tizen.widgetex.loadPrototype = function ( widget, ui ) {
+		var ar = widget.split( "." ),
+			namespace,
+			widgetName,
+			htmlProto,
+			protoPath;
+
+		if ( ar.length == 2 ) {
+			namespace = ar[0];
+			widgetName = ar[1];
+			htmlProto = $( "<div></div>" )
+						.text( "Failed to load proto for widget " + namespace + "." + widgetName + "!" )
+						.css( {background: "red", color: "blue", border: "1px solid black"} )
+						.jqmData( "tizen.widgetex.ajax.fail", true );
+
+			// If htmlProto is defined
+			if ( $[namespace][widgetName].prototype._htmlProto !== undefined ) {
+				// If no source is defined, use the widget name
+				if ( $[namespace][widgetName].prototype._htmlProto.source === undefined ) {
+					$[namespace][widgetName].prototype._htmlProto.source = widgetName;
+				}
+
+				// Load the HTML prototype via AJAX if not defined inline
+				if ( typeof $[namespace][widgetName].prototype._htmlProto.source === "string" ) {
+					// Establish the path for the proto file
+					widget = $[namespace][widgetName].prototype._htmlProto.source;
+					protoPath = getProtoPath();
+
+					// Make the AJAX call
+					$.ajax( {
+						url: protoPath + "/" + widget + ".prototype.html",
+						async: false,
+						dataType: "html"
+					}).success( function (data, textStatus, jqXHR ) {
+						htmlProto = $( "<div></div>" ).html(data).jqmData( "tizen.widgetex.ajax.fail", false );
+					} );
+
+					// Assign the HTML proto to the widget prototype
+					$[namespace][widgetName].prototype._htmlProto.source = htmlProto;
+				} else { // Otherwise, use the inline definition
+					// AJAX loading has trivially succeeded, since there was no AJAX loading at all
+					$[namespace][widgetName].prototype._htmlProto.source.jqmData( "tizen.widgetex.ajax.fail", false );
+					htmlProto = $[namespace][widgetName].prototype._htmlProto.source;
+				}
+
+				// If there's a "ui" portion in the HTML proto, copy it over to this instance, and
+				// replace the selectors with the selected elements from a copy of the HTML prototype
+				if ( $[namespace][widgetName].prototype._htmlProto.ui !== undefined ) {
+					// Assign the relevant parts of the proto
+					$.extend( this, {
+						_ui: $.tizen.widgetex.assignElements( htmlProto.clone(), $[namespace][widgetName].prototype._htmlProto.ui )
+					});
+				}
+			}
+		}
+	};
+
+}( jQuery ) );
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.colorwidget", $.tizen.widgetex, {
+		options: {
+			color: "#ff0972"
+		},
+
+		_value: {
+			attr: "data-" + ( $.mobile.ns || "" ) + "color",
+			signal: "colorchanged"
+		},
+
+		_getElementColor: function ( el, cssProp ) {
+			return el.jqmData( "clr" );
+		},
+
+		_setElementColor: function ( el, hsl, cssProp ) {
+			var clrlib = $.tizen.colorwidget.clrlib,
+				clr = clrlib.RGBToHTML( clrlib.HSLToRGB( hsl ) ),
+				dclr = clrlib.RGBToHTML( clrlib.HSLToGray( hsl ) );
+
+			el.jqmData( "clr", clr );
+			el.jqmData( "dclr", dclr );
+			el.jqmData( "cssProp", cssProp );
+			el.attr( "data-" + ( $.mobile.ns || "" ) + "has-dclr", true );
+			el.css( cssProp, this.options.disabled ? dclr : clr );
+
+			return { clr: clr, dclr: dclr };
+		},
+
+		_displayDisabledState: function ( toplevel ) {
+			var self = this,
+				sel = ":jqmData(has-dclr='true')",
+				dst = toplevel.is( sel ) ? toplevel : $([]),
+				el;
+
+			dst.add( toplevel.find( sel ) )
+				.each( function () {
+					el = $( this );
+					el.css( el.jqmData( "cssProp" ), el.jqmData( self.options.disabled ? "dclr" : "clr" ) );
+				} );
+		},
+
+		_setColor: function ( value ) {
+			var currentValue = ( this.options.color );
+
+			value = value.match(/#[0-9A-Fa-f]{6}/)
+				? value
+					: currentValue.match(/#[0-9A-Fa-f]{6}/)
+					? currentValue
+							: $.tizen.colorwidget.prototype.options.color;
+
+			if ( this.options.color !== value ) {
+				this.options.color = value;
+				this._setValue( value );
+				return true;
+			}
+			return false;
+		}
+	} );
+
+	$.tizen.colorwidget.clrlib = {
+		nearestInt: function ( val ) {
+			var theFloor = Math.floor( val );
+
+			return ( ( ( val - theFloor ) > 0.5 ) ? ( theFloor + 1 ) : theFloor );
+		},
+
+		// Converts html color string to rgb array.
+		//
+		// Input: string clr_str, where
+		// clr_str is of the form "#aabbcc"
+		//
+		// Returns: [ r, g, b ], where
+		// r is in [0, 1]
+		// g is in [0, 1]
+		// b is in [0, 1]
+		HTMLToRGB: function ( clr_str ) {
+			clr_str = ( ( '#' == clr_str.charAt( 0 ) ) ? clr_str.substring( 1 ) : clr_str );
+
+			return [ parseInt(clr_str.substring(0, 2), 16) / 255.0,
+					parseInt(clr_str.substring(2, 4), 16) / 255.0,
+					parseInt(clr_str.substring(4, 6), 16) / 255.0 ];
+		},
+
+		// Converts rgb array to html color string.
+		//
+		// Input: [ r, g, b ], where
+		// r is in [0, 1]
+		// g is in [0, 1]
+		// b is in [0, 1]
+		//
+		// Returns: string of the form "#aabbcc"
+		RGBToHTML: function ( rgb ) {
+			var ret = "#", val, theFloor,
+				Nix;
+			for ( Nix in rgb ) {
+				val = rgb[Nix] * 255;
+				theFloor = Math.floor( val );
+				val = ( ( val - theFloor > 0.5 ) ? ( theFloor + 1 ) : theFloor );
+				ret = ret + ( ( ( val < 16 ) ? "0" : "" ) + ( val & 0xff ).toString( 16 ) );
+			}
+
+			return ret;
+		},
+
+		// Converts hsl to rgb.
+		//
+		// From http://130.113.54.154/~monger/hsl-rgb.html
+		//
+		// Input: [ h, s, l ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// l is in [0,   1]
+		//
+		// Returns: [ r, g, b ], where
+		// r is in [0, 1]
+		// g is in [0, 1]
+		// b is in [0, 1]
+		HSLToRGB: function ( hsl ) {
+			var h = hsl[0] / 360.0, s = hsl[1], l = hsl[2],
+				temp1,
+				temp2,
+				temp3,
+				ret;
+
+			if ( 0 === s ) {
+				return [ l, l, l ];
+			}
+
+			temp2 = ( ( l < 0.5 )
+					? l * ( 1.0 + s )
+					: l + s - l * s);
+
+			temp1 = 2.0 * l - temp2;
+			temp3 = {
+				r: h + 1.0 / 3.0,
+				g: h,
+				b: h - 1.0 / 3.0
+			};
+
+			temp3.r = ( ( temp3.r < 0 ) ? ( temp3.r + 1.0 ) : ( ( temp3.r > 1 ) ? ( temp3.r - 1.0 ) : temp3.r ) );
+			temp3.g = ( ( temp3.g < 0 ) ? ( temp3.g + 1.0 ) : ( ( temp3.g > 1 ) ? ( temp3.g - 1.0 ) : temp3.g ) );
+			temp3.b = ( ( temp3.b < 0 ) ? ( temp3.b + 1.0 ) : ( ( temp3.b > 1 ) ? ( temp3.b - 1.0 ) : temp3.b ) );
+
+			ret = [( ( ( 6.0 * temp3.r ) < 1 ) ? ( temp1 + ( temp2 - temp1 ) * 6.0 * temp3.r ) :
+					( ( ( 2.0 * temp3.r ) < 1 ) ? temp2 :
+							( ( ( 3.0 * temp3.r ) < 2 ) ? ( temp1 + ( temp2 - temp1 ) * ( ( 2.0 / 3.0 ) - temp3.r ) * 6.0 ) :
+									temp1) ) ),
+						( ( ( 6.0 * temp3.g ) < 1) ? ( temp1 + ( temp2 - temp1 ) * 6.0 * temp3.g ) :
+							( ( ( 2.0 * temp3.g ) < 1 ) ? temp2 :
+								( ( ( 3.0 * temp3.g ) < 2 ) ? ( temp1 + ( temp2 - temp1 ) * ( ( 2.0 / 3.0 ) - temp3.g ) * 6.0 ) :
+										temp1 ) ) ),
+									( ( ( 6.0 * temp3.b ) < 1 ) ? ( temp1 + ( temp2 - temp1 ) * 6.0 * temp3.b ) :
+										( ( ( 2.0 * temp3.b ) < 1 ) ? temp2 :
+											( ( ( 3.0 * temp3.b ) < 2 ) ? ( temp1 + ( temp2 - temp1 ) * ( ( 2.0 / 3.0 ) - temp3.b ) * 6.0 ) :
+												temp1 ) ) )];
+
+			return ret;
+		},
+
+		// Converts hsv to rgb.
+		//
+		// Input: [ h, s, v ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// v is in [0,   1]
+		//
+		// Returns: [ r, g, b ], where
+		// r is in [0, 1]
+		// g is in [0, 1]
+		// b is in [0, 1]
+		HSVToRGB: function ( hsv ) {
+			return $.tizen.colorwidget.clrlib.HSLToRGB( $.tizen.colorwidget.clrlib.HSVToHSL( hsv ) );
+		},
+
+		// Converts rgb to hsv.
+		//
+		// from http://coecsl.ece.illinois.edu/ge423/spring05/group8/FinalProject/HSV_writeup.pdf
+		//
+		// Input: [ r, g, b ], where
+		// r is in [0,   1]
+		// g is in [0,   1]
+		// b is in [0,   1]
+		//
+		// Returns: [ h, s, v ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// v is in [0,   1]
+		RGBToHSV: function ( rgb ) {
+			var min, max, delta, h, s, v, r = rgb[0], g = rgb[1], b = rgb[2];
+
+			min = Math.min( r, Math.min( g, b ) );
+			max = Math.max( r, Math.max( g, b ) );
+			delta = max - min;
+
+			h = 0;
+			s = 0;
+			v = max;
+
+			if ( delta > 0.00001 ) {
+				s = delta / max;
+
+				if ( r === max ) {
+					h = ( g - b ) / delta;
+				} else {
+					if ( g === max ) {
+						h = 2 + ( b - r ) / delta;
+					} else {
+						h = 4 + ( r - g ) / delta;
+					}
+				}
+				h *= 60;
+
+				if ( h < 0 ) {
+					h += 360;
+				}
+			}
+
+			return [h, s, v];
+		},
+
+		// Converts hsv to hsl.
+		//
+		// Input: [ h, s, v ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// v is in [0,   1]
+		//
+		// Returns: [ h, s, l ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// l is in [0,   1]
+		HSVToHSL: function ( hsv ) {
+			var max = hsv[2],
+				delta = hsv[1] * max,
+				min = max - delta,
+				sum = max + min,
+				half_sum = sum / 2,
+				s_divisor = ( ( half_sum < 0.5 ) ? sum : ( 2 - max - min ) );
+
+			return [ hsv[0], ( ( 0 == s_divisor ) ? 0 : ( delta / s_divisor ) ), half_sum ];
+		},
+
+		// Converts rgb to hsl
+		//
+		// Input: [ r, g, b ], where
+		// r is in [0,   1]
+		// g is in [0,   1]
+		// b is in [0,   1]
+		//
+		// Returns: [ h, s, l ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// l is in [0,   1]
+		RGBToHSL: function ( rgb ) {
+			return $.tizen.colorwidget.clrlib.HSVToHSL( $.tizen.colorwidget.clrlib.RGBToHSV( rgb ) );
+		},
+
+		// Converts hsl to grayscale
+		// Full-saturation magic grayscale values were taken from the Gimp
+		//
+		// Input: [ h, s, l ], where
+		// h is in [0, 360]
+		// s is in [0,   1]
+		// l is in [0,   1]
+		//
+		// Returns: [ r, g, b ], where
+		// r is in [0,   1]
+		// g is in [0,   1]
+		// b is in [0,   1]
+		HSLToGray: function ( hsl ) {
+			var intrinsic_vals = [0.211764706, 0.929411765, 0.71372549, 0.788235294, 0.070588235, 0.28627451, 0.211764706],
+				idx = Math.floor(hsl[0] / 60),
+				lowerHalfPercent,
+				upperHalfPercent,
+				begVal,
+				endVal,
+				val;
+
+			// Find hue interval
+			begVal = intrinsic_vals[idx];
+			endVal = intrinsic_vals[idx + 1];
+
+			// Adjust for lum
+			if ( hsl[2] < 0.5 ) {
+				lowerHalfPercent = hsl[2] * 2;
+				begVal *= lowerHalfPercent;
+				endVal *= lowerHalfPercent;
+			} else {
+				upperHalfPercent = ( hsl[2] - 0.5 ) * 2;
+				begVal += ( 1.0 - begVal ) * upperHalfPercent;
+				endVal += ( 1.0 - endVal ) * upperHalfPercent;
+			}
+
+			// This is the gray value at full sat, whereas hsl[2] is the gray value at 0 sat.
+			val = begVal + ( ( endVal - begVal ) * ( hsl[0] - ( idx * 60 ) ) ) / 60;
+
+			// Get value at hsl[1]
+			val = val + ( hsl[2] - val ) * ( 1.0 - hsl[1] );
+
+			return [val, val, val];
+		}
+	};
+
+}( jQuery ));
+(function ( $, undefined ) {
+
+	$.widget( "tizen.huegradient", $.tizen.widgetex, {
+		_create: function () {
+			this.element.addClass( "tizen-huegradient" );
+		},
+
+		// Crutches for IE: it is incapable of multi-stop gradients, so add multiple divs inside the given div, each with a
+		// two-point gradient
+		_IEGradient: function ( div, disabled ) {
+			var rainbow = disabled
+				? ["#363636", "#ededed", "#b6b6b6", "#c9c9c9", "#121212", "#494949", "#363636"]
+				: ["#ff0000", "#ffff00", "#00ff00", "#00ffff", "#0000ff", "#ff00ff", "#ff0000"],
+				Nix;
+
+			for (Nix = 0 ; Nix < 6 ; Nix++ ) {
+				$( "<div></div>" )
+					.css( {
+						position: "absolute",
+						width: ( 100 / 6 ) + "%",
+						height: "100%",
+						left: ( Nix * 100 / 6 ) + "%",
+						top: "0px",
+						filter: "progid:DXImageTransform.Microsoft.gradient (startColorstr='" + rainbow[Nix] + "', endColorstr='" + rainbow[Nix + 1] + "', GradientType = 1)"
+					} )
+					.appendTo( div );
+			}
+		},
+
+		_setDisabled: function ( value ) {
+			$.Widget.prototype._setOption.call( this, "disabled", value );
+			if ( $.mobile.browser.ie ) {
+				this._IEGradient( this.element.empty(), value );
+			}
+		}
+	} );
+}( jQuery ) );
+( function ( $, undefined ) {
+
+	$.widget( "todons.colorwidget", $.mobile.widget, {
+		options: {
+			color: "#ff0972"
+		},
+
+		_create: function () {
+			$.extend ( this, {
+				isInput: this.element.is( "input" )
+			} );
+
+			/* "value", if present, takes precedence over "data-color" */
+			if ( this.isInput ) {
+				if ( this.element.attr( "value" ).match(/#[0-9A-Fa-f]{6}/) ) {
+					this.element.attr( "data-color", this.element.attr( "value" ) );
+				}
+			}
+
+			$.mobile.todons.parseOptions( this, true );
+		},
+
+		_setOption: function ( key, value, unconditional ) {
+			if ( undefined === unconditional ) {
+				unconditional = false;
+			}
+
+			if ( key === "color" ) {
+				this._setColor(value, unconditional);
+			}
+		},
+
+		_setColor: function ( value, unconditional ) {
+			if ( value.match(/#[0-9A-Fa-f]{6}/) && ( value != this.options.color || unconditional ) ) {
+				this.options.color = value;
+				this.element.attr( "data-color", value );
+
+				if ( this.isInput ) {
+					this.element.attr( "value", value );
+				}
+
+				this.element.triggerHandler( "colorchanged", value );
+				return true;
+			}
+			return false;
+		}
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION - listview autodividers
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Applies dividers automatically to a listview, using link text
+// (for link lists) or text (for readonly lists) as the basis for the
+// divider text.
+//
+// Apply using autodividers({type: 'X'}) on a <ul> with
+// data-role="listview", or with data-autodividers="true", where X
+// is the type of divider to create. The default divider type is 'alpha',
+// meaning first characters of list item text, upper-cased.
+//
+// The element used to derive the text for the auto dividers defaults
+// to the first link inside the li; failing that, the text directly inside
+// the li element is used. This can be overridden with the
+// data-autodividers-selector attribute or via options; the selector
+// will use each li element as its context.
+//
+// Any time a new li element is added to the list, or an li element is
+// removed, this extension will update the dividers in the listview
+// accordingly.
+//
+// Note that if a listview already has dividers, applying this
+// extension will remove all the existing dividers and replace them
+// with new, generated ones.
+//
+// Also note that this extension doesn't sort the list: it only creates
+// dividers based on text inside list items. So if your list isn't
+// alphabetically-sorted, you may get duplicate dividers.
+//
+// So, for example, this markup:
+//
+// <ul id="has-no-dividers" data-role="listview" data-autodividers="alpha">
+//		<li>Barry</li>
+//		<li>Carrie</li>
+//		<li>Betty</li>
+//		<li>Harry</li>
+//		<li>Carly</li>
+//		<li>Hetty</li>
+// </ul>
+//
+// will produce dividers like this:
+//
+// <ul data-role="listview" data-autodividers="alpha">
+//	<li data-role="list-divider">B</li>
+//	<li>Barry</li>
+//	<li data-role="list-divider">C</li>
+//	<li>Carrie</li>
+//	<li data-role="list-divider">B</li>
+//	<li>Betty</li>
+//	<li data-role="list-divider">H</li>
+//	<li>Harry</li>
+//	<li data-role="list-divider">C</li>
+//	<li>Carly</li>
+//	<li data-role="list-divider">H</li>
+//	<li>Hetty</li>
+// </ul>
+//
+// with each divider occuring twice.
+//
+// Options:
+//
+//	selector: The jQuery selector to use to find text for the
+//			generated dividers. Default is to use the first 'a'
+//			(link) element. If this selector doesn't find any
+//			text, the widget automatically falls back to the text
+//			inside the li (for read-only lists). Can be set to a custom
+//			selector via data-autodividers-selector="..." or the 'selector'
+//			option.
+//
+//	 type: 'alpha' (default) sets the auto divider type to "uppercased
+//		 first character of text selected from each item"; "full" sets
+//		 it to the unmodified text selected from each item. Set via
+//		 the data-autodividers="<type>" attribute on the listview or
+//		 the 'type' option.
+//
+// Events:
+//
+//	updatelayout: Triggered if the dividers in the list change;
+//		this happens if list items are added to the listview,
+//		which causes the autodividers to be regenerated.
+
+(function ( $, undefined ) {
+
+	var autodividers = function ( options ) {
+		var list = $( this ),
+			listview = list.data( 'listview' ),
+			dividerType,
+			textSelector,
+			getDividerText,
+			mergeDividers,
+			isNonDividerLi,
+			liAdded,
+			liRemoved;
+
+		options = options || {};
+		dividerType = options.type || list.jqmData( 'autodividers' ) || 'alpha';
+		textSelector = options.selector || list.jqmData( 'autodividers-selector' ) || 'a';
+
+		getDividerText = function ( elt ) {
+			// look for some text in the item
+			var text = elt.find( textSelector ).text() || elt.text() || null;
+
+			if ( !text ) {
+				return null;
+			}
+
+			// create the text for the divider
+			if ( dividerType === 'alpha' ) {
+				text = text.slice( 0, 1 ).toUpperCase();
+			}
+
+			return text;
+		};
+
+		mergeDividers = function () {
+			var dividersChanged = false,
+				divider,
+				dividerText,
+				selector,
+				nextDividers;
+
+			// any dividers which are following siblings of a divider, where
+			// there are no dividers with different text inbetween, can be removed
+			list.find( 'li.ui-li-divider' ).each(function () {
+				divider = $( this );
+				dividerText = divider.text();
+				selector = '.ui-li-divider:not(:contains(' + dividerText + '))';
+				nextDividers = divider.nextUntil( selector );
+				nextDividers = nextDividers.filter( '.ui-li-divider:contains(' + dividerText + ')' );
+
+				if ( nextDividers.length > 0 ) {
+					nextDividers.remove();
+					dividersChanged = true;
+				}
+			} );
+
+			if ( dividersChanged ) {
+				list.trigger( 'updatelayout' );
+			}
+		};
+
+		// check that elt is a non-divider li element
+		isNonDividerLi = function ( elt ) {
+			return elt.is('li') &&
+					elt.jqmData( 'role' ) !== 'list-divider';
+		};
+
+		// li element inserted, so check whether it needs a divider
+		liAdded = function ( li ) {
+			var dividerText = getDividerText( li ),
+				existingDividers,
+				divider;
+
+			if ( !dividerText ) {
+				listview.refresh();
+				return;
+			}
+
+			// add expected divider for this li if it doesn't exist
+			existingDividers = li.prevAll( '.ui-li-divider:first:contains(' + dividerText + ')' );
+
+			if ( existingDividers.length === 0 ) {
+				divider = $( '<li>' + dividerText + '</li>' );
+				divider.attr( 'data-' + $.mobile.ns + 'role', 'list-divider' );
+				li.before( divider );
+
+				listview.refresh();
+
+				mergeDividers();
+			} else {
+				listview.refresh();
+			}
+		};
+
+		// li element removed, so check whether its divider should go
+		liRemoved = function ( li ) {
+			var dividerText = getDividerText( li ),
+				precedingItems,
+				nextItems;
+
+			if ( !dividerText ) {
+				listview.refresh();
+				return;
+			}
+
+			// remove divider for this li if there are no other
+			// li items for the divider before or after this li item
+			precedingItems = li.prevUntil( '.ui-li-divider:contains(' + dividerText + ')' );
+			nextItems = li.nextUntil( '.ui-li-divider' );
+
+			if ( precedingItems.length === 0 && nextItems.length === 0 ) {
+				li.prevAll( '.ui-li-divider:contains(' + dividerText + '):first' ).remove();
+
+				listview.refresh();
+
+				mergeDividers();
+			} else {
+				listview.refresh();
+			}
+		};
+
+		// set up the dividers on first create
+		list.find( 'li' ).each( function () {
+			var li = $( this );
+
+			// remove existing dividers
+			if ( li.jqmData( 'role' ) === 'list-divider' ) {
+				li.remove();
+			} else {			// make new dividers for list items
+				liAdded( li );
+			}
+		} );
+
+		// bind to DOM events to keep list up to date
+		list.bind( 'DOMNodeInserted', function ( e ) {
+			var elt = $( e.target );
+
+			if ( !isNonDividerLi( elt ) ) {
+				return;
+			}
+
+			liAdded( elt );
+		} );
+
+		list.bind( 'DOMNodeRemoved', function ( e ) {
+			var elt = $( e.target );
+
+			if ( !isNonDividerLi( elt ) ) {
+				return;
+			}
+
+			liRemoved( elt );
+		} );
+	};
+
+	$.fn.autodividers = autodividers;
+
+	$( ":jqmData(role=listview)" ).live( "listviewcreate", function () {
+		var list = $( this );
+
+		if ( list.is( ':jqmData(autodividers)' ) ) {
+			list.autodividers();
+		}
+	} );
+}( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// most of following codes are derived from jquery.mobile.scrollview.js
+(function ( $, window, document, undefined ) {
+
+	function circularNum( num, total ) {
+		var n = num % total;
+		if ( n < 0 ) {
+			n = total + n;
+		}
+		return n;
+	}
+
+	function setElementTransform( $ele, x, y ) {
+		var v = "translate3d( " + x + "," + y + ", 0px)";
+		$ele.css({
+			"-moz-transform": v,
+			"-webkit-transform": v,
+			"transform": v
+		} );
+	}
+
+	function MomentumTracker( options ) {
+		this.options = $.extend( {}, options );
+		this.easing = "easeOutQuad";
+		this.reset();
+	}
+
+	var tstates = {
+		scrolling : 0,
+		done : 1
+	};
+
+	function getCurrentTime() {
+		return ( new Date()).getTime();
+	}
+
+	$.extend( MomentumTracker.prototype, {
+		start: function ( pos, speed, duration ) {
+			this.state = ( speed != 0 ) ? tstates.scrolling : tstates.done;
+			this.pos = pos;
+			this.speed = speed;
+			this.duration = duration;
+
+			this.fromPos = 0;
+			this.toPos = 0;
+
+			this.startTime = getCurrentTime();
+		},
+
+		reset: function () {
+			this.state = tstates.done;
+			this.pos = 0;
+			this.speed = 0;
+			this.duration = 0;
+		},
+
+		update: function () {
+			var state = this.state,
+				duration,
+				elapsed,
+				dx,
+				x;
+
+			if ( state == tstates.done ) {
+				return this.pos;
+			}
+
+			duration = this.duration;
+			elapsed = getCurrentTime() - this.startTime;
+			elapsed = elapsed > duration ? duration : elapsed;
+
+			dx = this.speed * ( 1 - $.easing[this.easing](elapsed / duration, elapsed, 0, 1, duration ) );
+
+			x = this.pos + dx;
+			this.pos = x;
+
+			if ( elapsed >= duration ) {
+				this.state = tstates.done;
+			}
+
+			return this.pos;
+		},
+
+		done: function () {
+			return this.state == tstates.done;
+		},
+
+		getPosition: function () {
+			return this.pos;
+		}
+	} );
+
+	jQuery.widget( "mobile.circularview", jQuery.mobile.widget, {
+		options: {
+			fps:				60,
+
+			scrollDuration:		2000,
+
+			moveThreshold:		10,
+			moveIntervalThreshold:	150,
+
+			startEventName:		"scrollstart",
+			updateEventName:	"scrollupdate",
+			stopEventName:		"scrollstop",
+
+			eventType:			$.support.touch	? "touch" : "mouse",
+
+			delayedClickSelector: "a, .ui-btn",
+			delayedClickEnabled: false
+		},
+
+		_makePositioned: function ( $ele ) {
+			if ( $ele.css( 'position' ) == 'static' ) {
+				$ele.css( 'position', 'relative' );
+			}
+		},
+
+		_create: function () {
+			this._$clip = $( this.element).addClass( "ui-scrollview-clip" );
+			var $child = this._$clip.children(),
+				self;
+			//if ( $child.length > 1 ) {
+			$child = this._$clip.wrapInner( "<div></div>" ).children();
+			//}
+			this._$view = $child.addClass( "ui-scrollview-view" );
+			this._$list = $child.children();
+
+			this._$clip.css( "overflow", "hidden" );
+			this._makePositioned( this._$clip );
+
+			this._$view.css( "overflow", "hidden" );
+			this._tracker = new MomentumTracker( this.options );
+
+			this._timerInterval = 1000 / this.options.fps;
+			this._timerID = 0;
+
+			self = this;
+			this._timerCB = function () { self._handleMomentumScroll(); };
+
+			this.refresh();
+
+			this._addBehaviors();
+		},
+
+		refresh: function () {
+			var itemsPerView;
+
+			this._viewWidth = this._$view.width();
+			this._clipWidth = $( window ).width();
+			this._itemWidth = this._$list.children().first().outerWidth();
+			this._$items = this._$list.children().detach();
+			itemsPerView = this._clipWidth / this._itemWidth;
+			itemsPerView = Math.ceil( itemsPerView * 10 ) / 10;
+			this._itemsPerView = parseInt( itemsPerView, 10 );
+
+			this._rx = -this._itemWidth;
+			this._sx = -this._itemWidth;
+			this._setItems();
+		},
+
+		_startMScroll: function ( speedX, speedY ) {
+			this._stopMScroll();
+
+			var keepGoing = false,
+				duration = this.options.scrollDuration,
+				t = this._tracker,
+				c = this._clipWidth,
+				v = this._viewWidth;
+
+			this._$clip.trigger( this.options.startEventName);
+
+			t.start( this._rx, speedX, duration, (v > c ) ? -(v - c) : 0, 0 );
+			keepGoing = !t.done();
+
+			if ( keepGoing ) {
+				this._timerID = setTimeout( this._timerCB, this._timerInterval );
+			} else {
+				this._stopMScroll();
+			}
+			//console.log( "startmscroll" + this._rx + "," + this._sx );
+		},
+
+		_stopMScroll: function () {
+			if ( this._timerID ) {
+				this._$clip.trigger( this.options.stopEventName );
+				clearTimeout( this._timerID );
+			}
+
+			this._timerID = 0;
+
+			if ( this._tracker ) {
+				this._tracker.reset();
+			}
+			//console.log( "stopmscroll" + this._rx + "," + this._sx );
+		},
+
+		_handleMomentumScroll: function () {
+			var keepGoing = false,
+				v = this._$view,
+				x = 0,
+				y = 0,
+				t = this._tracker;
+
+			if ( t ) {
+				t.update();
+				x = t.getPosition();
+
+				keepGoing = !t.done();
+
+			}
+
+			this._setScrollPosition( x, y );
+			this._rx = x;
+
+			this._$clip.trigger( this.options.updateEventName, [ { x: x, y: y } ] );
+
+			if ( keepGoing ) {
+				this._timerID = setTimeout( this._timerCB, this._timerInterval );
+			} else {
+				this._stopMScroll();
+			}
+		},
+
+		_setItems: function () {
+			var i,
+				$item;
+
+			for ( i = -1; i < this._itemsPerView + 1; i++ ) {
+				$item = this._$items[ circularNum( i, this._$items.length ) ];
+				this._$list.append( $item );
+			}
+			setElementTransform( this._$view, this._sx + "px", 0 );
+			this._$view.width( this._itemWidth * ( this._itemsPerView + 2 ) );
+			this._viewWidth = this._$view.width();
+		},
+
+		_setScrollPosition: function ( x, y ) {
+			var sx = this._sx,
+				dx = x - sx,
+				di = parseInt( dx / this._itemWidth, 10 ),
+				i,
+				idx,
+				$item;
+
+			if ( di > 0 ) {
+				for ( i = 0; i < di; i++ ) {
+					this._$list.children().last().detach();
+					idx = -parseInt( ( sx / this._itemWidth ) + i + 3, 10 );
+					$item = this._$items[ circularNum( idx, this._$items.length ) ];
+					this._$list.prepend( $item );
+					//console.log( "di > 0 : " + idx );
+				}
+			} else if ( di < 0 ) {
+				for ( i = 0; i > di; i-- ) {
+					this._$list.children().first().detach();
+					idx = this._itemsPerView - parseInt( ( sx / this._itemWidth ) + i, 10 );
+					$item = this._$items[ circularNum( idx, this._$items.length ) ];
+					this._$list.append( $item );
+					//console.log( "di < 0 : " + idx );
+				}
+			}
+
+			this._sx += di * this._itemWidth;
+
+			setElementTransform( this._$view, ( x - this._sx - this._itemWidth ) + "px", 0 );
+
+			//console.log( "rx " + this._rx + "sx " + this._sx );
+		},
+
+		_enableTracking: function () {
+			$(document).bind( this._dragMoveEvt, this._dragMoveCB );
+			$(document).bind( this._dragStopEvt, this._dragStopCB );
+		},
+
+		_disableTracking: function () {
+			$(document).unbind( this._dragMoveEvt, this._dragMoveCB );
+			$(document).unbind( this._dragStopEvt, this._dragStopCB );
+		},
+
+		_getScrollHierarchy: function () {
+			var svh = [],
+				d;
+			this._$clip.parents( '.ui-scrollview-clip' ).each( function () {
+				d = $( this ).jqmData( 'circulaview' );
+				if ( d ) {
+					svh.unshift( d );
+				}
+			} );
+			return svh;
+		},
+
+		centerTo: function ( selector ) {
+			var i,
+				newX;
+
+			for ( i = 0; i < this._$items.length; i++ ) {
+				if ( $( this._$items[i]).is( selector ) ) {
+					newX = -( i * this._itemWidth - this._clipWidth / 2 + this._itemWidth * 2 );
+					this.scrollTo( newX, 0 );
+					console.log( i + "," + newX );
+					return;
+				}
+			}
+		},
+
+		scrollTo: function ( x, y, duration ) {
+			this._stopMScroll();
+			if ( !duration ) {
+				this._setScrollPosition( x, y );
+				this._rx = x;
+				return;
+			}
+
+			x = -x;
+			y = -y;
+
+			var self = this,
+				start = getCurrentTime(),
+				efunc = $.easing.easeOutQuad,
+				sx = this._rx,
+				sy = 0,
+				dx = x - sx,
+				dy = 0,
+				tfunc,
+				elapsed,
+				ec;
+
+			tfunc = function () {
+				elapsed = getCurrentTime() - start;
+				if ( elapsed >= duration ) {
+					self._timerID = 0;
+					self._setScrollPosition( x, y );
+				} else {
+					ec = efunc( elapsed / duration, elapsed, 0, 1, duration );
+					self._setScrollPosition( sx + ( dx * ec ), sy + ( dy * ec ) );
+					self._timerID = setTimeout( tfunc, self._timerInterval );
+				}
+			};
+
+			this._timerID = setTimeout( tfunc, this._timerInterval );
+		},
+
+		getScrollPosition: function () {
+			return { x: -this._rx, y: 0 };
+		},
+
+		_handleDragStart: function ( e, ex, ey ) {
+			$.each( this._getScrollHierarchy(), function ( i, sv ) {
+				sv._stopMScroll();
+			} );
+
+			this._stopMScroll();
+
+			if ( this.options.delayedClickEnabled ) {
+				this._$clickEle = $( e.target ).closest( this.options.delayedClickSelector );
+			}
+			this._lastX = ex;
+			this._lastY = ey;
+			this._speedX = 0;
+			this._speedY = 0;
+			this._didDrag = false;
+
+			this._lastMove = 0;
+			this._enableTracking();
+
+			this._ox = ex;
+			this._nx = this._rx;
+
+			if ( this.options.eventType == "mouse" || this.options.delayedClickEnabled ) {
+				e.preventDefault();
+			}
+			//console.log( "scrollstart" + this._rx + "," + this._sx );
+			e.stopPropagation();
+		},
+
+		_handleDragMove: function ( e, ex, ey ) {
+			this._lastMove = getCurrentTime();
+
+			var dx = ex - this._lastX,
+				dy = ey - this._lastY;
+
+			this._speedX = dx;
+			this._speedY = 0;
+
+			this._didDrag = true;
+
+			this._lastX = ex;
+			this._lastY = ey;
+
+			this._mx = ex - this._ox;
+
+			this._setScrollPosition( this._nx + this._mx, 0 );
+
+			//console.log( "scrollmove" + this._rx + "," + this._sx );
+			return false;
+		},
+
+		_handleDragStop: function ( e ) {
+			var l = this._lastMove,
+				t = getCurrentTime(),
+				doScroll = l && ( t - l ) <= this.options.moveIntervalThreshold,
+				sx = ( this._tracker && this._speedX && doScroll ) ? this._speedX : 0,
+				sy = 0;
+
+			this._rx = this._mx ? this._nx + this._mx : this._rx;
+
+			if ( sx ) {
+				this._startMScroll( sx, sy );
+			}
+
+			//console.log( "scrollstop" + this._rx + "," + this._sx );
+
+			this._disableTracking();
+
+			if ( !this._didDrag && this.options.delayedClickEnabled && this._$clickEle.length ) {
+				this._$clickEle
+					.trigger( "mousedown" )
+					.trigger( "mouseup" )
+					.trigger( "click" );
+			}
+
+			if ( this._didDrag ) {
+				e.preventDefault();
+				e.stopPropagation();
+			}
+
+			return this._didDrag ? false : undefined;
+		},
+
+		_addBehaviors: function () {
+			var self = this;
+
+			if ( this.options.eventType === "mouse" ) {
+				this._dragStartEvt = "mousedown";
+				this._dragStartCB = function ( e ) {
+					return self._handleDragStart( e, e.clientX, e.clientY );
+				};
+
+				this._dragMoveEvt = "mousemove";
+				this._dragMoveCB = function ( e ) {
+					return self._handleDragMove( e, e.clientX, e.clientY );
+				};
+
+				this._dragStopEvt = "mouseup";
+				this._dragStopCB = function ( e ) {
+					return self._handleDragStop( e );
+				};
+
+				this._$view.bind( "vclick", function (e) {
+					return !self._didDrag;
+				} );
+
+			} else { //touch
+				this._dragStartEvt = "touchstart";
+				this._dragStartCB = function ( e ) {
+					var t = e.originalEvent.targetTouches[0];
+					return self._handleDragStart(e, t.pageX, t.pageY );
+				};
+
+				this._dragMoveEvt = "touchmove";
+				this._dragMoveCB = function ( e ) {
+					var t = e.originalEvent.targetTouches[0];
+					return self._handleDragMove(e, t.pageX, t.pageY );
+				};
+
+				this._dragStopEvt = "touchend";
+				this._dragStopCB = function ( e ) {
+					return self._handleDragStop( e );
+				};
+			}
+			this._$view.bind( this._dragStartEvt, this._dragStartCB );
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.mobile.circularview.prototype.options.initSelector, e.target ).circularview();
+	} );
+
+}( jQuery, window, document ) ); // End Component
+/* TBD */
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// It displays a grid two rows by five columns of colors.
+//
+// The colors are automatically computed based on the hue
+// of the color set by the color attribute (see below).
+//
+// One of the displayed colors is the color attribute itself
+// and the others are multiples of 360/10 away from that color;
+// 10 is the total number of colors displayed (2 rows by 5 columns).
+//
+// To apply, add the attribute data-role="colorpalette" to a <div>
+// element inside a page. Alternatively, call colorpalette() on an
+// element.
+//
+// Options:
+//
+//     color: String; initial color can be specified in html
+//            using the data-color="#ff00ff" attribute or
+//            when constructed in javascript, eg :
+//                $("#mycolorpalette").colorpalette({ color: "#ff00ff" });
+//            where the html might be :
+//                <div id="mycolorpalette"></div>
+//            The color can be changed post-construction like this :
+//                $("#mycolorpalette").colorpalette("option", "color", "#ABCDEF");
+//            Default: "#1a8039"
+
+/*
+ * Colorpalette displays a grid two rows by five columns of colors.
+ *
+ * The colors are automatically computed based on the hue
+ * of the color set by the color attribute (see below).
+ *
+ * One of the displayed colors is the color attribute itself
+ * and the others are multiples of 360/10 away from that color;
+ * 10 is the total number of colors displayed (2 rows by 5 columns).
+ *
+ * HTML attributes:
+ *
+ * To apply, add the attribute data-role="colorpalette" to a <div>
+ * element inside a page. Alternatively, call colorpalette() on an
+ * element.
+ *
+ *     data-role: Myst have 'colorpalette'.
+ *     data-color: String; initial color can be specified in html
+ *            using the data-color="#ff00ff" attribute or
+ *            when constructed in javascript, eg :
+ *                $("#mycolorpalette").colorpalette({ color: "#ff00ff" });
+ *            where the html might be :
+ *                <div id="mycolorpalette"></div>
+ *            The color can be changed post-construction like this :
+ *                $("#mycolorpalette").colorpalette("option", "color", "#ABCDEF");
+ *            Default: "#1a8039"
+ *
+ *APIs:
+ *		$('obj').colorpalette() : Make an object to a colorpalette widget.
+ *
+ *Events:
+ *		No event.
+ *
+ *Examples:
+ *		<div data-role="colorpalette" data-color: "#ffffff"></div>
+ *
+ *		<div id="toBeColorpalette"></div>
+ *		<script>
+ *			$("#toBeColorpalette").colorpalette({ color: "#ffffff" });
+ *		</script>
+ *
+ */
+
+( function ( $, undefined ) {
+
+	$.widget( "tizen.colorpalette", $.tizen.colorwidget, {
+		options: {
+			showPreview: false,
+			initSelector: ":jqmData(role='colorpalette')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='colorpalette' class='ui-colorpalette jquery-mobile-ui-widget' data-n-choices='10'>" +
+  "    <div class='colorpalette-preview-container' id='colorpalette-preview-container'>" +
+  "        <div id='colorpalette-preview' class='colorpalette-preview ui-corner-all'></div>" +
+  "    </div>" +
+  "    <div class='colorpalette-table'>" +
+  "        <div class='colorpalette-normal-row'>" +
+  "            <div class='colorpalette-choice-container-left'>" +
+  "                <div data-colorpalette-choice='0' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='1' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='2' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='3' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='4' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "        </div>" +
+  "        <div class='colorpalette-bottom-row'>" +
+  "            <div class='colorpalette-choice-container-left'>" +
+  "                <div data-colorpalette-choice='5' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='6' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='7' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='8' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "            <div class='colorpalette-choice-container-rest'>" +
+  "                <div data-colorpalette-choice='9' class='colorpalette-choice ui-corner-all'></div>" +
+  "            </div>" +
+  "        </div>" +
+  "    </div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				clrpalette: "#colorpalette",
+				preview: "#colorpalette-preview",
+				previewContainer: "#colorpalette-preview-container"
+			}
+		},
+
+		_create: function () {
+			var self = this;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.clrpalette );
+
+			this._ui.clrpalette.find( "[data-colorpalette-choice]" ).bind( "vclick", function ( e ) {
+				var clr = $.tizen.colorwidget.prototype._getElementColor.call(this, $(e.target)),
+					Nix,
+					nChoices = self._ui.clrpalette.attr( "data-" + ( $.mobile.ns || "" ) + "n-choices" ),
+					choiceId,
+					rgbMatches;
+
+				rgbMatches = clr.match(/rgb\(([0-9]*), *([0-9]*), *([0-9]*)\)/);
+
+				if ( rgbMatches && rgbMatches.length > 3 ) {
+					clr = $.tizen.colorwidget.clrlib.RGBToHTML( [
+						parseInt(rgbMatches[1], 10) / 255,
+						parseInt(rgbMatches[2], 10) / 255,
+						parseInt(rgbMatches[3], 10) / 255] );
+				}
+
+				for ( Nix = 0 ; Nix < nChoices ; Nix++ ) {
+					self._ui.clrpalette.find( "[data-colorpalette-choice=" + Nix + "]" ).removeClass( "colorpalette-choice-active" );
+				}
+
+				$(e.target).addClass( "colorpalette-choice-active" );
+				$.tizen.colorwidget.prototype._setColor.call( self, clr );
+				$.tizen.colorwidget.prototype._setElementColor.call( self, self._ui.preview, $.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( clr ) ), "background" );
+			} );
+		},
+
+		_setShowPreview: function ( show ) {
+			if ( show ) {
+				this._ui.previewContainer.removeAttr( "style" );
+			} else {
+				this._ui.previewContainer.css( "display", "none" );
+			}
+
+			this.element.attr( "data-" + ( $.mobile.ns || "" ) + "show-preview", show );
+			this.options.showPreview = show;
+		},
+
+		widget: function ( value ) {
+			return this._ui.clrpalette;
+		},
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.clrpalette[value ? "addClass" : "removeClass"]( "ui-disabled" );
+			$.tizen.colorwidget.prototype._displayDisabledState.call( this, this._ui.clrpalette );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				clr = this.options.color;
+
+				var Nix,
+					activeIdx = -1,
+					nChoices = this._ui.clrpalette.attr( "data-" + ( $.mobile.ns || "" ) + "n-choices" ),
+					hsl = $.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( clr ) ),
+					origHue = hsl[0],
+					offset = hsl[0] / 36,
+					theFloor = Math.floor( offset ),
+					newClr,
+					currentlyActive;
+
+				$.tizen.colorwidget.prototype._setElementColor.call( this, this._ui.preview,
+						$.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( clr ) ), "background" );
+
+				offset = ( offset - theFloor < 0.5 )
+					? ( offset - theFloor )
+					: ( offset - ( theFloor + 1 ) );
+
+				offset *= 36;
+
+				for ( Nix = 0 ; Nix < nChoices ; Nix++ ) {
+					hsl[0] = Nix * 36 + offset;
+					hsl[0] = ( ( hsl[0] < 0) ? ( hsl[0] + 360 ) : ( ( hsl[0] > 360 ) ? ( hsl[0] - 360 ) : hsl[0] ) );
+
+					if ( hsl[0] === origHue ) {
+						activeIdx = Nix;
+					}
+
+					newClr = $.tizen.colorwidget.clrlib.RGBToHTML( $.tizen.colorwidget.clrlib.HSLToRGB( hsl ) );
+
+					$.tizen.colorwidget.prototype._setElementColor.call( this, this._ui.clrpalette.find( "[data-colorpalette-choice=" + Nix + "]" ),
+							$.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( newClr ) ), "background" );
+				}
+
+				if (activeIdx != -1) {
+					currentlyActive = parseInt( this._ui.clrpalette.find( ".colorpalette-choice-active" ).attr( "data-" + ($.mobile.ns || "" ) + "colorpalette-choice" ), 10 );
+					if ( currentlyActive != activeIdx ) {
+						this._ui.clrpalette.find( "[data-colorpalette-choice=" + currentlyActive + "]" ).removeClass( "colorpalette-choice-active" );
+						this._ui.clrpalette.find( "[data-colorpalette-choice=" + activeIdx + "]" ).addClass( "colorpalette-choice-active" );
+					}
+				}
+			}
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.colorpalette.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.colorpalette();
+	});
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays a 2D hue/saturation spectrum and a lightness slider.
+//
+// To apply, add the attribute data-role="colorpicker" to a <div>
+// element inside a page. Alternatively, call colorpicker() 
+// on an element (see below).
+//
+//Options:
+//	color: String; can be specified in html using the
+//		data-color="#ff00ff" attribute or when constructed
+//			$("#mycolorpicker").colorpicker({ color: "#ff00ff" });
+//		where the html might be :
+//			<div id="mycolorpicker"/>
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.colorpicker", $.tizen.colorwidget, {
+		options: {
+			initSelector: ":jqmData(role='colorpicker')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='colorpicker' class='ui-colorpicker'>" +
+  "    <div class='colorpicker-hs-container'>" +
+  "        <div id='colorpicker-hs-hue-gradient' class='colorpicker-hs-mask'></div>" +
+  "        <div id='colorpicker-hs-sat-gradient' class='colorpicker-hs-mask sat-gradient'></div>" +
+  "        <div id='colorpicker-hs-val-mask' class='colorpicker-hs-mask' data-event-source='hs'></div>" +
+  "        <div id='colorpicker-hs-selector' class='colorpicker-hs-selector ui-corner-all'></div>" +
+  "    </div>" +
+  "    <div class='colorpicker-l-container'>" +
+  "        <div id='colorpicker-l-gradient' class='colorpicker-l-mask l-gradient' data-event-source='l'></div>" +
+  "        <div id='colorpicker-l-selector' class='colorpicker-l-selector ui-corner-all'></div>" +
+  "    </div>" +
+  "    <div style='clear: both;'></div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				clrpicker: "#colorpicker",
+				hs: {
+					hueGradient: "#colorpicker-hs-hue-gradient",
+					gradient:    "#colorpicker-hs-sat-gradient",
+					eventSource: "[data-event-source='hs']",
+					valMask:     "#colorpicker-hs-val-mask",
+					selector:    "#colorpicker-hs-selector"
+				},
+				l: {
+					gradient:    "#colorpicker-l-gradient",
+					eventSource: "[data-event-source='l']",
+					selector:    "#colorpicker-l-selector"
+				}
+			}
+		},
+
+		_create: function () {
+			var self = this;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.clrpicker );
+
+			this._ui.hs.hueGradient.huegradient();
+
+			$.extend( self, {
+				dragging: false,
+				draggingHS: false,
+				selectorDraggingOffset: {
+					x : -1,
+					y : -1
+				},
+				dragging_hsl: undefined
+			} );
+
+			$( document )
+				.bind( "vmousemove", function ( event ) {
+					if ( self.dragging ) {
+						event.stopPropagation();
+						event.preventDefault();
+					}
+				} )
+				.bind( "vmouseup", function ( event ) {
+					if ( self.dragging ) {
+						self.dragging = false;
+					}
+				} );
+
+			this._bindElements( "hs" );
+			this._bindElements( "l" );
+		},
+
+		_bindElements: function ( which ) {
+			var self = this,
+				stopDragging = function ( event ) {
+					self.dragging = false;
+					event.stopPropagation();
+					event.preventDefault();
+				};
+
+			this._ui[which].eventSource
+				.bind( "vmousedown mousedown", function ( event ) { self._handleMouseDown( event, which, false ); } )
+				.bind( "vmousemove"          , function ( event ) { self._handleMouseMove( event, which, false ); } )
+				.bind( "vmouseup"            , stopDragging );
+
+			this._ui[which].selector
+				.bind( "vmousedown mousedown", function ( event ) { self._handleMouseDown( event, which, true); } )
+				.bind( "touchmove vmousemove", function ( event ) { self._handleMouseMove( event, which, true); } )
+				.bind( "vmouseup"            , stopDragging );
+		},
+
+		_handleMouseDown: function ( event, containerStr, isSelector ) {
+			var coords = $.mobile.tizen.targetRelativeCoordsFromEvent( event ),
+				widgetStr = isSelector ? "selector" : "eventSource";
+			if ( ( coords.x >= 0 && coords.x <= this._ui[containerStr][widgetStr].width() &&
+					coords.y >= 0 && coords.y <= this._ui[containerStr][widgetStr].height() ) || isSelector ) {
+				this.dragging = true;
+				this.draggingHS = ( "hs" === containerStr );
+
+				if ( isSelector ) {
+					this.selectorDraggingOffset.x = coords.x;
+					this.selectorDraggingOffset.y = coords.y;
+				}
+
+				this._handleMouseMove( event, containerStr, isSelector, coords );
+			}
+		},
+
+		_handleMouseMove: function ( event, containerStr, isSelector, coords ) {
+			var potential_h,
+				potential_s,
+				potential_l;
+
+			if ( this.dragging &&
+					!( ( this.draggingHS && containerStr === "l" ) ||
+						( !this.draggingHS && containerStr === "hs" ) ) ) {
+				coords = ( coords || $.mobile.tizen.targetRelativeCoordsFromEvent( event ) );
+
+				if ( this.draggingHS ) {
+					potential_h = isSelector
+						? this.dragging_hsl[0] / 360 + ( coords.x - this.selectorDraggingOffset.x ) / this._ui[containerStr].eventSource.width()
+						: coords.x / this._ui[containerStr].eventSource.width();
+					potential_s = isSelector
+						? this.dragging_hsl[1] + ( coords.y - this.selectorDraggingOffset.y ) / this._ui[containerStr].eventSource.height()
+						: coords.y / this._ui[containerStr].eventSource.height();
+
+					this.dragging_hsl[0] = Math.min( 1.0, Math.max( 0.0, potential_h ) ) * 360;
+					this.dragging_hsl[1] = Math.min( 1.0, Math.max( 0.0, potential_s ) );
+				} else {
+					potential_l = isSelector
+						? this.dragging_hsl[2] + ( coords.y - this.selectorDraggingOffset.y ) / this._ui[containerStr].eventSource.height()
+						: coords.y / this._ui[containerStr].eventSource.height();
+
+					this.dragging_hsl[2] = Math.min( 1.0, Math.max( 0.0, potential_l ) );
+				}
+
+				if ( !isSelector ) {
+					this.selectorDraggingOffset.x = Math.ceil( this._ui[containerStr].selector.outerWidth()  / 2.0 );
+					this.selectorDraggingOffset.y = Math.ceil( this._ui[containerStr].selector.outerHeight() / 2.0 );
+				}
+
+				this._updateSelectors( this.dragging_hsl );
+				event.stopPropagation();
+				event.preventDefault();
+			}
+		},
+
+		_updateSelectors: function ( hsl ) {
+			var clr = $.tizen.colorwidget.prototype._setElementColor.call( this, this._ui.hs.selector, [hsl[0], 1.0 - hsl[1], hsl[2]], "background" ).clr,
+				gray = $.tizen.colorwidget.clrlib.RGBToHTML( [hsl[2], hsl[2], hsl[2]] );
+
+			this._ui.hs.valMask.css((hsl[2] < 0.5)
+				? { background : "#000000" , opacity : ( 1.0 - hsl[2] * 2.0 )   }
+				: { background : "#ffffff" , opacity : ( ( hsl[2] - 0.5 ) * 2.0 ) } );
+			this._ui.hs.selector.css( {
+				left : ( hsl[0] / 360 * this._ui.hs.eventSource.width() ),
+				top : ( hsl[1] * this._ui.hs.eventSource.height() )
+			});
+			this._ui.l.selector.css({
+				top : ( hsl[2] * this._ui.l.eventSource.height() ),
+				background : gray
+			} );
+			$.tizen.colorwidget.prototype._setColor.call( this, clr );
+		},
+
+		widget: function () { return this._ui.clrpicker; },
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.hs.hueGradient.huegradient( "option", "disabled", value );
+			this._ui.clrpicker[value ? "addClass" : "removeClass"]( "ui-disabled" );
+			$.tizen.colorwidget.prototype._displayDisabledState.call( this, this._ui.clrpicker );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				this.dragging_hsl = $.tizen.colorwidget.clrlib.RGBToHSL( $.tizen.colorwidget.clrlib.HTMLToRGB( this.options.color ) );
+				this.dragging_hsl[1] = 1.0 - this.dragging_hsl[1];
+				this._updateSelectors( this.dragging_hsl );
+			}
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.colorpicker.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.colorpicker();
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence ( as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php )
+ *
+ * ***************************************************************************
+ * Copyright ( c ) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright ( c ) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files ( the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays a button which, when pressed, opens a popupwindow
+// containing hsvpicker.
+//
+// To apply, add the attribute data-role="colorpickerbutton" to a <div>
+// element inside a page. Alternatively, call colorpickerbutton() on an
+// element.
+//
+// Options:
+//
+//   color: String; color displayed on the button and the base color
+//      of the hsvpicker ( see hsvpicker ).
+//      initial color can be specified in html using the
+//      data-color="#ff00ff" attribute or when constructed in
+//      javascript, eg :
+//        $( "#mycolorpickerbutton" ).colorpickerbutton( { color: "#ff00ff" } );
+//      where the html might be :
+//        <div id="colorpickerbutton"></div>
+//      The color can be changed post-construction like this :
+//        $( "#mycolorpickerbutton" ).colorpickerbutton( "option", "color", "#ABCDEF" );
+//      Default: "#1a8039"
+//
+//   buttonMarkup: String; markup to use for the close button on the popupwindow, eg :
+//          $( "#mycolorpickerbutton" ).colorpickerbutton( "option","buttonMarkup",
+//           "<a href='#' data-role='button'>ignored</a>" );
+//
+//   closeText: String; the text to display on the close button on the popupwindow.
+//        The text set in the buttonMarkup will be ignored and this used instead.
+//
+// Events:
+//
+//   colorchanged: emitted when the color has been changed and the popupwindow is closed.
+
+( function ( $, undefined ) {
+
+	$.widget( "tizen.colorpickerbutton", $.tizen.colorwidget, {
+		options: {
+			buttonMarkup: {
+				theme: null,
+				inline: true,
+				corners: true,
+				shadow: true
+			},
+			hideInput: true,
+			closeText: "Close",
+			initSelector: "input[type='color'], :jqmData(type='color'), :jqmData(role='colorpickerbutton')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='colorpickerbutton'>" +
+  "    <a id='colorpickerbutton-button' href='#' data-role='button' aria-haspopup='true'>" +
+  "        <span id='colorpickerbutton-button-contents'>&#x2587;&#x2587;&#x2587;</span>" +
+  "    </a>" +
+  "    <div id='colorpickerbutton-popup-container' class='colorpickerbutton-popup-container-style'>" +
+  "        <div id='colorpickerbutton-popup-hsvpicker' data-role='hsvpicker'></div>" +
+  "        <a id='colorpickerbutton-popup-close-button' href='#' data-role='button'>" +
+  "            <span id='colorpickerbutton-popup-close-button-text'></span>" +
+  "        </a>" +
+  "    </div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				button: "#colorpickerbutton-button",
+				buttonContents: "#colorpickerbutton-button-contents",
+				popup: "#colorpickerbutton-popup-container",
+				hsvpicker: "#colorpickerbutton-popup-hsvpicker",
+				closeButton: "#colorpickerbutton-popup-close-button",
+				closeButtonText: "#colorpickerbutton-popup-close-button-text"
+			}
+		},
+
+		_create: function () {
+			var self = this;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.button );
+
+			/* Tear apart the proto */
+			this._ui.popup.insertBefore( this.element ).popupwindow();
+			this._ui.hsvpicker.hsvpicker();
+
+			$.tizen.popupwindow.bindPopupToButton( this._ui.button, this._ui.popup );
+
+			this._ui.closeButton.bind( "vclick", function ( event ) {
+				self._setColor( self._ui.hsvpicker.hsvpicker( "option", "color" ) );
+				self.close();
+			} );
+
+			this.element.bind( "change keyup blur", function () {
+				self._setColor( self.element.val() );
+			} );
+		},
+
+		_setHideInput: function ( value ) {
+			this.element[value ? "addClass" : "removeClass"]( "ui-colorpickerbutton-input-hidden" );
+			this.element[value ? "removeClass" : "addClass"]( "ui-colorpickerbutton-input" );
+			this.element.attr( "data-" + ( $.mobile.ns || "" ) + "hide-input", value );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				var clrlib = $.tizen.colorwidget.clrlib;
+
+				this._ui.hsvpicker.hsvpicker( "option", "color", this.options.color );
+				$.tizen.colorwidget.prototype._setElementColor.call( this, this._ui.buttonContents,
+						clrlib.RGBToHSL( clrlib.HTMLToRGB( this.options.color ) ), "color" );
+			}
+		},
+
+		_setButtonMarkup: function ( value ) {
+			this._ui.button.buttonMarkup( value );
+			this.options.buttonMarkup = value;
+			value.inline = false;
+			this._ui.closeButton.buttonMarkup( value );
+		},
+
+		_setCloseText: function ( value ) {
+			this._ui.closeButtonText.text( value );
+			this.options.closeText = value;
+			this.element.attr( "data-" + ( $.mobile.ns || "" ) + "close-text", value );
+		},
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.popup.popupwindow( "option", "disabled", value );
+			this._ui.button[value ? "addClass" : "removeClass"]( "ui-disabled" );
+			$.tizen.colorwidget.prototype._displayDisabledState.call( this, this._ui.button );
+		},
+
+		open: function () {
+			this._ui.popup.popupwindow( "open",
+					this._ui.button.offset().left + this._ui.button.outerWidth() / 2,
+					this._ui.button.offset().top + this._ui.button.outerHeight() / 2 );
+		},
+
+		_focusButton : function () {
+			var self = this;
+			setTimeout( function () {
+				self._ui.button.focus();
+			}, 40 );
+		},
+
+		close: function () {
+			this._focusButton();
+			this._ui.popup.popupwindow( "close" );
+		}
+	} );
+
+//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.colorpickerbutton.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.colorpickerbutton();
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays the color in text of the form '#RRGGBB' where
+// RR, GG, and BB are in hexadecimal.
+//
+// Apply a colortitle by adding the attribute data-role="colortitle"
+// to a <div> element inside a page. Alternatively, call colortitle() 
+// on an element (see below).
+//
+// Options:
+//
+//     color: String; the initial color can be specified in html using
+//            the data-color="#ff00ff" attribute or when constructed
+//            in javascipt eg
+//                $("#mycolortitle").colortitle({ color: "#ff00ff" });
+//            where the html might be :
+//                <div id="mycolortitle"></div>
+//            The color can be changed post-construction :
+//                $("#mycolortitle").colortitle("option", "color", "#ABCDEF");
+//            Default: "#1a8039".
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.colortitle", $.tizen.colorwidget, {
+		options: {
+			initSelector: ":jqmData(role='colortitle')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='colortitle' class='ui-colortitle jquery-mobile-ui-widget'>" +
+  "    <h1 id='colortitle-string'></h1>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				clrtitle: "#colortitle",
+				header:   "#colortitle-string"
+			}
+		},
+
+		_create: function () {
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.clrtitle );
+
+		},
+
+		widget: function () { return this._ui.clrtitle; },
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.clrtitle[value ? "addClass" : "removeClass"]( "ui-disabled" );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				this._ui.header.text( this.options.color );
+				$( this._ui.header ).parent().css( "color", this.options.color );
+			}
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.colortitle.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.colortitle();
+	} );
+
+}( jQuery ) );
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Ensure that the given namespace is defined. If not, define it to be an empty object.
+// This is kinda like the mkdir -p command.
+
+function ensureNS(ns) {
+    var nsAr = ns.split("."),
+    nsSoFar = "";
+
+    for (var Nix in nsAr) {
+        nsSoFar = nsSoFar + (Nix > 0 ? "." : "") + nsAr[Nix];
+        eval (nsSoFar + " = " + nsSoFar + " || {};");
+    }
+}
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright © 2008 George McGinley Smith
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this list of 
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list 
+ * of conditions and the following disclaimer in the documentation and/or other materials 
+ * provided with the distribution.
+ * 
+ * Neither the name of the author nor the names of contributors may be used to endorse 
+ * or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+jQuery.easing['jswing'] = jQuery.easing['swing'];
+
+jQuery.extend( jQuery.easing,
+{
+	def: 'easeOutQuad',
+	swing: function (x, t, b, c, d) {
+		//alert(jQuery.easing.default);
+		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
+	},
+	easeInQuad: function (x, t, b, c, d) {
+		return c*(t/=d)*t + b;
+	},
+	easeOutQuad: function (x, t, b, c, d) {
+		return -c *(t/=d)*(t-2) + b;
+	},
+	easeInOutQuad: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t + b;
+		return -c/2 * ((--t)*(t-2) - 1) + b;
+	},
+	easeInCubic: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t + b;
+	},
+	easeOutCubic: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t + 1) + b;
+	},
+	easeInOutCubic: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t + b;
+		return c/2*((t-=2)*t*t + 2) + b;
+	},
+	easeInQuart: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t + b;
+	},
+	easeOutQuart: function (x, t, b, c, d) {
+		return -c * ((t=t/d-1)*t*t*t - 1) + b;
+	},
+	easeInOutQuart: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+		return -c/2 * ((t-=2)*t*t*t - 2) + b;
+	},
+	easeInQuint: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t*t + b;
+	},
+	easeOutQuint: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t*t*t + 1) + b;
+	},
+	easeInOutQuint: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+		return c/2*((t-=2)*t*t*t*t + 2) + b;
+	},
+	easeInSine: function (x, t, b, c, d) {
+		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+	},
+	easeOutSine: function (x, t, b, c, d) {
+		return c * Math.sin(t/d * (Math.PI/2)) + b;
+	},
+	easeInOutSine: function (x, t, b, c, d) {
+		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+	},
+	easeInExpo: function (x, t, b, c, d) {
+		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+	},
+	easeOutExpo: function (x, t, b, c, d) {
+		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+	},
+	easeInOutExpo: function (x, t, b, c, d) {
+		if (t==0) return b;
+		if (t==d) return b+c;
+		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+	},
+	easeInCirc: function (x, t, b, c, d) {
+		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+	},
+	easeOutCirc: function (x, t, b, c, d) {
+		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+	},
+	easeInOutCirc: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+	},
+	easeInElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+	},
+	easeOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+	},
+	easeInOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+	},
+	easeInBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*(t/=d)*t*((s+1)*t - s) + b;
+	},
+	easeOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+	},
+	easeInOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158; 
+		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+	},
+	easeInBounce: function (x, t, b, c, d) {
+		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+	},
+	easeOutBounce: function (x, t, b, c, d) {
+		if ((t/=d) < (1/2.75)) {
+			return c*(7.5625*t*t) + b;
+		} else if (t < (2/2.75)) {
+			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+		} else if (t < (2.5/2.75)) {
+			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+		} else {
+			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+		}
+	},
+	easeInOutBounce: function (x, t, b, c, d) {
+		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+	}
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ * 
+ * Open source under the BSD License. 
+ * 
+ * Copyright © 2001 Robert Penner
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification, 
+ * are permitted provided that the following conditions are met:
+ * 
+ * Redistributions of source code must retain the above copyright notice, this list of 
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list 
+ * of conditions and the following disclaimer in the documentation and/or other materials 
+ * provided with the distribution.
+ * 
+ * Neither the name of the author nor the names of contributors may be used to endorse 
+ * or promote products derived from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ *  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
+ * OF THE POSSIBILITY OF SUCH DAMAGE. 
+ *
+ */
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Add markup for labels
+
+(function($, undefined) {
+
+$(document).bind("pagecreate create", function(e) {
+    $(":jqmData(role='label')", e.target).not(":jqmData(role='none'), :jqmData(role='nojs')").each(function() {
+        $(this).addClass("jquery-mobile-ui-label")
+               .html($("<span>", {"class": "jquery-mobile-ui-label-text"}).text($(this).text()));
+    });
+});
+
+})(jQuery);
+/*
+ * Size pages to the window
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Size pages to the window
+
+(function($, undefined) {
+
+var _fit_page_to_window_selector = ":jqmData(role='page'):jqmData(fit-page-to-window='true'):visible";
+
+$(document).bind("pageshow", function(e) {
+    if ($(e.target).is(_fit_page_to_window_selector))
+        $.mobile.tizen.fillPageWithContentArea($(e.target));
+});
+
+$(window).resize(function() {
+    if ($(_fit_page_to_window_selector)[0] !== undefined)
+        $.mobile.tizen.fillPageWithContentArea($(_fit_page_to_window_selector));
+});
+
+})(jQuery);
+ensureNS("jQuery.mobile.tizen.clrlib");
+
+jQuery.extend( jQuery.mobile.tizen.clrlib, 
+{
+    nearestInt: function(val) { 
+        var theFloor = Math.floor(val);
+
+        return (((val - theFloor) > 0.5) ? (theFloor + 1) : theFloor);
+    },
+
+    /*
+     * Converts html color string to rgb array.
+     *
+     * Input: string clr_str, where
+     * clr_str is of the form "#aabbcc"
+     *
+     * Returns: [ r, g, b ], where
+     * r is in [0, 1]
+     * g is in [0, 1]
+     * b is in [0, 1]
+     */
+    HTMLToRGB: function(clr_str) {
+        clr_str = (('#' == clr_str.charAt(0)) ? clr_str.substring(1) : clr_str);
+
+        return ([
+            clr_str.substring(0, 2),
+            clr_str.substring(2, 4),
+            clr_str.substring(4, 6)
+            ].map(function(val) {
+                return parseInt(val, 16) / 255.0;
+            }));
+    },
+
+    /*
+     * Converts rgb array to html color string.
+     *
+     * Input: [ r, g, b ], where
+     * r is in [0, 1]
+     * g is in [0, 1]
+     * b is in [0, 1]
+     *
+     * Returns: string of the form "#aabbcc"
+     */
+    RGBToHTML: function(rgb) {
+        return ("#" + 
+            rgb.map(function(val) {
+                      var ret = val * 255,
+                          theFloor = Math.floor(ret);
+
+                      ret = ((ret - theFloor > 0.5) ? (theFloor + 1) : theFloor);
+                      ret = (((ret < 16) ? "0" : "") + (ret & 0xff).toString(16));
+                      return ret;
+                  })
+               .join(""));
+    },
+
+    /*
+     * Converts hsl to rgb.
+     *
+     * From http://130.113.54.154/~monger/hsl-rgb.html
+     *
+     * Input: [ h, s, l ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * l is in [0,   1]
+     *
+     * Returns: [ r, g, b ], where
+     * r is in [0, 1]
+     * g is in [0, 1]
+     * b is in [0, 1]
+     */
+    HSLToRGB: function(hsl) {
+        var h = hsl[0] / 360.0, s = hsl[1], l = hsl[2];
+
+        if (0 === s)
+            return [ l, l, l ];
+
+        var temp2 = ((l < 0.5)
+                ? l * (1.0 + s)
+                : l + s - l * s),
+            temp1 = 2.0 * l - temp2,
+            temp3 = {
+                r: h + 1.0 / 3.0,
+                g: h,
+                b: h - 1.0 / 3.0
+            };
+
+        temp3.r = ((temp3.r < 0) ? (temp3.r + 1.0) : ((temp3.r > 1) ? (temp3.r - 1.0) : temp3.r));
+        temp3.g = ((temp3.g < 0) ? (temp3.g + 1.0) : ((temp3.g > 1) ? (temp3.g - 1.0) : temp3.g));
+        temp3.b = ((temp3.b < 0) ? (temp3.b + 1.0) : ((temp3.b > 1) ? (temp3.b - 1.0) : temp3.b));
+
+        ret = [
+            (((6.0 * temp3.r) < 1) ? (temp1 + (temp2 - temp1) * 6.0 * temp3.r) :
+            (((2.0 * temp3.r) < 1) ? temp2 :
+            (((3.0 * temp3.r) < 2) ? (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp3.r) * 6.0) :
+             temp1))),
+            (((6.0 * temp3.g) < 1) ? (temp1 + (temp2 - temp1) * 6.0 * temp3.g) :
+            (((2.0 * temp3.g) < 1) ? temp2 :
+            (((3.0 * temp3.g) < 2) ? (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp3.g) * 6.0) :
+             temp1))),
+            (((6.0 * temp3.b) < 1) ? (temp1 + (temp2 - temp1) * 6.0 * temp3.b) :
+            (((2.0 * temp3.b) < 1) ? temp2 :
+            (((3.0 * temp3.b) < 2) ? (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - temp3.b) * 6.0) :
+             temp1)))]; 
+
+        return ret;
+    },
+
+    /*
+     * Converts hsv to rgb.
+     *
+     * Input: [ h, s, v ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * v is in [0,   1]
+     *
+     * Returns: [ r, g, b ], where
+     * r is in [0, 1]
+     * g is in [0, 1]
+     * b is in [0, 1]
+     */
+    HSVToRGB: function(hsv) {
+        return $.mobile.tizen.clrlib.HSLToRGB($.mobile.tizen.clrlib.HSVToHSL(hsv));
+    },
+
+    /*
+     * Converts rgb to hsv.
+     *
+     * from http://coecsl.ece.illinois.edu/ge423/spring05/group8/FinalProject/HSV_writeup.pdf
+     *
+     * Input: [ r, g, b ], where
+     * r is in [0,   1]
+     * g is in [0,   1]
+     * b is in [0,   1]
+     *
+     * Returns: [ h, s, v ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * v is in [0,   1]
+     */
+    RGBToHSV: function(rgb) {
+        var min, max, delta, h, s, v, r = rgb[0], g = rgb[1], b = rgb[2];
+
+        min = Math.min(r, Math.min(g, b));
+        max = Math.max(r, Math.max(g, b));
+        delta = max - min;
+
+        h = 0;
+        s = 0;
+        v = max;
+
+        if (delta > 0.00001) {
+            s = delta / max;
+
+            if (r === max)
+                h = (g - b) / delta ;
+            else
+            if (g === max)
+                h = 2 + (b - r) / delta ;
+            else
+                h = 4 + (r - g) / delta ;
+
+            h *= 60 ;
+
+            if (h < 0)
+                h += 360 ;
+        }
+
+        return [h, s, v];
+    },
+
+    /*
+     * Converts hsv to hsl.
+     *
+     * Input: [ h, s, v ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * v is in [0,   1]
+     *
+     * Returns: [ h, s, l ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * l is in [0,   1]
+     */
+    HSVToHSL: function(hsv) {
+        var max = hsv[2],
+            delta = hsv[1] * max,
+            min = max - delta,
+            sum = max + min,
+            half_sum = sum / 2,
+            s_divisor = ((half_sum < 0.5) ? sum : (2 - max - min));
+
+        return [ hsv[0], ((0 == s_divisor) ? 0 : (delta / s_divisor)), half_sum ];
+    },
+
+    /*
+     * Converts rgb to hsl
+     *
+     * Input: [ r, g, b ], where
+     * r is in [0,   1]
+     * g is in [0,   1]
+     * b is in [0,   1]
+     *
+     * Returns: [ h, s, l ], where
+     * h is in [0, 360]
+     * s is in [0,   1]
+     * l is in [0,   1]
+     */
+    RGBToHSL: function(rgb) {
+        return $.mobile.tizen.clrlib.HSVToHSL($.mobile.tizen.clrlib.RGBToHSV(rgb));
+    }
+});
+/*!
+ * jQuery Mobile Widget @VERSION
+ *
+ * TODO: remove unnecessary codes....
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Kalyan Kondapally <kalyan.kondapally@intel.com>
+ */
+
+ensureNS("jQuery.mobile.tizen");
+
+(function () {
+jQuery.extend(jQuery.mobile.tizen, {
+    Point: function (x, y) {
+        var X = isNaN(x) ? 0 : x;
+        var Y = isNaN(y) ? 0 : y;
+
+        this.add = function (Point) {
+            this.setX(X + Point.x());
+            this.setY(Y + Point.y());
+            return this;
+        }
+
+        this.subtract = function (Point) {
+            this.setX(X - Point.x());
+            this.setY(Y - Point.y());
+            return this;
+        }
+
+        this.multiply = function (Point) {
+            this.setX(Math.round(X * Point.x()));
+            this.setY(Math.round(Y * Point.y()));
+            return this;
+        }
+
+        this.divide = function (Point) {
+            this.setX(Math.round(X / Point.x()));
+            this.setY(Math.round(Y / Point.y()));
+            return this;
+        }
+
+        this.isNull = function () {
+            return (X === 0 && Y === 0);
+        }
+
+        this.x = function () {
+            return X;
+        }
+
+        this.setX = function (val) {
+            isNaN(val) ? X = 0 : X = val;
+        }
+
+        this.y = function () {
+            return Y;
+        }
+
+        this.setY = function (val) {
+            isNaN(val) ? Y = 0 : Y = val;
+        }
+
+        this.setNewPoint = function (point) {
+            this.setX(point.x());
+            this.setY(point.y());
+        }
+
+        this.isEqualTo = function (point) {
+            return (X === point.x() && Y === point.y());
+        }
+    },
+
+    Rect: function (left,top,width,height) {
+        var Left = left;
+        var Top = top;
+        var Right = Left+width;
+        var Bottom = Top+height;
+
+        this.setRect = function(varL,varR,varT,varB) {
+            this.setLeft(varL);
+            this.setRight(varR);
+            this.setTop(varT);
+            this.setBottom(varB);
+        }
+
+        this.right = function () {
+            return Right;
+        }
+
+        this.setRight = function (val) {
+            Right = val;
+        }
+
+        this.top = function () {
+            return Top;
+        }
+
+        this.setTop = function (val) {
+            Top = val;
+        }
+
+        this.bottom = function () {
+            return Bottom;
+        }
+
+        this.setBottom = function (val) {
+            Bottom = val;
+        }
+
+        this.left = function () {
+            return Left;
+        }
+
+        this.setLeft = function (val) {
+            Left = val;
+        }
+
+        this.moveTop = function(valY) {
+            var h = this.height();
+            Top = valY;
+            Bottom = Top + h;
+        }
+
+        this.isNull = function () {
+            return Right === Left && Bottom === Top;
+        }
+
+        this.isValid = function () {
+            return Left <= Right && Top <= Bottom;
+        }
+
+        this.isEmpty = function () {
+            return Left > Right || Top > Bottom;
+        }
+
+        this.contains = function (valX,valY) {
+            if (this.containsX(valX) && this.containsY(valY))
+                return true;
+            return false;
+        }
+
+        this.width = function () {
+            return Right - Left;
+        }
+
+        this.height = function () {
+            return Bottom - Top;
+        }
+
+        this.containsX = function(val) {
+            var l = Left,
+            r = Right;
+            if (Right<Left) {
+                l = Right;
+                r = Left;
+            }
+            if (l > val || r < val)
+                return false;
+        return true;
+        }
+
+        this.containsY = function(val) {
+            var t = Top,
+            b = Bottom;
+            if (Bottom<Top) {
+                t = Bottom;
+                b = Top;
+            }
+            if (t > val || b < val)
+                return false;
+          return true;
+        }
+    },
+
+    disableSelection: function (element) {
+        return $(element).each(function () {
+            jQuery(element).css('-webkit-user-select', 'none');
+        });
+    },
+
+    enableSelection: function (element, value) {
+        return $(element).each(function () {
+            val = value == "text" ? val = 'text' : val = 'auto';
+            jQuery(element).css('-webkit-user-select', val);
+        });
+    },
+
+    // Set the height of the content area to fill the space between a
+    // page's header and footer
+    fillPageWithContentArea: function (page) {
+        var $page = $(page);
+        var $content = $page.children(".ui-content:first");
+        var hh = $page.children(".ui-header").outerHeight(); hh = hh ? hh : 0;
+        var fh = $page.children(".ui-footer").outerHeight(); fh = fh ? fh : 0;
+        var pt = parseFloat($content.css("padding-top"));
+        var pb = parseFloat($content.css("padding-bottom"));
+        var wh = window.innerHeight;
+        var height = wh - (hh + fh) - (pt + pb);
+        $content.height(height);
+    },
+
+    // Get document-relative mouse coordinates from a given event
+    // From: http://www.quirksmode.org/js/events_properties.html#position
+    documentRelativeCoordsFromEvent: function(ev) {
+        var e = ev ? ev : window.event,
+            client = { x: e.clientX, y: e.clientY },
+            page   = { x: e.pageX,   y: e.pageY   },
+            posx = 0,
+            posy = 0;
+
+        // Grab useful coordinates from touch events
+        if (e.type.match(/^touch/)) {
+            page = {
+                x: e.originalEvent.targetTouches[0].pageX,
+                y: e.originalEvent.targetTouches[0].pageY
+            };
+            client = {
+                x: e.originalEvent.targetTouches[0].clientX,
+                y: e.originalEvent.targetTouches[0].clientY
+            };
+        }
+
+        if (page.x || page.y) {
+            posx = page.x;
+            posy = page.y;
+        }
+        else
+        if (client.x || client.y) {
+            posx = client.x + document.body.scrollLeft + document.documentElement.scrollLeft;
+            posy = client.y + document.body.scrollTop  + document.documentElement.scrollTop;
+        }
+
+        return { x: posx, y: posy };
+    },
+
+	// TODO : offsetX, offsetY. touch events don't have offsetX and offsetY. support for touch devices.
+    // check algorithm...
+    targetRelativeCoordsFromEvent: function(e) {
+        var coords = { x: e.offsetX, y: e.offsetY };
+
+        if (coords.x === undefined || isNaN(coords.x) ||
+            coords.y === undefined || isNaN(coords.y)) {
+            var offset = $(e.target).offset();
+            //coords = documentRelativeCoordsFromEvent(e);	// Old code. Must be checked again.
+            coords = $.mobile.tizen.documentRelativeCoordsFromEvent(e);
+            coords.x -= offset.left;
+            coords.y -= offset.top;
+        }
+
+        return coords;
+    }
+});
+
+})();
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// Wrapper round the jLayout functions to enable it to be used
+// for creating jQuery Mobile layout extensions.
+//
+// See the layouthbox and layoutvbox widgets for usage examples.
+(function ($, undefined) {
+
+$.widget("tizen.jlayoutadaptor", $.mobile.widget, {
+    options: {
+        hgap: null,
+        vgap: null,
+        scrollable: true,
+        showScrollBars: true,
+        direction: null
+    },
+
+    _create: function () {
+        var self = this,
+            options = this.element.data('layout-options'),
+            page = $(this.element).closest(':jqmData(role="page")');
+
+        $.extend(this.options, options);
+
+        if (page && !page.is(':visible')) {
+            this.element.hide();
+
+            page.bind('pageshow', function () {
+                self.refresh();
+            });
+        }
+        else {
+            this.refresh();
+        }
+    },
+
+    refresh: function () {
+        var container;
+        var config = $.extend(this.options, this.fixed);
+
+        if (config.scrollable) {
+            if (!(this.element.children().is('.ui-scrollview-view'))) {
+                // create the scrollview
+                this.element.scrollview({direction: config.direction,
+                                         showScrollBars: config.showScrollBars});
+            }
+            else if (config.showScrollBars) {
+                this.element.find('.ui-scrollbar').show();
+            }
+            else {
+                this.element.find('.ui-scrollbar').hide();
+            }
+
+            container = this.element.find('.ui-scrollview-view');
+        }
+        else {
+            container = this.element;
+        }
+
+        container.layout(config);
+
+        this.element.show();
+
+        if (config.scrollable) {
+            // get the right/bottom edge of the last child after layout
+            var lastItem = container.children().last();
+
+            var edge;
+
+            var scrollview = this.element.find('.ui-scrollview-view');
+
+            if (config.direction === 'x') {
+                edge = lastItem.position().left +
+                       lastItem.outerWidth(true);
+
+                // set the scrollview's view width to the original width
+                scrollview.width(edge);
+
+                // set the parent container's height to the height of
+                // the scrollview
+                this.element.height(scrollview.height());
+            }
+            else if (config.direction === 'y') {
+                edge = lastItem.position().top +
+                       lastItem.outerHeight(true);
+
+                // set the scrollview's view height to the original height
+                scrollview.height(edge);
+
+                // set the parent container's width to the width of the
+                // scrollview
+                this.element.width(scrollview.width());
+            }
+        }
+    }
+});
+
+})(jQuery);
+(function($, undefined) {
+
+ensureNS("jQuery.mobile.tizen");
+
+jQuery.extend( jQuery.mobile.tizen,
+{
+    _widgetPrototypes: {},
+
+    /*
+     * load the prototype for a widget.
+     *
+     * If @widget is a string, the function looks for @widget.prototype.html in the proto-html/ subdirectory of the
+     * framework's current theme and loads the file via AJAX into a string. Note that the file will only be loaded via
+     * AJAX once. If two widget instances based on the same @widget value are to be constructed, the second will be
+     * constructed from the cached copy of the prototype of the first instance.
+     *
+     * If @widget is not a string, it is assumed to be a hash containing at least one key, "proto", the value of which is
+     * the string to be used for the widget prototype. if another key named "key" is also provided, it will serve as the
+     * key under which to cache the prototype, so it need not be rendered again in the future.
+     *
+     * Given the string for the widget prototype, the following patterns occurring in the string are replaced:
+     *
+     *   "${FRAMEWORK_ROOT}" - replaced with the path to the root of the framework
+     *
+     * The function then creates a jQuery $("<div>") object containing the prototype from the string.
+     *
+     * If @ui is not provided, the jQuery object containing the prototype is returned.
+     *
+     * If @ui is provided, it is assumed to be a (possibly multi-level) hash containing CSS selectors. For every level of
+     * the hash and for each string-valued key at that level, the CSS selector specified as the value is sought in the
+     * prototype jQuery object and, if found, the value of the key is replaced with the jQuery object resulting from the
+     * search. Additionally, if the CSS selector is of the form "#widgetid", the "id" attribute will be removed from the
+     * elements contained within the resulting jQuery object. The resulting hash is returned.
+     *
+     * Examples:
+     *
+     * 1.
+     * $.mobile.tizen.loadPrototype("mywidget") => Returns a <div> containing the structure from the file
+     * mywidget.prototype.html located in the current theme folder of the current framework.
+     *
+     * 2. $.mobile.tizen.loadPrototype("mywidget", ui):
+     * where ui is a hash that looks like this:
+     * ui = {
+     *   element1: "<css selector 1>",
+     *   element2: "<css selector 2>",
+     *   group1: {
+     *     group1element1: "<css selector 3>",
+     *     group1element1: "<css selector 4>"
+     *   }
+     *  ...
+     * }
+     *
+     * In this case, after loading the prototype as in Example 1, loadPrototype will traverse @ui and replace the CSS
+     * selector strings with the result of the search for the selector string upon the prototype. If any of the CSS
+     * selectors are of the form "#elementid" then the "id" attribute will be stripped from the elements selected. This
+     * means that they will no longer be accessible via the selector used initially. @ui is then returned thus modified.
+     */
+
+    loadPrototype: function(widget, ui) {
+        var ret = undefined,
+            theScriptTag = $("script[data-framework-version][data-framework-root][data-framework-theme]"),
+            frameworkRootPath = theScriptTag.attr("data-framework-root")    + "/" +
+                                theScriptTag.attr("data-framework-version") + "/";
+
+        function replaceVariables(s) {
+            return s.replace(/\$\{FRAMEWORK_ROOT\}/g, frameworkRootPath);
+        }
+
+        function fillObj(obj, uiProto) {
+            var selector;
+
+            for (var key in obj) {
+                if (typeof obj[key] === "string") {
+                    selector = obj[key];
+                    obj[key] = uiProto.find(obj[key]);
+                    if (selector.substring(0, 1) === "#")
+                        obj[key].removeAttr("id");
+                }
+                else
+                if (typeof obj[key] === "object")
+                    obj[key] = fillObj(obj[key], uiProto);
+            }
+            return obj;
+        }
+
+        /* If @widget is a string ... */
+        if (typeof widget === "string") {
+            /* ... try to use it as a key into the cached prototype hash ... */
+            ret = $.mobile.tizen._widgetPrototypes[widget];
+            if (ret === undefined) {
+                /* ... and if the proto was not found, try to load its definition ... */
+                var protoPath = frameworkRootPath + "proto-html" + "/" +
+                                theScriptTag.attr("data-framework-theme");
+                $.ajax({
+                    url: protoPath + "/" + widget + ".prototype.html",
+                    async: false,
+                    dataType: "html"
+                })
+                 .success(function(data, textStatus, jqXHR) {
+                    /* ... and if loading succeeds, cache it and use a copy of it ... */
+                    $.mobile.tizen._widgetPrototypes[widget] = $("<div>").html(replaceVariables(data));
+                    ret = $.mobile.tizen._widgetPrototypes[widget].clone();
+                });
+            }
+        }
+        /* Otherwise ... */
+        else {
+            /* ... if a key was provided ... */
+            if (widget.key !== undefined)
+                /* ... try to use it as a key into the cached prototype hash ... */
+                ret = $.mobile.tizen._widgetPrototypes[widget.key];
+
+            /* ... and if the proto was not found in the cache ... */
+            if (ret === undefined) {
+                /* ... and a proto definition string was provided ... */
+                if (widget.proto !== undefined) {
+                    /* ... create a new proto from the definition ... */
+                    ret = $("<div>").html(replaceVariables(widget.proto));
+                    /* ... and if a key was provided ... */
+                    if (widget.key !== undefined)
+                        /* ... cache a copy of the proto under that key */
+                        $.mobile.tizen._widgetPrototypes[widget.key] = ret.clone();
+                }
+            }
+            else
+                /* otherwise, if the proto /was/ found in the cache, return a copy of it */
+                ret = ret.clone();
+        }
+
+        /* If the prototype was found/created successfully ... */
+        if (ret != undefined)
+            /* ... and @ui was provided */
+            if (ui != undefined)
+                /* ... return @ui, but replace the CSS selectors it contains with the elements they select */
+                ret = fillObj(ui, ret);
+
+        return ret;
+    }
+});
+})(jQuery);
+/*
+* jQuery Mobile Framework : scrollview plugin
+* Copyright (c) 2010 Adobe Systems Incorporated - Kin Blas (jblas@adobe.com)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* Note: Code is in draft form and is subject to change
+* Modified by Koeun Choi <koeun.choi@samsung.com>
+* Modified by Minkyu Kang <mk7.kang@samsung.com>
+*/
+
+(function ( $, window, document, undefined ) {
+
+	function setElementTransform( $ele, x, y, duration ) {
+		var v = "translate(" + x + "," + y + ")",
+			transition;
+
+		if ( !duration || duration === undefined ) {
+			transition = "none";
+		} else {
+			transition =  "-webkit-transform " + duration / 1000 + "s";
+		}
+
+		$ele.css({
+			"-moz-transform": v,
+			"-webkit-transform": v,
+			"-ms-transform": v,
+			"-o-transform": v,
+			"transform": v,
+			"-webkit-transition": transition
+		});
+	}
+
+	function MomentumTracker( options ) {
+		this.options = $.extend( {}, options );
+		this.easing = "easeOutQuad";
+		this.reset();
+	}
+
+	var tstates = {
+		scrolling: 0,
+		overshot:  1,
+		snapback:  2,
+		done:      3
+	};
+
+	function getCurrentTime() {
+		return ( new Date() ).getTime();
+	}
+
+	jQuery.widget( "tizen.scrollview", jQuery.mobile.widget, {
+		options: {
+			fps:               60,    // Frames per second in msecs.
+			direction:         null,  // "x", "y", or null for both.
+
+			scrollDuration:    2000,  // Duration of the scrolling animation in msecs.
+			overshootDuration: 250,   // Duration of the overshoot animation in msecs.
+			snapbackDuration:  500,   // Duration of the snapback animation in msecs.
+
+			moveThreshold:     50,   // User must move this many pixels in any direction to trigger a scroll.
+			moveIntervalThreshold:     150,   // Time between mousemoves must not exceed this threshold.
+
+			scrollMethod:      "translate",  // "translate", "position", "scroll"
+			startEventName:    "scrollstart",
+			updateEventName:   "scrollupdate",
+			stopEventName:     "scrollstop",
+
+			eventType:         $.support.touch ? "touch" : "mouse",
+
+			showScrollBars:    true,
+
+			pagingEnabled:     false,
+			overshootEnable:   false,
+
+			delayedClickSelector: "a,input,textarea,select,button,.ui-btn"
+		},
+
+		_makePositioned: function ( $ele ) {
+			if ( $ele.css("position") === "static" ) {
+				$ele.css( "position", "relative" );
+			}
+		},
+
+		_create: function () {
+			var $page = $('.ui-page'),
+				$child,
+				direction,
+				self = this;
+
+			this._$clip = $( this.element ).addClass("ui-scrollview-clip");
+
+			$child = this._$clip.wrapInner("<div></div>").children();
+
+			this._$view = $child.addClass("ui-scrollview-view");
+
+			if ( this.options.scrollMethod === "translate" ) {
+				if ( this._$view.css("transform") === undefined ) {
+					this.options.scrollMethod = "position";
+				}
+			}
+
+			this._$clip.css( "overflow",
+				this.options.scrollMethod === "scroll" ? "scroll" : "hidden" );
+
+			this._makePositioned( this._$clip );
+
+			/*
+			 * Turn off our faux scrollbars if we are using native scrolling
+			 * to position the view.
+			 */
+			if ( this.options.scrollMethod === "scroll" ) {
+				this.options.showScrollBars = false;
+			}
+
+			/*
+			 * We really don't need this if we are using a translate transformation
+			 * for scrolling. We set it just in case the user wants to switch methods
+			 * on the fly.
+			 */
+			this._makePositioned( this._$view );
+			this._$view.css({ left: 0, top: 0 });
+
+			this._sx = 0;
+			this._sy = 0;
+
+			direction = this.options.direction;
+
+			this._hTracker = ( direction !== "y" ) ?
+					new MomentumTracker( this.options ) : null;
+			this._vTracker = ( direction !== "x" ) ?
+					new MomentumTracker( this.options ) : null;
+
+			this._timerInterval = 1000 / this.options.fps;
+			this._timerID = 0;
+
+			this._timerCB = function () {
+				self._handleMomentumScroll();
+			};
+
+			this._addBehaviors();
+		},
+
+		_startMScroll: function ( speedX, speedY ) {
+			this._stopMScroll();
+			this._showScrollBars();
+
+			var keepGoing = false,
+				duration = this.options.scrollDuration,
+				ht = this._hTracker,
+				vt = this._vTracker,
+				c,
+				v;
+
+			this._$clip.trigger( this.options.startEventName );
+			$( document ).trigger("scrollview_scroll");
+
+			if ( ht ) {
+				c = this._$clip.width();
+				v = this._$view.width();
+				ht.start( this._sx, speedX,
+					duration, (v > c) ? -(v - c) : 0, 0 );
+				keepGoing = !ht.done();
+			}
+
+			if ( vt ) {
+				c = this._$clip.height();
+				v = this._$view.height() +
+					parseFloat( this._$view.css("padding-top") );
+
+				vt.start( this._sy, speedY,
+					duration, (v > c) ? -(v - c) : 0, 0 );
+				keepGoing = keepGoing || !vt.done();
+			}
+
+			if ( keepGoing ) {
+				this._timerID = setTimeout( this._timerCB, this._timerInterval );
+			} else {
+				this._stopMScroll();
+			}
+		},
+
+		_stopMScroll: function () {
+			if ( this._timerID ) {
+				this._$clip.trigger( this.options.stopEventName );
+				clearTimeout( this._timerID );
+			}
+			this._timerID = 0;
+
+			if ( this._vTracker ) {
+				this._vTracker.reset();
+			}
+
+			if ( this._hTracker ) {
+				this._hTracker.reset();
+			}
+
+			this._hideScrollBars();
+		},
+
+		_handleMomentumScroll: function () {
+			var keepGoing = false,
+				v = this._$view,
+				x = 0,
+				y = 0,
+				vt = this._vTracker,
+				ht = this._hTracker;
+
+			if ( vt ) {
+				vt.update( this.options.overshootEnable );
+				y = vt.getPosition();
+				keepGoing = !vt.done();
+			}
+
+			if ( ht ) {
+				ht.update( this.options.overshootEnable );
+				x = ht.getPosition();
+				keepGoing = keepGoing || !ht.done();
+			}
+
+			this._setScrollPosition( x, y );
+			this._$clip.trigger( this.options.updateEventName,
+					[ { x: x, y: y } ] );
+
+			if ( keepGoing ) {
+				this._timerID = setTimeout( this._timerCB, this._timerInterval );
+			} else {
+				this._stopMScroll();
+			}
+		},
+
+		_setCalibration: function ( x, y ) {
+			if ( this.options.overshootEnable ) {
+				this._sx = x;
+				this._sy = y;
+				return;
+			}
+
+			var v = this._$view,
+				c = this._$clip,
+				dirLock = this._directionLock,
+				scroll_height = 0;
+
+			if ( dirLock !== "y" && this._hTracker ) {
+				this._sx = x;
+			}
+
+			if ( dirLock !== "x" && this._vTracker ) {
+				scroll_height = v.height() - c.height() +
+					parseFloat( c.css("padding-top") ) +
+					parseFloat( c.css("padding-bottom") );
+
+				if ( y >= 0 ) {
+					this._sy = 0;
+				} else if ( y < -scroll_height ) {
+					this._sy = -scroll_height;
+				} else {
+					this._sy = y;
+				}
+
+				if ( scroll_height < 0 ) {
+					this._sy = 0;
+				}
+			}
+		},
+
+		_setScrollPosition: function ( x, y, duration ) {
+			this._setCalibration( x, y );
+
+			x = this._sx;
+			y = this._sy;
+
+			var $v = this._$view,
+				sm = this.options.scrollMethod,
+				$vsb = this._$vScrollBar,
+				$hsb = this._$hScrollBar,
+				$sbt;
+
+			switch ( sm ) {
+			case "translate":
+				setElementTransform( $v, x + "px", y + "px", duration );
+				break;
+
+			case "position":
+				$v.css({left: x + "px", top: y + "px"});
+				break;
+
+			case "scroll":
+				this._$clip[0].scrollLeft = -x;
+				this._$clip[0].scrollTop = -y;
+				break;
+			}
+
+			if ( $vsb ) {
+				$sbt = $vsb.find(".ui-scrollbar-thumb");
+
+				if ( sm === "translate" ) {
+					setElementTransform( $sbt, "0px",
+						-y / $v.height() * $sbt.parent().height() + "px",
+						duration );
+				} else {
+					$sbt.css( "top", -y / $v.height() * 100 + "%" );
+				}
+			}
+
+			if ( $hsb ) {
+				$sbt = $hsb.find(".ui-scrollbar-thumb");
+
+				if ( sm === "translate" ) {
+					setElementTransform( $sbt,
+						-x / $v.width() * $sbt.parent().width() + "px", "0px",
+						duration);
+				} else {
+					$sbt.css("left", -x / $v.width() * 100 + "%");
+				}
+			}
+		},
+
+		scrollTo: function ( x, y, duration ) {
+			this._stopMScroll();
+
+			/*
+			 * currently support only animation for translate
+			 * Don't want to use setTimeout algorithm for animation.
+			 */
+			if ( !duration || (duration && this.options.scrollMethod === "translate") ) {
+				return this._setScrollPosition( x, y, duration );
+			}
+
+			// follow jqm default animation when the scrollmethod is not translate.
+
+			x = -x;
+			y = -y;
+
+			var self = this,
+				start = getCurrentTime(),
+				efunc = $.easing.easeOutQuad,
+				sx = this._sx,
+				sy = this._sy,
+				dx = x - sx,
+				dy = y - sy,
+				tfunc;
+
+			tfunc = function () {
+				var elapsed = getCurrentTime() - start,
+				    ec;
+
+				if ( elapsed >= duration ) {
+					self._timerID = 0;
+					self._setScrollPosition( x, y );
+				} else {
+					ec = efunc( elapsed / duration, elapsed, 0, 1, duration );
+
+					self._setScrollPosition( sx + (dx * ec), sy + (dy * ec) );
+					self._timerID = setTimeout( tfunc, self._timerInterval );
+				}
+			};
+
+			this._timerID = setTimeout( tfunc, this._timerInterval );
+		},
+
+		getScrollPosition: function () {
+			return { x: -this._sx, y: -this._sy };
+		},
+
+		_getScrollHierarchy: function () {
+			var svh = [],
+				d;
+
+			this._$clip.parents(".ui-scrollview-clip").each(function () {
+				d = $( this ).jqmData("scrollview");
+				if ( d ) {
+					svh.unshift( d );
+				}
+			});
+			return svh;
+		},
+
+		_getAncestorByDirection: function ( dir ) {
+			var svh = this._getScrollHierarchy(),
+				n = svh.length,
+				sv,
+				svdir;
+
+			while ( 0 < n-- ) {
+				sv = svh[n];
+				svdir = sv.options.direction;
+
+				if (!svdir || svdir === dir) {
+					return sv;
+				}
+			}
+			return null;
+		},
+
+		_handleDragStart: function ( e, ex, ey ) {
+			// Stop any scrolling of elements in our parent hierarcy.
+			$.each( this._getScrollHierarchy(), function (i, sv) {
+				sv._stopMScroll();
+			});
+			this._stopMScroll();
+
+			this._didDrag = false;
+
+			var target = $( e.target ),
+				shouldBlockEvent = 1,
+				c = this._$clip,
+				v = this._$view,
+				cw = 0,
+				vw = 0,
+				ch = 0,
+				vh = 0,
+				svdir = this.options.direction,
+				thumb;
+
+			// should skip the dragging when click the button
+			this._skip_dragging = target.is('.ui-btn-text') ||
+					target.is('.ui-btn-inner');
+
+			if ( this._skip_dragging ) {
+				return;
+			}
+
+			/*
+			 * If we're using mouse events, we need to prevent the default
+			 * behavior to suppress accidental selection of text, etc. We
+			 * can't do this on touch devices because it will disable the
+			 * generation of "click" events.
+			 */
+
+			this._shouldBlockEvent = !( target.is(':input') ||
+					target.parents(':input').length > 0 );
+
+			if ( this._shouldBlockEvent ) {
+				e.preventDefault();
+			}
+
+			this._lastX = ex;
+			this._lastY = ey;
+			this._startY = ey;
+			this._doSnapBackX = false;
+			this._doSnapBackY = false;
+			this._speedX = 0;
+			this._speedY = 0;
+
+			this._directionLock = "";
+
+			if ( this._hTracker ) {
+				cw = parseInt( c.css("width"), 10 );
+				vw = parseInt( v.css("width"), 10 );
+				this._maxX = cw - vw;
+
+				if ( this._maxX > 0 ) {
+					this._maxX = 0;
+				}
+				if ( this._$hScrollBar  && vw ) {
+					thumb = this._$hScrollBar.find(".ui-scrollbar-thumb");
+					thumb.css( "width", (cw >= vw ? "100%" :
+							(Math.floor(cw / vw * 100) || 1) + "%") );
+				}
+			}
+
+			if ( this._vTracker ) {
+				ch = parseInt( c.css("height"), 10 );
+				vh = parseInt( v.css("height"), 10 ) +
+					parseFloat( v.css("padding-top") );
+				this._maxY = ch - vh;
+
+				if ( this._maxY > 0 ) {
+					this._maxY = 0;
+				}
+				if ( this._$vScrollBar && vh ) {
+					thumb = this._$vScrollBar.find(".ui-scrollbar-thumb");
+					thumb.css( "height", (ch >= vh ? "100%" :
+							(Math.floor(ch / vh * 100) || 1) + "%") );
+				}
+			}
+
+			this._pageDelta = 0;
+			this._pageSize = 0;
+			this._pagePos = 0;
+
+			if ( this.options.pagingEnabled && (svdir === "x" || svdir === "y") ) {
+				this._pageSize = (svdir === "x") ? cw : ch;
+				this._pagePos = (svdir === "x") ? this._sx : this._sy;
+				this._pagePos -= this._pagePos % this._pageSize;
+			}
+
+			this._lastMove = 0;
+			this._enableTracking();
+		},
+
+		_propagateDragMove: function ( sv, e, ex, ey, dir ) {
+			this._hideScrollBars();
+			this._disableTracking();
+			sv._handleDragStart( e, ex, ey );
+			sv._directionLock = dir;
+			sv._didDrag = this._didDrag;
+		},
+
+		_handleDragMove: function ( e, ex, ey ) {
+			if ( this._skip_dragging ) {
+				return;
+			}
+
+			if ( !this._dragging ) {
+				return;
+			}
+
+			if ( this._shouldBlockEvent ) {
+				e.preventDefault();
+			}
+
+			var mt = this.options.moveThreshold,
+				v = this._$view,
+				dx = ex - this._lastX,
+				dy = ey - this._lastY,
+				svdir = this.options.direction,
+				dir = null,
+				x,
+				y,
+				sv,
+				scope,
+				newX,
+				newY,
+				dirLock,
+				opos,
+				cpos,
+				delta;
+
+			if ( Math.abs( this._startY - ey ) < mt && !this._didDrag ) {
+				return;
+			}
+
+			this._lastMove = getCurrentTime();
+			if ( !this._directionLock ) {
+				x = Math.abs( dx );
+				y = Math.abs( dy );
+
+				if ( x < mt && y < mt ) {
+					return false;
+				}
+
+				if ( x < y && (x / y) < 0.5 ) {
+					dir = "y";
+				} else if ( x > y && (y / x) < 0.5 ) {
+					dir = "x";
+				}
+
+				if ( svdir && dir && svdir !== dir ) {
+					/*
+					 * This scrollview can't handle the direction the user
+					 * is attempting to scroll. Find an ancestor scrollview
+					 * that can handle the request.
+					 */
+
+					sv = this._getAncestorByDirection( dir );
+					if ( sv ) {
+						this._propagateDragMove( sv, e, ex, ey, dir );
+						return false;
+					}
+				}
+
+				//this._directionLock = svdir ? svdir : (dir ? dir : "none");
+				this._directionLock = svdir || (dir || "none");
+			}
+
+			newX = this._sx;
+			newY = this._sy;
+			dirLock = this._directionLock;
+
+			if ( dirLock !== "y" && this._hTracker ) {
+				x = this._sx;
+				this._speedX = dx;
+				newX = x + dx;
+
+				// Simulate resistance.
+
+				this._doSnapBackX = false;
+
+				scope = (newX > 0 || newX < this._maxX);
+				if ( scope && dirLock === "x" ) {
+					sv = this._getAncestorByDirection("x");
+					if ( sv ) {
+						this._setScrollPosition( newX > 0 ?
+								0 : this._maxX, newY );
+						this._propagateDragMove( sv, e, ex, ey, dir );
+						return false;
+					}
+
+					newX = x + (dx / 2);
+					this._doSnapBackX = true;
+				}
+			}
+
+			if ( dirLock !== "x" && this._vTracker ) {
+				y = this._sy;
+				this._speedY = dy;
+				newY = y + dy;
+
+				// Simulate resistance.
+
+				this._doSnapBackY = false;
+
+				scope = (newY > 0 || newY < this._maxY);
+				if ( scope && dirLock === "y" ) {
+					sv = this._getAncestorByDirection("y");
+					if ( sv ) {
+						this._setScrollPosition( newX,
+								newY > 0 ? 0 : this._maxY );
+						this._propagateDragMove( sv, e, ex, ey, dir );
+						return false;
+					}
+
+					newY = y + (dy / 2);
+					this._doSnapBackY = true;
+				}
+			}
+
+			if ( this.options.overshootEnable === false ) {
+				this._doSnapBackX = false;
+				this._doSnapBackY = false;
+			}
+
+			if ( this.options.pagingEnabled && (svdir === "x" || svdir === "y") ) {
+				if ( this._doSnapBackX || this._doSnapBackY ) {
+					this._pageDelta = 0;
+				} else {
+					opos = this._pagePos;
+					cpos = svdir === "x" ? newX : newY;
+					delta = svdir === "x" ? dx : dy;
+
+					if ( opos > cpos && delta < 0 ) {
+						this._pageDelta = this._pageSize;
+					} else if ( opos < cpos && delta > 0 ) {
+						this._pageDelta = -this._pageSize;
+					} else {
+						this._pageDelta = 0;
+					}
+				}
+			}
+
+			this._didDrag = true;
+			this._lastX = ex;
+			this._lastY = ey;
+
+			this._setScrollPosition( newX, newY );
+
+			this._showScrollBars();
+		},
+
+		_handleDragStop: function ( e ) {
+			if ( this._skip_dragging ) {
+				return;
+			}
+
+			var l = this._lastMove,
+				t = getCurrentTime(),
+				doScroll = (l && (t - l) <= this.options.moveIntervalThreshold),
+				sx = ( this._hTracker && this._speedX && doScroll ) ?
+						this._speedX : ( this._doSnapBackX ? 1 : 0 ),
+				sy = ( this._vTracker && this._speedY && doScroll ) ?
+						this._speedY : ( this._doSnapBackY ? 1 : 0 ),
+				svdir = this.options.direction,
+				x,
+				y;
+
+			if ( this.options.pagingEnabled && (svdir === "x" || svdir === "y") &&
+					!this._doSnapBackX && !this._doSnapBackY ) {
+				x = this._sx;
+				y = this._sy;
+
+				if ( svdir === "x" ) {
+					x = -this._pagePos + this._pageDelta;
+				} else {
+					y = -this._pagePos + this._pageDelta;
+				}
+
+				this.scrollTo( x, y, this.options.snapbackDuration );
+			} else if ( sx || sy ) {
+				this._startMScroll( sx, sy );
+			} else {
+				this._hideScrollBars();
+			}
+
+			this._disableTracking();
+
+			if ( !this._didDrag && this.options.eventType === "touch" ) {
+				$(e.target).closest(this.options.delayedClickSelector).trigger("click");
+			}
+
+			/*
+			 * If a view scrolled, then we need to absorb
+			 * the event so that links etc, underneath our
+			 * cursor/finger don't fire.
+			 */
+
+			return !this._didDrag;
+		},
+
+		_enableTracking: function () {
+			this._dragging = true;
+		},
+
+		_disableTracking: function () {
+			this._dragging = false;
+		},
+
+		_showScrollBars: function () {
+			var vclass = "ui-scrollbar-visible";
+			if ( this._$vScrollBar ) {
+				this._$vScrollBar.addClass( vclass );
+			}
+			if ( this._$hScrollBar ) {
+				this._$hScrollBar.addClass( vclass );
+			}
+		},
+
+		_hideScrollBars: function () {
+			var vclass = "ui-scrollbar-visible";
+			if ( this._$vScrollBar ) {
+				this._$vScrollBar.removeClass( vclass );
+			}
+			if ( this._$hScrollBar ) {
+				this._$hScrollBar.removeClass( vclass );
+			}
+		},
+
+		_addBehaviors: function () {
+			var self = this,
+				$c = this._$clip,
+				prefix = "<div class=\"ui-scrollbar ui-scrollbar-",
+				suffix = "\"><div class=\"ui-scrollbar-track\"><div class=\"ui-scrollbar-thumb\"></div></div></div>";
+
+			if ( this.options.eventType === "mouse" ) {
+				this._dragEvt = "mousedown mousemove mouseup click";
+				this._dragCB = function ( e ) {
+					switch ( e.type ) {
+					case "mousedown":
+						return self._handleDragStart( e,
+								e.clientX, e.clientY );
+
+					case "mousemove":
+						return self._handleDragMove( e,
+								e.clientX, e.clientY );
+
+					case "mouseup":
+						return self._handleDragStop( e );
+
+					case "click":
+						return !self._didDrag;
+					}
+				};
+			} else {
+				this._dragEvt = "touchstart touchmove touchend vclick";
+				this._dragCB = function ( e ) {
+					var t;
+
+					switch ( e.type ) {
+					case "touchstart":
+						t = e.originalEvent.targetTouches[0];
+						return self._handleDragStart( e,
+								t.pageX, t.pageY );
+
+					case "touchmove":
+						t = e.originalEvent.targetTouches[0];
+						return self._handleDragMove( e,
+								t.pageX, t.pageY );
+
+					case "touchend":
+						return self._handleDragStop( e );
+
+					case "vclick":
+						return !self._didDrag;
+					}
+				};
+			}
+
+			this._$view.bind( this._dragEvt, this._dragCB );
+
+			if ( this.options.showScrollBars ) {
+				if ( this._vTracker ) {
+					$c.append( prefix + "y" + suffix );
+					this._$vScrollBar = $c.children(".ui-scrollbar-y");
+				}
+				if ( this._hTracker ) {
+					$c.append( prefix + "x" + suffix );
+					this._$hScrollBar = $c.children(".ui-scrollbar-x");
+				}
+			}
+		}
+	});
+
+	$.extend( MomentumTracker.prototype, {
+		start: function ( pos, speed, duration, minPos, maxPos ) {
+			var tstate = (pos < minPos || pos > maxPos) ?
+					tstates.snapback : tstates.scrolling,
+				pos_temp;
+
+			this.state = (speed !== 0) ? tstate : tstates.done;
+			this.pos = pos;
+			this.speed = speed;
+			this.duration = (this.state === tstates.snapback) ?
+					this.options.snapbackDuration : duration;
+			this.minPos = minPos;
+			this.maxPos = maxPos;
+
+			this.fromPos = (this.state === tstates.snapback) ? this.pos : 0;
+			pos_temp = (this.pos < this.minPos) ? this.minPos : this.maxPos;
+			this.toPos = (this.state === tstates.snapback) ? pos_temp : 0;
+
+			this.startTime = getCurrentTime();
+		},
+
+		reset: function () {
+			this.state = tstates.done;
+			this.pos = 0;
+			this.speed = 0;
+			this.minPos = 0;
+			this.maxPos = 0;
+			this.duration = 0;
+		},
+
+		update: function ( overshootEnable ) {
+			var state = this.state,
+				cur_time = getCurrentTime(),
+				duration = this.duration,
+				elapsed =  cur_time - this.startTime,
+				dx,
+				x,
+				didOverShoot;
+
+			if ( state === tstates.done ) {
+				return this.pos;
+			}
+
+			elapsed = elapsed > duration ? duration : elapsed;
+
+			if ( state === tstates.scrolling || state === tstates.overshot ) {
+				dx = this.speed *
+					(1 - $.easing[this.easing]( elapsed / duration,
+								elapsed, 0, 1, duration ));
+
+				x = this.pos + dx;
+
+				didOverShoot = (state === tstates.scrolling) &&
+					(x < this.minPos || x > this.maxPos);
+
+				if ( didOverShoot ) {
+					x = (x < this.minPos) ? this.minPos : this.maxPos;
+				}
+
+				this.pos = x;
+
+				if ( state === tstates.overshot ) {
+					if ( elapsed >= duration ) {
+						this.state = tstates.snapback;
+						this.fromPos = this.pos;
+						this.toPos = (x < this.minPos) ?
+								this.minPos : this.maxPos;
+						this.duration = this.options.snapbackDuration;
+						this.startTime = cur_time;
+						elapsed = 0;
+					}
+				} else if ( state === tstates.scrolling ) {
+					if ( didOverShoot && overshootEnable ) {
+						this.state = tstates.overshot;
+						this.speed = dx / 2;
+						this.duration = this.options.overshootDuration;
+						this.startTime = cur_time;
+					} else if ( elapsed >= duration ) {
+						this.state = tstates.done;
+					}
+				}
+			} else if ( state === tstates.snapback ) {
+				if ( elapsed >= duration ) {
+					this.pos = this.toPos;
+					this.state = tstates.done;
+				} else {
+					this.pos = this.fromPos + ((this.toPos - this.fromPos) *
+						$.easing[this.easing]( elapsed / duration,
+							elapsed, 0, 1, duration ));
+				}
+			}
+
+			return this.pos;
+		},
+
+		done: function () {
+			return this.state === tstates.done;
+		},
+
+		getPosition: function () {
+			return this.pos;
+		}
+	});
+
+	function resizePageContentHeight( page ) {
+		var $page = $( page ),
+			$content = $page.children(".ui-content"),
+			hh = $page.children(".ui-header").outerHeight() || 0,
+			fh = $page.children(".ui-footer").outerHeight() || 0,
+			pt = parseFloat( $content.css("padding-top") ),
+			pb = parseFloat( $content.css("padding-bottom") ),
+			wh = $(window).height();
+
+		$content.height( wh - (hh + fh) - (pt + pb) );
+	}
+
+	// auto-init scrollview and scrolllistview widgets
+	$( document ).bind( 'pagecreate create', function ( e ) {
+		var $page = $( e.target ),
+			scroll = $page.find(".ui-content").attr("data-scroll");
+
+		if ( scroll === "none" ) {
+			return;
+		}
+
+		if ( $.support.scrollview === undefined ) {
+			// set as default value
+			$.support.scrollview = true;
+		}
+
+		if ( $.support.scrollview === true && scroll === undefined ) {
+			$page.find(".ui-content").attr( "data-scroll", "y" );
+		}
+
+		$page.find(":jqmData(scroll):not(.ui-scrollview-clip)").each( function () {
+			if ( $( this ).hasClass("ui-scrolllistview") ) {
+				$( this ).scrolllistview();
+			} else {
+				var st = $( this ).jqmData("scroll"),
+					paging = st && (st.search(/^[xy]p$/) !== -1),
+					dir = st && (st.search(/^[xy]/) !== -1) ? st.charAt(0) : null,
+					opts;
+
+				opts = {
+					direction: dir || undefined,
+					paging: paging || undefined,
+					scrollMethod: $( this ).jqmData("scroll-method") || undefined
+				};
+
+				$( this ).scrollview( opts );
+			}
+		});
+	});
+
+	$( document ).bind( 'pageshow', function ( e ) {
+		var $page = $( e.target ),
+			scroll = $page.find(".ui-content").attr("data-scroll");
+
+		if ( scroll === "y" ) {
+			setTimeout( function () {
+				resizePageContentHeight( e.target );
+			}, 100);
+		}
+	});
+
+	$( window ).bind( "orientationchange", function ( e ) {
+		resizePageContentHeight( $(".ui-page") );
+	});
+
+}( jQuery, window, document ) );
+/*!
+ * jQuery Templates Plugin 1.0.0pre
+ * http://github.com/jquery/jquery-tmpl
+ * Requires jQuery 1.4.2
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ */
+(function( jQuery, undefined ){
+	var oldManip = jQuery.fn.domManip, tmplItmAtt = "_tmplitem", htmlExpr = /^[^<]*(<[\w\W]+>)[^>]*$|\{\{\! /,
+		newTmplItems = {}, wrappedItems = {}, appendToTmplItems, topTmplItem = { key: 0, data: {} }, itemKey = 0, cloneIndex = 0, stack = [];
+
+	function newTmplItem( options, parentItem, fn, data ) {
+		// Returns a template item data structure for a new rendered instance of a template (a 'template item').
+		// The content field is a hierarchical array of strings and nested items (to be
+		// removed and replaced by nodes field of dom elements, once inserted in DOM).
+		var newItem = {
+			data: data || (data === 0 || data === false) ? data : (parentItem ? parentItem.data : {}),
+			_wrap: parentItem ? parentItem._wrap : null,
+			tmpl: null,
+			parent: parentItem || null,
+			nodes: [],
+			calls: tiCalls,
+			nest: tiNest,
+			wrap: tiWrap,
+			html: tiHtml,
+			update: tiUpdate
+		};
+		if ( options ) {
+			jQuery.extend( newItem, options, { nodes: [], parent: parentItem });
+		}
+		if ( fn ) {
+			// Build the hierarchical content to be used during insertion into DOM
+			newItem.tmpl = fn;
+			newItem._ctnt = newItem._ctnt || newItem.tmpl( jQuery, newItem );
+			newItem.key = ++itemKey;
+			// Keep track of new template item, until it is stored as jQuery Data on DOM element
+			(stack.length ? wrappedItems : newTmplItems)[itemKey] = newItem;
+		}
+		return newItem;
+	}
+
+	// Override appendTo etc., in order to provide support for targeting multiple elements. (This code would disappear if integrated in jquery core).
+	jQuery.each({
+		appendTo: "append",
+		prependTo: "prepend",
+		insertBefore: "before",
+		insertAfter: "after",
+		replaceAll: "replaceWith"
+	}, function( name, original ) {
+		jQuery.fn[ name ] = function( selector ) {
+			var ret = [], insert = jQuery( selector ), elems, i, l, tmplItems,
+				parent = this.length === 1 && this[0].parentNode;
+
+			appendToTmplItems = newTmplItems || {};
+			if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+				insert[ original ]( this[0] );
+				ret = this;
+			} else {
+				for ( i = 0, l = insert.length; i < l; i++ ) {
+					cloneIndex = i;
+					elems = (i > 0 ? this.clone(true) : this).get();
+					jQuery( insert[i] )[ original ]( elems );
+					ret = ret.concat( elems );
+				}
+				cloneIndex = 0;
+				ret = this.pushStack( ret, name, insert.selector );
+			}
+			tmplItems = appendToTmplItems;
+			appendToTmplItems = null;
+			jQuery.tmpl.complete( tmplItems );
+			return ret;
+		};
+	});
+
+	jQuery.fn.extend({
+		// Use first wrapped element as template markup.
+		// Return wrapped set of template items, obtained by rendering template against data.
+		tmpl: function( data, options, parentItem ) {
+			return jQuery.tmpl( this[0], data, options, parentItem );
+		},
+
+		// Find which rendered template item the first wrapped DOM element belongs to
+		tmplItem: function() {
+			return jQuery.tmplItem( this[0] );
+		},
+
+		// Consider the first wrapped element as a template declaration, and get the compiled template or store it as a named template.
+		template: function( name ) {
+			return jQuery.template( name, this[0] );
+		},
+
+		domManip: function( args, table, callback, options ) {
+			if ( args[0] && jQuery.isArray( args[0] )) {
+				var dmArgs = jQuery.makeArray( arguments ), elems = args[0], elemsLength = elems.length, i = 0, tmplItem;
+				while ( i < elemsLength && !(tmplItem = jQuery.data( elems[i++], "tmplItem" ))) {}
+				if ( tmplItem && cloneIndex ) {
+					dmArgs[2] = function( fragClone ) {
+						// Handler called by oldManip when rendered template has been inserted into DOM.
+						jQuery.tmpl.afterManip( this, fragClone, callback );
+					};
+				}
+				oldManip.apply( this, dmArgs );
+			} else {
+				oldManip.apply( this, arguments );
+			}
+			cloneIndex = 0;
+			if ( !appendToTmplItems ) {
+				jQuery.tmpl.complete( newTmplItems );
+			}
+			return this;
+		}
+	});
+
+	jQuery.extend({
+		// Return wrapped set of template items, obtained by rendering template against data.
+		tmpl: function( tmpl, data, options, parentItem ) {
+			var ret, topLevel = !parentItem;
+			if ( topLevel ) {
+				// This is a top-level tmpl call (not from a nested template using {{tmpl}})
+				parentItem = topTmplItem;
+				tmpl = jQuery.template[tmpl] || jQuery.template( null, tmpl );
+				wrappedItems = {}; // Any wrapped items will be rebuilt, since this is top level
+			} else if ( !tmpl ) {
+				// The template item is already associated with DOM - this is a refresh.
+				// Re-evaluate rendered template for the parentItem
+				tmpl = parentItem.tmpl;
+				newTmplItems[parentItem.key] = parentItem;
+				parentItem.nodes = [];
+				if ( parentItem.wrapped ) {
+					updateWrapped( parentItem, parentItem.wrapped );
+				}
+				// Rebuild, without creating a new template item
+				return jQuery( build( parentItem, null, parentItem.tmpl( jQuery, parentItem ) ));
+			}
+			if ( !tmpl ) {
+				return []; // Could throw...
+			}
+			if ( typeof data === "function" ) {
+				data = data.call( parentItem || {} );
+			}
+			if ( options && options.wrapped ) {
+				updateWrapped( options, options.wrapped );
+			}
+			ret = jQuery.isArray( data ) ?
+				jQuery.map( data, function( dataItem ) {
+					return dataItem ? newTmplItem( options, parentItem, tmpl, dataItem ) : null;
+				}) :
+				[ newTmplItem( options, parentItem, tmpl, data ) ];
+			return topLevel ? jQuery( build( parentItem, null, ret ) ) : ret;
+		},
+
+		// Return rendered template item for an element.
+		tmplItem: function( elem ) {
+			var tmplItem;
+			if ( elem instanceof jQuery ) {
+				elem = elem[0];
+			}
+			while ( elem && elem.nodeType === 1 && !(tmplItem = jQuery.data( elem, "tmplItem" )) && (elem = elem.parentNode) ) {}
+			return tmplItem || topTmplItem;
+		},
+
+		// Set:
+		// Use $.template( name, tmpl ) to cache a named template,
+		// where tmpl is a template string, a script element or a jQuery instance wrapping a script element, etc.
+		// Use $( "selector" ).template( name ) to provide access by name to a script block template declaration.
+
+		// Get:
+		// Use $.template( name ) to access a cached template.
+		// Also $( selectorToScriptBlock ).template(), or $.template( null, templateString )
+		// will return the compiled template, without adding a name reference.
+		// If templateString includes at least one HTML tag, $.template( templateString ) is equivalent
+		// to $.template( null, templateString )
+		template: function( name, tmpl ) {
+			if (tmpl) {
+				// Compile template and associate with name
+				if ( typeof tmpl === "string" ) {
+					// This is an HTML string being passed directly in.
+					tmpl = buildTmplFn( tmpl );
+				} else if ( tmpl instanceof jQuery ) {
+					tmpl = tmpl[0] || {};
+				}
+				if ( tmpl.nodeType ) {
+					// If this is a template block, use cached copy, or generate tmpl function and cache.
+					tmpl = jQuery.data( tmpl, "tmpl" ) || jQuery.data( tmpl, "tmpl", buildTmplFn( tmpl.innerHTML ));
+					// Issue: In IE, if the container element is not a script block, the innerHTML will remove quotes from attribute values whenever the value does not include white space.
+					// This means that foo="${x}" will not work if the value of x includes white space: foo="${x}" -> foo=value of x.
+					// To correct this, include space in tag: foo="${ x }" -> foo="value of x"
+				}
+				return typeof name === "string" ? (jQuery.template[name] = tmpl) : tmpl;
+			}
+			// Return named compiled template
+			return name ? (typeof name !== "string" ? jQuery.template( null, name ):
+				(jQuery.template[name] ||
+					// If not in map, and not containing at least on HTML tag, treat as a selector.
+					// (If integrated with core, use quickExpr.exec)
+					jQuery.template( null, htmlExpr.test( name ) ? name : jQuery( name )))) : null;
+		},
+
+		encode: function( text ) {
+			// Do HTML encoding replacing < > & and ' and " by corresponding entities.
+			return ("" + text).split("<").join("&lt;").split(">").join("&gt;").split('"').join("&#34;").split("'").join("&#39;");
+		}
+	});
+
+	jQuery.extend( jQuery.tmpl, {
+		tag: {
+			"tmpl": {
+				_default: { $2: "null" },
+				open: "if($notnull_1){__=__.concat($item.nest($1,$2));}"
+				// tmpl target parameter can be of type function, so use $1, not $1a (so not auto detection of functions)
+				// This means that {{tmpl foo}} treats foo as a template (which IS a function).
+				// Explicit parens can be used if foo is a function that returns a template: {{tmpl foo()}}.
+			},
+			"wrap": {
+				_default: { $2: "null" },
+				open: "$item.calls(__,$1,$2);__=[];",
+				close: "call=$item.calls();__=call._.concat($item.wrap(call,__));"
+			},
+			"each": {
+				_default: { $2: "$index, $value" },
+				open: "if($notnull_1){$.each($1a,function($2){with(this){",
+				close: "}});}"
+			},
+			"if": {
+				open: "if(($notnull_1) && $1a){",
+				close: "}"
+			},
+			"else": {
+				_default: { $1: "true" },
+				open: "}else if(($notnull_1) && $1a){"
+			},
+			"html": {
+				// Unecoded expression evaluation.
+				open: "if($notnull_1){__.push($1a);}"
+			},
+			"=": {
+				// Encoded expression evaluation. Abbreviated form is ${}.
+				_default: { $1: "$data" },
+				open: "if($notnull_1){__.push($.encode($1a));}"
+			},
+			"!": {
+				// Comment tag. Skipped by parser
+				open: ""
+			}
+		},
+
+		// This stub can be overridden, e.g. in jquery.tmplPlus for providing rendered events
+		complete: function( items ) {
+			newTmplItems = {};
+		},
+
+		// Call this from code which overrides domManip, or equivalent
+		// Manage cloning/storing template items etc.
+		afterManip: function afterManip( elem, fragClone, callback ) {
+			// Provides cloned fragment ready for fixup prior to and after insertion into DOM
+			var content = fragClone.nodeType === 11 ?
+				jQuery.makeArray(fragClone.childNodes) :
+				fragClone.nodeType === 1 ? [fragClone] : [];
+
+			// Return fragment to original caller (e.g. append) for DOM insertion
+			callback.call( elem, fragClone );
+
+			// Fragment has been inserted:- Add inserted nodes to tmplItem data structure. Replace inserted element annotations by jQuery.data.
+			storeTmplItems( content );
+			cloneIndex++;
+		}
+	});
+
+	//========================== Private helper functions, used by code above ==========================
+
+	function build( tmplItem, nested, content ) {
+		// Convert hierarchical content into flat string array
+		// and finally return array of fragments ready for DOM insertion
+		var frag, ret = content ? jQuery.map( content, function( item ) {
+			return (typeof item === "string") ?
+				// Insert template item annotations, to be converted to jQuery.data( "tmplItem" ) when elems are inserted into DOM.
+				(tmplItem.key ? item.replace( /(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g, "$1 " + tmplItmAtt + "=\"" + tmplItem.key + "\" $2" ) : item) :
+				// This is a child template item. Build nested template.
+				build( item, tmplItem, item._ctnt );
+		}) :
+		// If content is not defined, insert tmplItem directly. Not a template item. May be a string, or a string array, e.g. from {{html $item.html()}}.
+		tmplItem;
+		if ( nested ) {
+			return ret;
+		}
+
+		// top-level template
+		ret = ret.join("");
+
+		// Support templates which have initial or final text nodes, or consist only of text
+		// Also support HTML entities within the HTML markup.
+		ret.replace( /^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/, function( all, before, middle, after) {
+			frag = jQuery( middle ).get();
+
+			storeTmplItems( frag );
+			if ( before ) {
+				frag = unencode( before ).concat(frag);
+			}
+			if ( after ) {
+				frag = frag.concat(unencode( after ));
+			}
+		});
+		return frag ? frag : unencode( ret );
+	}
+
+	function unencode( text ) {
+		// Use createElement, since createTextNode will not render HTML entities correctly
+		var el = document.createElement( "div" );
+		el.innerHTML = text;
+		return jQuery.makeArray(el.childNodes);
+	}
+
+	// Generate a reusable function that will serve to render a template against data
+	function buildTmplFn( markup ) {
+		return new Function("jQuery","$item",
+			// Use the variable __ to hold a string array while building the compiled template. (See https://github.com/jquery/jquery-tmpl/issues#issue/10).
+			"var $=jQuery,call,__=[],$data=$item.data;" +
+
+			// Introduce the data as local variables using with(){}
+			"with($data){__.push('" +
+
+			// Convert the template into pure JavaScript
+			jQuery.trim(markup)
+				.replace( /([\\'])/g, "\\$1" )
+				.replace( /[\r\t\n]/g, " " )
+				.replace( /\$\{([^\}]*)\}/g, "{{= $1}}" )
+				.replace( /\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g,
+				function( all, slash, type, fnargs, target, parens, args ) {
+					var tag = jQuery.tmpl.tag[ type ], def, expr, exprAutoFnDetect;
+					if ( !tag ) {
+						throw "Unknown template tag: " + type;
+					}
+					def = tag._default || [];
+					if ( parens && !/\w$/.test(target)) {
+						target += parens;
+						parens = "";
+					}
+					if ( target ) {
+						target = unescape( target );
+						args = args ? ("," + unescape( args ) + ")") : (parens ? ")" : "");
+						// Support for target being things like a.toLowerCase();
+						// In that case don't call with template item as 'this' pointer. Just evaluate...
+						expr = parens ? (target.indexOf(".") > -1 ? target + unescape( parens ) : ("(" + target + ").call($item" + args)) : target;
+						exprAutoFnDetect = parens ? expr : "(typeof(" + target + ")==='function'?(" + target + ").call($item):(" + target + "))";
+					} else {
+						exprAutoFnDetect = expr = def.$1 || "null";
+					}
+					fnargs = unescape( fnargs );
+					return "');" +
+						tag[ slash ? "close" : "open" ]
+							.split( "$notnull_1" ).join( target ? "typeof(" + target + ")!=='undefined' && (" + target + ")!=null" : "true" )
+							.split( "$1a" ).join( exprAutoFnDetect )
+							.split( "$1" ).join( expr )
+							.split( "$2" ).join( fnargs || def.$2 || "" ) +
+						"__.push('";
+				}) +
+			"');}return __;"
+		);
+	}
+	function updateWrapped( options, wrapped ) {
+		// Build the wrapped content.
+		options._wrap = build( options, true,
+			// Suport imperative scenario in which options.wrapped can be set to a selector or an HTML string.
+			jQuery.isArray( wrapped ) ? wrapped : [htmlExpr.test( wrapped ) ? wrapped : jQuery( wrapped ).html()]
+		).join("");
+	}
+
+	function unescape( args ) {
+		return args ? args.replace( /\\'/g, "'").replace(/\\\\/g, "\\" ) : null;
+	}
+	function outerHtml( elem ) {
+		var div = document.createElement("div");
+		div.appendChild( elem.cloneNode(true) );
+		return div.innerHTML;
+	}
+
+	// Store template items in jQuery.data(), ensuring a unique tmplItem data data structure for each rendered template instance.
+	function storeTmplItems( content ) {
+		var keySuffix = "_" + cloneIndex, elem, elems, newClonedItems = {}, i, l, m;
+		for ( i = 0, l = content.length; i < l; i++ ) {
+			if ( (elem = content[i]).nodeType !== 1 ) {
+				continue;
+			}
+			elems = elem.getElementsByTagName("*");
+			for ( m = elems.length - 1; m >= 0; m-- ) {
+				processItemKey( elems[m] );
+			}
+			processItemKey( elem );
+		}
+		function processItemKey( el ) {
+			var pntKey, pntNode = el, pntItem, tmplItem, key;
+			// Ensure that each rendered template inserted into the DOM has its own template item,
+			if ( (key = el.getAttribute( tmplItmAtt ))) {
+				while ( pntNode.parentNode && (pntNode = pntNode.parentNode).nodeType === 1 && !(pntKey = pntNode.getAttribute( tmplItmAtt ))) { }
+				if ( pntKey !== key ) {
+					// The next ancestor with a _tmplitem expando is on a different key than this one.
+					// So this is a top-level element within this template item
+					// Set pntNode to the key of the parentNode, or to 0 if pntNode.parentNode is null, or pntNode is a fragment.
+					pntNode = pntNode.parentNode ? (pntNode.nodeType === 11 ? 0 : (pntNode.getAttribute( tmplItmAtt ) || 0)) : 0;
+					if ( !(tmplItem = newTmplItems[key]) ) {
+						// The item is for wrapped content, and was copied from the temporary parent wrappedItem.
+						tmplItem = wrappedItems[key];
+						tmplItem = newTmplItem( tmplItem, newTmplItems[pntNode]||wrappedItems[pntNode] );
+						tmplItem.key = ++itemKey;
+						newTmplItems[itemKey] = tmplItem;
+					}
+					if ( cloneIndex ) {
+						cloneTmplItem( key );
+					}
+				}
+				el.removeAttribute( tmplItmAtt );
+			} else if ( cloneIndex && (tmplItem = jQuery.data( el, "tmplItem" )) ) {
+				// This was a rendered element, cloned during append or appendTo etc.
+				// TmplItem stored in jQuery data has already been cloned in cloneCopyEvent. We must replace it with a fresh cloned tmplItem.
+				cloneTmplItem( tmplItem.key );
+				newTmplItems[tmplItem.key] = tmplItem;
+				pntNode = jQuery.data( el.parentNode, "tmplItem" );
+				pntNode = pntNode ? pntNode.key : 0;
+			}
+			if ( tmplItem ) {
+				pntItem = tmplItem;
+				// Find the template item of the parent element.
+				// (Using !=, not !==, since pntItem.key is number, and pntNode may be a string)
+				while ( pntItem && pntItem.key != pntNode ) {
+					// Add this element as a top-level node for this rendered template item, as well as for any
+					// ancestor items between this item and the item of its parent element
+					pntItem.nodes.push( el );
+					pntItem = pntItem.parent;
+				}
+				// Delete content built during rendering - reduce API surface area and memory use, and avoid exposing of stale data after rendering...
+				delete tmplItem._ctnt;
+				delete tmplItem._wrap;
+				// Store template item as jQuery data on the element
+				jQuery.data( el, "tmplItem", tmplItem );
+			}
+			function cloneTmplItem( key ) {
+				key = key + keySuffix;
+				tmplItem = newClonedItems[key] =
+					(newClonedItems[key] || newTmplItem( tmplItem, newTmplItems[tmplItem.parent.key + keySuffix] || tmplItem.parent ));
+			}
+		}
+	}
+
+	//---- Helper functions for template item ----
+
+	function tiCalls( content, tmpl, data, options ) {
+		if ( !content ) {
+			return stack.pop();
+		}
+		stack.push({ _: content, tmpl: tmpl, item:this, data: data, options: options });
+	}
+
+	function tiNest( tmpl, data, options ) {
+		// nested template, using {{tmpl}} tag
+		return jQuery.tmpl( jQuery.template( tmpl ), data, options, this );
+	}
+
+	function tiWrap( call, wrapped ) {
+		// nested template, using {{wrap}} tag
+		var options = call.options || {};
+		options.wrapped = wrapped;
+		// Apply the template, which may incorporate wrapped content,
+		return jQuery.tmpl( jQuery.template( call.tmpl ), call.data, options, call.item );
+	}
+
+	function tiHtml( filter, textOnly ) {
+		var wrapped = this._wrap;
+		return jQuery.map(
+			jQuery( jQuery.isArray( wrapped ) ? wrapped.join("") : wrapped ).filter( filter || "*" ),
+			function(e) {
+				return textOnly ?
+					e.innerText || e.textContent :
+					e.outerHTML || outerHtml(e);
+			});
+	}
+
+	function tiUpdate() {
+		var coll = this.nodes;
+		jQuery.tmpl( null, null, null, this).insertBefore( coll[0] );
+		jQuery( coll ).remove();
+	}
+})( jQuery );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * jQuery Mobile Framework : "controlbar" plugin
+ * Copyright (c) jQuery Project
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ * Authors: Jinhyuk Jun <jinhyuk.jun@samsung.com>
+*/
+
+/**
+ *  Controlbar can be created using data-role = "controlbar" inside footer 
+ *  Framework determine which controlbar will display with controlbar attribute
+ *
+ * Attributes:
+ *
+ *     data-style : determine which controlbar will use ( tabbar / toolbar )
+ *                    tabbar do not have back button, toolbar has back button 
+ *
+ * Examples:
+ *         
+ *     HTML markup for creating tabbar: ( 2 ~ 5 li item available )
+ *     icon can be changed data-icon attribute
+ *         <div data-role="footer"data-position ="fixed">
+ *              <div data-role="controlbar" data-style="tabbar" >
+ *                     <ul>
+ *                            <li><a href="#" data-icon="ctrlbar-menu" class="ui-btn-active">Menu</a></li>
+ *                            <li><a href="#" data-icon="ctrlbar-save" >Save</a></li>
+ *                            <li><a href="#" data-icon="ctrlbar-share" >Share</a></li>
+ *                     </ul>
+ *             </div>
+ *      </div>
+ *
+ *     HTML markup for creating toolbar: ( 2 ~ 5 li item available )
+ *     icon can be changed data-icon attribute
+ *         <div data-role="footer" data-position ="fixed">
+ *              <div data-role="controlbar" data-style="toolbar" >
+ *                     <ul>
+ *                            <li><a href="#" data-icon="ctrlbar-menu" class="ui-btn-active">Menu</a></li>
+ *                            <li><a href="#" data-icon="ctrlbar-save" >Save</a></li>
+ *                            <li><a href="#" data-icon="ctrlbar-share" >Share</a></li>
+ *                     </ul>
+ *             </div>
+ *      </div>
+*/
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.controlbar", $.mobile.widget, {
+		options: {
+			iconpos: "top",
+			grid: null,
+			initSelector: ":jqmData(role='controlbar')"
+		},
+
+		_create: function () {
+
+			var $controlbar = this.element,
+				$navbtns = $controlbar.find( "a" ),
+				iconpos = $navbtns.filter( ":jqmData(icon)" ).length ?
+										this.options.iconpos : undefined,
+				theme = $.mobile.listview.prototype.options.theme,	/* Get current theme */
+				style = $controlbar.attr( "data-style" );
+
+			if ( style === "left" || style === "right" ) {
+				$controlbar
+					.parents( ".ui-content" )
+					.css( 'padding', '0' );
+			} else {
+				$controlbar
+					.addClass( "ui-navbar" )
+					.attr( "role", "navigation" )
+					.find( "ul" )
+						.grid( { grid: this.options.grid } );
+			}
+
+			if ( !iconpos ) {
+				$controlbar.addClass( "ui-navbar-noicons" );
+			}
+
+			$navbtns.buttonMarkup({
+				corners:	false,
+				shadow:		false,
+				iconpos:	iconpos
+			});
+
+			$controlbar.delegate( "a", "vclick", function ( event ) {
+				$navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass );
+				$( this ).addClass( $.mobile.activeBtnClass );
+			});
+
+			if ( style === "tabbar" || style === "toolbar" ) {
+				$controlbar
+					.addClass( "ui-controlbar-" + theme )
+					.addClass( "ui-" + style + "-" + theme );
+			} else {
+				$controlbar
+					.addClass( "ui-controlbar-" + style )
+					.end();
+			}
+
+			$( document ).bind( "pagebeforeshow", function ( event, ui ) {
+				var footer_filter = $( event.target ).find( ":jqmData(role='footer')" ),
+					controlbar_filter = footer_filter.find( ":jqmData(role='controlbar')" ),
+					style = controlbar_filter.jqmData( "style" );
+
+				if ( style == "toolbar" || style == "tabbar" ) {
+					/* Need to add text only style */
+					if ( !(controlbar_filter.find(".ui-btn-inner").children().is(".ui-icon")) ) {
+						controlbar_filter.find( ".ui-btn-inner" ).addClass( "ui-navbar-textonly" );
+					} else {
+						if ( controlbar_filter.find( ".ui-btn-text" ).text() == "" ) {
+							controlbar_filter.find( ".ui-btn" ).addClass( "ui-ctrlbar-icononly" );
+						}
+					}
+					footer_filter
+						.css( "position", "fixed" )
+						.css( "height", controlbar_filter.height() )
+						.css( "top", window.innerHeight - footer_filter.height() );
+					if ( style == "toolbar" ) {
+						controlbar_filter
+							.css( "width", window.innerWidth - controlbar_filter.siblings(".ui-btn").width() );
+					}
+				}
+			});
+
+			$( document ).bind( "pageshow", function ( e, ui ) {
+				var controlbar_filter = $( ".ui-page" ).find( ":jqmData(role='footer')" ).eq( 0 ).find( ":jqmData(role='controlbar')" ),
+					element_count = controlbar_filter.find( 'li' ).length;
+
+				if ( controlbar_filter.find(".ui-btn-active").length == 0 ) {
+					controlbar_filter.find( "div" ).css( "left", "0px" );
+				} else {
+					controlbar_filter.find( "div" ).css( "left", controlbar_filter.find( ".ui-btn-active" ).parent( "li" ).index() * controlbar_filter.width() / element_count );
+				}
+
+				/* Increase Content size with dummy <div> because of footer height */
+				if ( controlbar_filter.length != 0 && $( ".ui-page-active" ).find( ".dummy-div" ).length == 0 && $( ".ui-page-active" ).find( ":jqmData(role='footer')" ).find( ":jqmData(role='controlbar')" ).length != 0 ) {
+					$( ".ui-page-active" ).find( ":jqmData(role='content')" ).append( '<div class="dummy-div"></div>' );
+					$( ".ui-page-active" ).find( ".dummy-div" )
+						.css( "width", controlbar_filter.width() )
+						.css( "height", controlbar_filter.height() );
+				}
+			});
+		},
+
+		_setDisabled: function ( value, cnt ) {
+			this.element.find( "li" ).eq( cnt ).attr( "disabled", value );
+			this.element.find( "li" ).eq( cnt ).attr( "aria-disabled", value );
+		},
+
+		disable: function ( cnt ) {
+			this._setDisabled( true, cnt );
+			this.element.find( "li" ).eq( cnt ).addClass( "ui-disabled" );
+		},
+
+		enable: function ( cnt ) {
+			this._setDisabled( false, cnt );
+			this.element.find( "li" ).eq( cnt ).removeClass( "ui-disabled" );
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.controlbar.prototype.options.initSelector, e.target ).controlbar();
+	});
+}( jQuery ) );
+/*global Globalize:false, range:false, regexp:false*/
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Salvatore Iovene <salvatore.iovene@intel.com>
+ *			Daehyon Jung <darrenh.jung@samsung.com>
+ */
+
+/**
+ * datetimepicker is a widget that lets the user select a date and/or a 
+ * time. If you'd prefer use as auto-initialization of form elements, 
+ * use input elements with type=date/time/datetime within form tag
+ * as same as other form elements.
+ * 
+ * HTML Attributes:
+ * 
+ *	data-role: 'datetimepicker'
+ *	data-format: date format string. e.g) "MMM dd yyyy, HH:mm"
+ *	type: 'date', 'datetime', 'time'
+ *	data-val: pre-set value. any date/time string Date.parse() accepts.
+ *
+ * Options:
+ *	type: 'date', 'datetime', 'time'
+ *	format: see data-format in HTML Attributes.
+ *	val: see data-val in HTML Attributes.
+ *
+ * APIs:
+ *	getValue()
+ *		: Get current selected date/time as W3C DTF style string.
+ *	update()
+ *		: Force to update fields.
+ *
+ * Events:
+ *	data-changed: Raised when date/time was changed.
+ *
+ * Examples:
+ *	<ul data-role="listview">
+ *		<li class="ui-li-3-2-2">
+ *			<span class="ui-li-text-main">
+ *				<input type="datetime" name="demo-date" id="demo-date" 
+ *					data-format="MMM dd yyyy hh:mm tt"/>
+ *			</span>
+ *			<span class="ui-li-text-sub">
+ *				Date/Time Picker - <span id="selected-date1"><em>(select a date first)</em></span>
+ *			</span>
+ *		</li>
+ *		<li class="ui-li-3-2-2">
+ *			<span class="ui-li-text-main">
+ *				<input type="date" name="demo-date2" id="demo-date2"/>
+ *			</span>
+ *			<span class="ui-li-text-sub">
+ *				Date Picker  - <span id="selected-date2"><em>(select a date first)</em></span>
+ *			</span>
+ *		</li>
+ *		<li class="ui-li-3-2-2">
+ *			<span class="ui-li-text-main">
+ *				<input type="time" name="demo-date3" id="demo-date3"/>
+ *			</span>
+ *			<span class="ui-li-text-sub">
+ *				Time Picker - <span id="selected-date3"><em>(select a date first)</em></span>
+ *			</span>
+ *		</li>
+ *	</ul>
+ * How to get a return value:
+ * ==========================
+ * Bind to the 'date-changed' event, e.g.:
+ *    $("#myDatetimepicker").bind("date-changed", function(e, date) {
+ *        alert("New date: " + date.toString());
+ *    });
+ */
+
+
+( function ( $, window, undefined ) {
+	$.widget( "tizen.datetimepicker", $.tizen.widgetex, {
+		options: {
+			type: 'datetime', // date, time, datetime applicable
+			format: null,
+			val: null,
+			initSelector: "input[type='date'], input[type='datetime'], input[type='time'], :jqmData(role='datetimepicker')"
+		},
+
+		_makeTwoDigits: function ( val ) {
+			var ret = val.toString(10);
+
+			if ( val < 10 ) {
+				ret = "0" + ret;
+			}
+			return ret;
+		},
+
+		/**
+		 * return W3C DTF string
+		 */
+		getValue: function () {
+			var data = [],
+				item,
+				greg,
+				obj = this,
+				toTimeString,
+				toDateString;
+
+			for ( item in this.data ) {
+				data[item] = this.data[item];
+			}
+
+			if ( this.calendar.convert ) {
+				greg = this.calendar.convert.toGregorian( data.year, data.month, data.day );
+				data.year = greg.getFullYear();
+				data.month = greg.getMonth();
+				data.day = greg.getDate();
+			}
+			obj = this;
+			toTimeString = function timeStr( t ) {
+				return obj._makeTwoDigits( t.hour ) + ':' +
+					obj._makeTwoDigits( t.min ) + ':' +
+					obj._makeTwoDigits( t.sec );
+			};
+
+			toDateString = function dateStr( d ) {
+				return ( ( d.year % 10000 ) + 10000 ).toString().substr(1) + '-' +
+					obj._makeTwoDigits( d.month ) + '-' +
+					obj._makeTwoDigits( d.day );
+			};
+
+			switch ( this.options.type ) {
+			case 'time':
+				return toTimeString( data );
+			case 'date':
+				return toDateString( data );
+			default:
+				return toDateString( data ) + 'T' + toTimeString( data );
+			}
+		},
+
+		_updateField: function ( target, value ) {
+			if ( !target || target.length == 0 ) {
+				return;
+			}
+
+			if ( value == 0 ) {
+				value = "0";
+			}
+
+			var pat = target.jqmData( 'pat' ),
+				hour;
+			switch ( pat ) {
+			case 'H':
+			case 'HH':
+			case 'h':
+			case 'hh':
+				hour = value;
+				if ( pat.charAt(0) == 'h' ) {
+					if ( hour > 12 ) {
+						hour -= 12;
+					} else if ( hour == 0 ) {
+						hour = 12;
+					}
+				}
+				if ( pat.length == 2 ) {
+					hour = this._makeTwoDigits( hour );
+				}
+				target.text( hour );
+				break;
+			case 'm':
+			case 'M':
+			case 'd':
+			case 's':
+				target.text( value );
+				break;
+			case 'mm':
+			case 'dd':
+			case 'MM':
+			case 'ss':
+				target.text( this._makeTwoDigits( value ) );
+				break;
+			case 'MMM':
+				target.text( this.calendar.months.namesAbbr[ value - 1] );
+				break;
+			case 'MMMM':
+				target.text( this.calendar.months.names[ value - 1 ] );
+				break;
+			case 'yy':
+				target.text( this._makeTwoDigits( value % 100 ) );
+				break;
+			case 'yyyy':
+				if ( value < 10 ) {
+					value = '000' + value;
+				} else if ( value < 100 ) {
+					value = '00' + value;
+				} else if ( value < 1000 ) {
+					value = '0' + value;
+				}
+				target.text( value );
+				break;
+			}
+
+		},
+
+		_format: function ( pattern ) {
+			var token = this._parsePattern( pattern ),
+				div = document.createElement('div'),
+				attr = [],
+				pat,
+				tpl,
+				ampm,
+				btn;
+
+			while ( token.length > 0 ) {
+				pat = token.shift();
+				tpl = '<span class="ui-datefield-%1" data-pat="' + pat + '">%2</span>';
+				switch ( pat ) {
+				case 'H': //0 1 2 3 ... 21 22 23
+				case 'HH': //00 01 02 ... 21 22 23
+				case 'h': //0 1 2 3 ... 11 12
+				case 'hh': //00 01 02 ... 11 12
+					$(div).append( tpl.replace('%1', 'hour') );
+					attr.hour = true;
+					break;
+				case 'mm': //00 01 ... 59
+				case 'm': //0 1 2 ... 59
+					$(div).append( tpl.replace('%1', 'min') );
+					attr.min = true;
+					break;
+				case 'ss':
+				case 's':
+					$(div).append( tpl.replace('%1', 'sec') );
+					attr.sec = true;
+					break;
+				case 'd': // day of month 5					
+				case 'dd': // day of month(leading zero) 05
+					$(div).append( tpl.replace('%1', 'day') );
+					attr.day = true;
+					break;
+				case 'M': // Month of year 9
+				case 'MM': // Month of year(leading zero) 09
+				case 'MMM':
+				case 'MMMM':
+					$(div).append( tpl.replace('%1', 'month') );
+					attr.month = true;
+					break;
+				case 'yy':	// year two digit
+				case 'yyyy': // year four digit
+					$(div).append( tpl.replace('%1', 'year') );
+					attr.year = true;
+					break;
+				case 't': //AM / PM indicator(first letter) A, P
+					// add button
+				case 'tt': //AM / PM indicator AM/PM
+					// add button
+					ampm = this.data.hour > 11 ?
+							this.calendar.PM[0] : this.calendar.AM[0];
+					btn = '<a href="#" class="ui-datefield-ampm"' +
+						' data-role="button" data-inline="true">' +
+						ampm + '</a>';
+					$(div).append( btn );
+					attr.ampm = true;
+					break;
+				case 'g':
+				case 'gg':
+					$(div).append( tpl.replace('%1', 'era').replace('%2', this.calendar.eras.name) );
+					break;
+				default : // string or any non-clickable object
+					$(div).append( tpl.replace('%1', 'seperator').replace('%2', pat) );
+					break;
+				}
+			}
+
+			return {
+				attr: attr,
+				html: div
+			};
+		},
+
+		_switchAmPm: function ( obj, owner ) {
+			if ( this.calendar.AM != null ) {
+				if ( this.calendar.AM[0] == $(owner).find('.ui-btn-text').text() ) { // AM to PM
+					this.data.hour += 12;
+					$(owner).find('.ui-btn-text').text( this.calendar.PM[0] );
+				} else {	// PM to AM
+					this.data.hour -= 12;
+					$(owner).find('.ui-btn-text').text( this.calendar.AM[0] );
+				}
+				obj.update();
+			}
+		},
+
+		update: function () {
+			if ( $(this.elem).is('input') ) {
+				this.options.val = this.getValue();
+				this.elem.value = this.options.val;
+			}
+			$(this.elem).trigger('date-changed', this.getValue() );
+		},
+
+		_parsePattern: function ( pattern ) {
+			var regex = /^(\/|\s|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|f|gg|g)|('[\w\W\s]*?')/,
+				token = [],
+				s;
+
+			while ( pattern.length > 0 ) {
+				s = regex.exec( pattern );
+				if ( s ) {
+					pattern = pattern.substr( s[0].length );
+					if ( s[0].charAt(0) == "'" ) {
+						s[0] = s[0].substr( 1, s[0].length - 2 );
+					}
+					token.push( s[0] );
+				} else {
+					token.push( pattern.charAt(0) );
+					pattern = pattern.substr(1);
+				}
+			}
+
+			return token;
+		},
+
+		_create: function () {
+			var input = this.element.get(0),
+				type = $(input).attr("type"),
+				isTime,
+				isDate,
+				val,
+				now,
+				data,
+				local,
+				obj = this,
+				$div;
+
+			if ( type ) {
+				obj.options.type = type;
+			}
+
+			isTime = type.indexOf("time") > -1;
+			isDate = type.indexOf("date") > -1;
+			$.extend( obj, {
+				elem: input,
+				time: isTime,
+				date: isDate,
+				calendar: window.Globalize.culture().calendars.standard,
+				data: {
+					"hour"	: 0,
+					"min"	: 0,
+					"sec"	: 0,
+					"year"	: 0,
+					"month"	: 0,
+					"day"	: 0
+				}
+
+			});
+
+			// init date&time
+			val = this.options.val;
+			if ( val ) {
+				now = new Date( Date.parse( val ) );
+			} else {
+				now = new Date();
+			}
+
+			data = obj.data;
+			if ( isDate ) {
+				if ( obj.calendar.convert ) {
+					local = obj.calendar.convert.fromGregorian( now );
+					data.year = local.year;
+					data.month = local.month + 1;
+					data.day = local.day;
+				} else {
+					data.year = now.getFullYear();
+					data.month = now.getMonth() + 1;
+					data.day = now.getDate();
+				}
+			}
+
+			if ( isTime ) {
+				data.hour = now.getHours();
+				data.min = now.getMinutes();
+				data.sec = now.getSeconds();
+			}
+
+			$(input).css('display', 'none');
+			$div = $(document.createElement('div'));
+			$div.addClass('ui-datefield');
+			$(input).after( $div );
+			this._initField( this.options.type, $div );
+			$div.trigger('create');
+
+			$div.bind('vclick', function ( e ) {
+				obj._showDataSelector( obj, this, e.target );
+			});
+
+			$div.find('.ui-datefield-ampm').bind( 'vclick', function ( e ) {
+				obj._switchAmPm( obj, this );
+			});
+		},
+
+		_populateDataSelector: function ( field, pat, obj ) {
+			var values,
+				numItems,
+				current,
+				data,
+				range = window.range,
+				local,
+				yearlb,
+				yearhb,
+				day;
+
+
+			switch ( field ) {
+			case 'hour':
+				if ( pat == 'H' ) {
+					// twentyfour
+					values = range( 0, 23 );
+					data = range( 0, 23 );
+					current = obj.data.hour;
+				} else {
+					values = range( 1, 12 );
+					current = obj.data.hour - 1;//11
+					if ( current >= 11 ) {
+						current = current - 12;
+						data = range( 13, 23 );
+						data.push( 12 ); // consider 12:00 am as 00:00
+					} else {
+						data = range( 1, 11 );
+						data.push( 0 );
+					}
+					if ( current < 0 ) {
+						current = 11; // 12:00 or 00:00
+					}
+				}
+				if ( pat.length == 2 ) {
+					// two digit
+					values = values.map( obj._makeTwoDigits );
+				}
+				numItems = values.length;
+				break;
+			case 'min':
+			case 'sec':
+				values = range( 0, 59 );
+				if ( pat.length == 2 ) {
+					values = values.map( obj._makeTwoDigits );
+				}
+				data = range( 0, 59 );
+				current = ( field == 'min' ? obj.data.min : obj.data.sec );
+				numItems = values.length;
+				break;
+			case 'year':
+				local = new Date( 1900, 0, 1 );
+				if ( obj.calendar.convert ) {
+					local = obj.calendar.convert.fromGregorian( local );
+					yearlb = local.year;
+					yearhb = yearlb + 200;
+				} else {
+					yearlb = local.getFullYear();
+					yearhb = yearlb + 200;
+				}
+				data = range( yearlb, yearhb );
+				current = obj.data.year - yearlb;
+				values = range( yearlb, yearhb );
+				numItems = values.length;
+				break;
+			case 'month':
+				switch ( pat.length ) {
+				case 1:
+					values = range( 1, 12 );
+					break;
+				case 2:
+					values = range( 1, 12 ).map( obj._makeTwoDigits );
+					break;
+				case 3:
+					values = obj.calendar.months.namesAbbr.slice();
+					break;
+				case 4:
+					values = obj.calendar.months.names.slice();
+					break;
+				}
+				if ( values.length == 13 ) { // @TODO Lunar calendar support
+					if ( values[12] == "" ) { // to remove lunar calendar reserved space
+						values.pop();
+					}
+				}
+				data = range( 1, values.length );
+				current = obj.data.month - 1;
+				numItems = values.length;
+				break;
+			case 'day':
+				//@TODO max number 31 -> depends on month
+				day = 31;
+				values = range( 1, day );
+				if ( pat.length == 2 ) {
+					values = values.map( obj._makeTwoDigits );
+				}
+				data = range( 1, day );
+				current = obj.data.day - 1;
+				numItems = day;
+				break;
+			}
+
+			return {
+				values: values,
+				data: data,
+				numItems: numItems,
+				current: current
+			};
+
+		},
+
+		_showDataSelector: function ( obj, ui, target ) {
+			target = $(target);
+
+			var attr = target.attr("class"),
+				field = attr.match(/ui-datefield-([\w]*)/),
+				pat,
+				data,
+				values,
+				numItems,
+				current,
+				valuesData,
+				item,
+				$li,
+				$item,
+				$ul,
+				$div,
+				$ctx;
+
+			if ( !attr ) {
+				return;
+			}
+			if ( !field ) {
+				return;
+			}
+
+			target.not('.ui-datefield-seperator').addClass('ui-datefield-selected');
+
+			pat = target.jqmData('pat');
+			data = obj._populateDataSelector( field[1], pat, obj );
+
+			values = data.values;
+			numItems = data.numItems;
+			current = data.current;
+			valuesData = data.data;
+
+			if ( values ) {
+				$ul = $(document.createElement('ul'));
+				for ( item in values ) {
+					$li = $(document.createElement('li'));
+					$item = $(document.createElement('a'));
+					$item.addClass('ui-link');
+					$item.text( values[item] );
+					$item.jqmData( "val", valuesData[item] );
+
+					$li.append( $item );
+					$ul.append( $li );
+
+					if ( current == item ) {
+						$li.addClass('current');
+					}
+				}
+
+				/* TODO NEED TO REFACTORING HERE */
+				$div = $(document.createElement('div'));
+				$div.append( $ul ).appendTo( ui );
+				$div.addClass('ui-datetimepicker-selector');
+				$div.attr( 'data-transition', 'none' );
+				$ctx = $div.ctxpopup();
+				$ctx.parents('.ui-popupwindow').addClass('ui-datetimepicker');
+				$div.circularview();
+				$div.circularview( 'centerTo', '.current' );
+				$ctx.popupwindow( 'open',
+						target.offset().left + target.width() / 2 - window.pageXOffset,
+						target.offset().top + target.height() - window.pageYOffset );
+				$div.bind('closed', function ( e ) {
+					$div.unbind( 'closed' );
+					$ul.unbind( 'vclick' );
+					$(obj).unbind( 'update' );
+					$(ui).find('.ui-datefield-selected').removeClass('ui-datefield-selected');
+					$ctx.popupwindow( 'destroy' );
+					$div.remove();
+				});
+
+				$(obj).bind( 'update', function ( e, val ) {
+					$ctx.popupwindow( 'close' );
+					var data = $(ui).find( '.' + field[0] );
+					obj._updateField( $(data), val );
+					obj.data[ field[1] ] = val;
+					obj.update();
+				});
+
+				$ul.bind( 'vclick', function ( e ) {
+					if ( $(e.target).is('a') ) {
+						$ul.find(".current").removeClass("current");
+						$(e.target).parent().addClass('current');
+						var val = $(e.target).jqmData("val");
+						$(obj).trigger( 'update', val ); // close popup, unselect field
+					}
+				});
+			}
+		},
+
+		_initField: function ( type, div ) {
+			var date,
+				time,
+				datetime,
+				updateFields = function ( obj, html, attr ) {
+					var item;
+					for ( item in attr ) {
+						if ( attr[item] ) {
+							obj._updateField( $(html).find( '.ui-datefield-' + item ),
+								obj.data[item] );
+						}
+					}
+				};
+
+			if ( this.options.format ) {
+				datetime = this._format( this.options.format );
+				updateFields( this, datetime.html, datetime.attr );
+				div.append( datetime.html );
+			} else {
+				if ( type.match( 'date' ) ) {
+					date = this._format( this.calendar.patterns.d );
+					$(date.html).addClass('date');
+					updateFields( this, date.html, date.attr );
+					div.append( date.html );
+				}
+
+				if ( type.match( 'datetime' ) ) {
+					div.append( '<span class="ui-datefield-tab"></span>' );
+				}
+
+				if ( type.match( 'time' ) ) {
+					time = this._format( this.calendar.patterns.t );
+					$(time.html).addClass('time');
+					updateFields( this, time.html, time.attr );
+					div.append( time.html );
+				}
+			}
+		}
+
+	});
+
+	$(document).bind("pagecreate create", function ( e ) {
+		$($.tizen.datetimepicker.prototype.options.initSelector, e.target)
+			.not(":jqmData(role='none'), :jqmData(role='nojs')")
+			.datetimepicker();
+	});
+
+} ( jQuery, this ) );
+/*
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL licenses
+ * http://phpjs.org/functions/range
+ * original by: Waldo Malqui Silva
+ * version: 1107.2516
+ */
+function range( low, high, step ) {
+    // Create an array containing the range of integers or characters
+    // from low to high (inclusive)  
+    // 
+    // version: 1107.2516
+    // discuss at: http://phpjs.org/functions/range
+    // +   original by: Waldo Malqui Silva
+    // *     example 1: range ( 0, 12 );
+    // *     returns 1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+    // *     example 2: range( 0, 100, 10 );
+    // *     returns 2: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
+    // *     example 3: range( 'a', 'i' );
+    // *     returns 3: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
+    // *     example 4: range( 'c', 'a' );
+    // *     returns 4: ['c', 'b', 'a']
+	var matrix = [],
+		inival,
+		endval,
+		plus,
+		walker = step || 1,
+		chars = false;
+
+    if (!isNaN(low) && !isNaN(high)) {
+        inival = low;
+        endval = high;
+    } else if (isNaN(low) && isNaN(high)) {
+        chars = true;
+        inival = low.charCodeAt(0);
+        endval = high.charCodeAt(0);
+    } else {
+        inival = (isNaN(low) ? 0 : low);
+        endval = (isNaN(high) ? 0 : high);
+    }
+
+    plus = ((inival > endval) ? false : true);
+    if (plus) {
+        while (inival <= endval) {
+            matrix.push(((chars) ? String.fromCharCode(inival) : inival));
+            inival += walker;
+        }
+    } else {
+        while (inival >= endval) {
+            matrix.push(((chars) ? String.fromCharCode(inival) : inival));
+            inival -= walker;
+        }
+    }
+
+    return matrix;
+}
+
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Rijubrata Bhaumik <rijubrata.bhaumik@intel.com>
+ *          Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Displays a day selector element: a control group with 7 check
+// boxes which can be toggled on and off.
+//
+// The widget can be invoked on fieldset element with
+// $(element).dayselector() or by creating a fieldset element with
+// data-role="dayselector". If you try to apply it to an element
+// of type other than fieldset, results will be unpredictable.
+//
+// The default is to display the controlgroup horizontally; you can
+// override this by setting data-type="vertical" on the fieldset,
+// or by passing a type option to the constructor. The data-type
+// attribute has precedence.
+//
+// If no ID is supplied for the dayselector, one will be generated
+// automatically.
+//
+// Methods:
+//
+//     value: Return the day numbers (0=Sunday, ..., 6=Saturday) of
+//            the selected checkboxes as an array.
+//
+//     selectAll: Select all 7 days of the week by automatically "ticking"
+//                all of the checkboxes.
+//
+// Options:
+//
+//     theme : Override the data-theme of the widget; note that the
+//             order of preference is: 1) set from data-theme attribute;
+//             2) set from option; 3) set from closest parent data-theme;
+//             4) default to 'c'
+//
+//     type: 'horizontal' (default) or 'vertical'; specifies the type
+//           of controlgroup to create around the day check boxes.
+//
+//     days: array of day names, Sunday first; defaults to English day
+//           names; the first letters are used as text for the checkboxes
+
+(function ( $, window, undefined ) {
+	$.widget( "tizen.dayselector", $.mobile.widget, {
+		options: {
+			initSelector: 'fieldset:jqmData(role="dayselector")',
+			theme: null,
+			type: 'horizontal',
+			days: ['Sunday',
+			       'Monday',
+			       'Tuesday',
+			       'Wednesday',
+			       'Thursday',
+			       'Friday',
+			       'Saturday']
+		},
+
+		defaultTheme: 'c',
+
+		_create: function () {
+			var days,
+				parentId,
+				i,
+				day,
+				letter,
+				id,
+				labelClass,
+				checkbox,
+				label;
+
+			this.element.addClass( 'ui-dayselector' );
+
+			this.options.type = this.element.jqmData( 'type' ) || this.options.type;
+
+			this.options.theme = this.element.jqmData( 'theme' ) ||
+									this.options.theme ||
+									this.element.closest( ':jqmData(theme)').jqmData('theme' ) ||
+									this.defaultTheme;
+
+			days = this.options.days;
+
+			this.element.attr( 'data-' + $.mobile.ns + 'type', this.options.type );
+
+			parentId = this.element.attr( 'id' ) ||
+							'dayselector' + ( new Date() ).getTime();
+
+			for ( i = 0; i < days.length; i++ ) {
+				day = days[i];
+				letter = day.slice(0, 1);
+
+				if ( window.Globalize ) {
+					//TODO may some modification required to support
+					//	start week day difference upon cultures.
+					letter = window.Globalize.culture().calendars.standard.days.namesShort[i];
+				}
+				id = parentId + '_' + i;
+				labelClass = 'ui-dayselector-label-' + i;
+
+				checkbox = $( '<input type="checkbox"/>' )
+							.attr( 'id', id )
+							.attr( 'value', i );
+
+				label = $( '<label>' + letter + '</label>' )
+						.attr( 'for', id )
+						.addClass( labelClass );
+
+				this.element.append( checkbox );
+				this.element.append( label );
+			}
+
+			this.checkboxes = this.element
+								.find( ':checkbox' )
+								.checkboxradio( { theme: this.options.theme } );
+
+			this.element.controlgroup( { excludeInvisible: false } );
+		},
+
+		_setOption: function ( key, value ) {
+			if ( key === "disabled" ) {
+				this._setDisabled( value );
+			}
+		},
+
+		_setDisabled: function ( value ) {
+			$.Widget.prototype._setOption.call(this, "disabled", value);
+			this.element[value ? "addClass" : "removeClass"]("ui-disabled");
+		},
+
+		value: function () {
+			var values = this.checkboxes.filter( ':checked' ).map( function () {
+				return this.value;
+			} ).get();
+
+			return values;
+		},
+
+		selectAll: function () {
+			this.checkboxes
+				.attr( 'checked', 'checked' )
+				.checkboxradio( 'refresh' );
+		}
+
+	} ); /* End of Widget */
+
+	// auto self-init widgets
+	$( document ).bind( "pagebeforecreate", function ( e ) {
+		var elts = $( $.tizen.dayselector.prototype.options.initSelector, e.target );
+		elts.not( ":jqmData(role='none'), :jqmData(role='nojs')" ).dayselector();
+	} );
+
+}( jQuery, this ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+/**
+ * Displays vertical multi-level list.
+ *
+ * To apply, add the attribute data-expandable="true" and id="parentid" to a <li> element for parent list item
+ * and add the arrribute data-expanded-by="parentid" to a <li> element for child list item.
+ *
+ * HTML Attributes:
+ *		data-expandable: Parent list item must have 'true' value for this attribute
+ *		data-expanded-by: Child list item expanded by parent list item must have 'true' value for this attribute
+ *		data-initial-expansion: If you want expandable list to be expanded initially, set this value as 'true'
+ *
+ * Example:
+ *     <li data-expandable="true" id="exp1" data-initial-expansion="true">Parent</li>
+ *     <li data-expanded-by="exp1">Child</li>
+ */
+
+( function ( $, undefined ) {
+
+	$.widget( "tizen.expandablelist", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(expandable='true')"
+		},
+
+		_hide: function ( e ) {
+			$( e ).removeClass( 'ui-li-expand-transition-show' )
+				.addClass( 'ui-li-expand-transition-hide' );
+		},
+		_show: function ( e ) {
+			$( e ).removeClass( 'ui-li-expand-transition-hide' )
+				.addClass( 'ui-li-expand-transition-show' );
+		},
+		_hide_expand_img: function ( e ) {
+			$( e ).removeClass( 'ui-li-expandable-hidden' )
+				.addClass( 'ui-li-expandable-shown' );
+
+			$( e ).find( ".ui-li-expand-icon" )
+				.addClass( "ui-li-expanded-icon" )
+				.removeClass( "ui-li-expand-icon" );
+		},
+		_show_expand_img: function ( e ) {
+			$( e ).removeClass( 'ui-li-expandable-shown' )
+				.addClass( 'ui-li-expandable-hidden' );
+
+			$( e ).find( ".ui-li-expanded-icon" )
+				.addClass( "ui-li-expand-icon" )
+				.removeClass( "ui-li-expanded-icon" );
+		},
+
+		_set_expand_arrow: function ( self, e, parent_is_expanded ) {
+			if ( parent_is_expanded ) {
+				self._hide_expand_img( e );
+			} else {
+				self._show_expand_img( e );
+			}
+			if ( $( e[0] ).data( "expandable" ) && parent_is_expanded == false ) {
+				var children = $( e ).nextAll( ":jqmData(expanded-by='" + $( e ).attr( 'id' ) + "')" );
+				children.each( function ( idx, child ) {
+					self._set_expand_arrow( self, child, e.is_expanded );
+				} );
+			}
+		},
+
+		_toggle: function ( self, e, parent_is_expanded ) {
+			if ( ! parent_is_expanded ) {
+				self._show( e );
+			} else {
+				self._hide( e );
+				if ( $( e ).data( "expandable" ) && e.is_expanded == true ) {
+					var children = $( e ).nextAll( ":jqmData(expanded-by='" + $( e ).attr( 'id' ) + "')" );
+					children.each( function ( idx, child ) {
+						self._toggle( self, child, e.is_expanded );
+					} );
+					e.is_expanded = false;
+				}
+			}
+		},
+		_is_hidden: function ( e ) {
+			return ( $( e ).height( ) == 0);
+		},
+
+		_create: function ( ) {
+
+			var children = $( this.element ).nextAll( ":jqmData(expanded-by='" + $( this.element ).attr( 'id' ) + "')" ),
+				e = this.element,
+				self = this,
+				expanded = e.nextAll( ":jqmData(expanded-by='" + e[0].id + "')" ),
+				initial_expansion = e.data( "initial-expansion" ),
+				is_expanded = false,
+				parent_id = null;
+
+			if ( children.length == 0 ) {
+				return;
+			}
+
+			if ( initial_expansion == true ) {
+				parent_id = e.data( "expanded-by" );
+				if ( parent_id ) {
+					if ( $( "#" + parent_id ).is_expanded == true) {
+						is_expanded = true;
+					}
+				} else {
+					is_expanded = true;
+				}
+			}
+
+			e[0].is_expanded = is_expanded;
+			if ( e[0].is_expanded ) {
+				self._hide_expand_img( e );
+				$(e).append( "<div class='ui-li-expanded-icon'></div>" );
+			} else {
+				self._show_expand_img( e );
+				$(e).append( "<div class='ui-li-expand-icon'></div>" );
+			}
+
+			if ( e[0].is_expanded ) {
+				expanded.each( function ( i, e ) { self._show( e ); } );
+			} else {
+				expanded.each( function ( i, e ) { self._hide( e ); } );
+			}
+
+			expanded.addClass( "ui-li-expanded" );
+
+			e.bind( 'vclick', function ( ) {
+				var _is_expanded = e[0].is_expanded;
+				expanded.each( function ( i, e ) { self._toggle( self, e, _is_expanded ); } );
+				e[0].is_expanded = ! e[0].is_expanded;
+
+				self._set_expand_arrow( self, e, e[0].is_expanded );
+			});
+		}
+
+
+	});	// end: $.widget()
+
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.expandablelist.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.expandablelist( );
+	});
+
+} ( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Wongi Lee <wongi11.lee@samsung.com>
+*/
+
+/**
+ *	Extendable List Widget for unlimited data.
+ *	To support more then 1,000 items, special list widget developed.
+ *	Fast initialize and append some element into the DOM tree repeatedly.
+ *	DB connection and works like DB cursor.
+ *
+ * HTML Attributes:
+ *
+ *		data-role:	extendablelist
+ *		data-template : jQuery.template ID that populate into extendable list. A button : a <DIV> element with "data-role : button" should be included on data-template.
+ *		data-dbtable : DB Table name. It used as window[DB NAME]. Loaded data should be converted as window object.
+ *		data-extenditems : Number of elements to extend at once.
+ *		
+ *		ID : <UL> element that has "data-role=extendablelist" must have ID attribute.
+ *		Class : <UL> element that has "data-role=extendablelist" should have "vlLoadSuccess" class to guaranty DB loading is completed.
+ *		tmp_load_more : Template ID for "load more" message and button.
+ *
+ *
+ *APIs:
+ *
+ *		create ( void )
+ *			: API to call _create method. API for AJAX or DB loading callback.
+ *
+ *		recreate ( Array )
+ *			: Update extendable list with new data array. For example, update with search result.
+ *
+ *Examples:
+ *
+ *		<script id="tmp-3-1-1" type="text/x-jquery-tmpl">
+ *			<li class="ui-li-3-1-1"><span class="ui-li-text-main">${NAME}</span></li>
+ *		</script>
+ *
+ *		<script id="tmp_load_more" type="text/x-jquery-tmpl"> 
+ *			<li class="ui-li-3-1-1" style="text-align:center; margin:0 auto">
+ *				<div data-role="button">Load ${NUM_MORE_ITEMS} more items</div>
+ *			</li>
+ *		</script>
+ *	
+ *		<ul id = "extendable_list_main" data-role="extendablelist" data-extenditems="50" data-template="tmp-3-1-1" data-dbtable="JSON_DATA">
+ *		</ul>
+ *
+ */
+
+
+( function ( $, undefined ) {
+
+	//Keeps track of the number of lists per page UID
+	//This allows support for multiple nested list in the same page
+	//https://github.com/jquery/jquery-mobile/issues/1617
+	var listCountPerPage = {},
+		TOTAL_ITEMS = 0,
+		last_index = 0;
+
+	$.widget( "tizen.extendablelist", $.mobile.widget, {
+		options: {
+			theme: "s",
+			countTheme: "c",
+			headerTheme: "b",
+			dividerTheme: "b",
+			splitIcon: "arrow-r",
+			splitTheme: "b",
+			inset: false,
+			id:	"",						/* Extendable list UL elemet's ID */
+			extenditems: 50,			/* Number of append items */
+			childSelector: " li",		/* To support swipe list */
+			dbtable: "",
+			template : "",				/* Template for each list item */
+			loadmore : "tmp_load_more",	/* Template for "Load more" message */
+			scrollview: false,
+			initSelector: ":jqmData(role='extendablelist')"
+		},
+
+		_stylerMouseUp: function () {
+			$( this ).addClass( "ui-btn-up-s" );
+			$( this ).removeClass( "ui-btn-down-s" );
+		},
+
+		_stylerMouseDown: function () {
+			$( this ).addClass( "ui-btn-down-s" );
+			$( this ).removeClass( "ui-btn-up-s" );
+		},
+
+		_stylerMouseOver: function () {
+			$( this ).toggleClass( "ui-btn-hover-s" );
+		},
+
+		_stylerMouseOut: function () {
+			$( this ).toggleClass( "ui-btn-hover-s" );
+		},
+
+		_pushData: function ( template, data ) {
+			var o = this.options,
+				i = 0,
+				dataTable = data,
+				myTemplate = $( "#" + template ),
+				loadMoreItems = ( o.extenditems > data.length - last_index ? data.length - last_index : o.extenditems ),
+				htmlData;
+
+			for (i = 0; i < loadMoreItems; i++ ) {
+				htmlData = myTemplate.tmpl( dataTable[ i ] );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + i ) );
+				last_index++;
+			}
+
+			/* After push data, re-style extendable list widget */
+			$( o.id ).trigger( "create" );
+		},
+
+		_loadmore: function ( event ) {
+			var t = this,
+				o = event.data,
+				i = 0,
+				dataTable = window[ o.dbtable ],
+				myTemplate = $( "#" + o.template ),
+				loadMoreItems = ( o.extenditems > dataTable.length - last_index ? dataTable.length - last_index : o.extenditems ),
+				htmlData,
+				more_items_to_load,
+				num_next_load_items;
+
+			/* Remove load more message */
+			$( "#load_more_message" ).remove();
+
+			/* Append More Items */
+			for ( i = 0; i < loadMoreItems; i++ ) {
+				htmlData = myTemplate.tmpl( dataTable[ last_index ] );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + last_index ) );
+				last_index++;
+			}
+
+			/* Append "Load more" message on the last of list */
+			if ( TOTAL_ITEMS > last_index ) {
+				myTemplate = $( "#" + o.loadmore );
+				more_items_to_load = TOTAL_ITEMS - last_index;
+				num_next_load_items = ( o.extenditems <= more_items_to_load ) ? o.extenditems : more_items_to_load;
+				htmlData = myTemplate.tmpl( { NUM_MORE_ITEMS : num_next_load_items } );
+
+				$( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ) );
+			}
+
+			$( o.id ).trigger( "create" );
+			$( o.id ).extendablelist( "refresh" );
+		},
+
+		recreate: function ( newArray ) {
+			var t = this,
+				o = this.options;
+
+			$( o.id ).empty();
+
+			TOTAL_ITEMS = newArray.length;
+
+			t._pushData( ( o.template), newArray );
+
+			if ( o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			$( o.id ).extendablelist();
+
+			t.refresh( true );
+		},
+
+		_initList: function () {
+			var t = this,
+				o = this.options,
+				myTemplate,
+				more_items_to_load,
+				num_next_load_items,
+				htmlData;
+
+			/* After AJAX loading success */
+			o.dbtable = t.element.data( "dbtable" );
+
+			TOTAL_ITEMS = $( window[ o.dbtable ] ).size();
+
+			/* Make Gen list by template */
+			if ( last_index <= 0 ) {
+				t._pushData( ( o.template ), window[ o.dbtable ] );
+
+				/* Append "Load more" message on the last of list */
+				if ( TOTAL_ITEMS > last_index ) {
+					myTemplate = $( "#" + o.loadmore );
+					more_items_to_load = TOTAL_ITEMS - last_index;
+					num_next_load_items = ( o.extenditems <= more_items_to_load) ? o.extenditems : more_items_to_load;
+					htmlData = myTemplate.tmpl( { NUM_MORE_ITEMS : num_next_load_items } );
+
+					$( o.id ).append( $( htmlData ).attr( 'id', "load_more_message" ) );
+
+					$( "#load_more_message" ).live( "click", t.options, t._loadmore );
+				} else {
+					/* No more items to load */
+					$( "#load_more_message" ).die();
+					$( "#load_more_message" ).remove();
+				}
+			}
+
+			if ( o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			$( o.id ).trigger( "create" );
+
+			t.refresh( true );
+		},
+
+		create: function () {
+			var o = this.options;
+
+			/* external API for AJAX callback */
+			this._create( "create" );
+		},
+
+		_create: function ( event ) {
+			var t = this,
+				o = this.options,
+				$el = this.element;
+
+			// create listview markup
+			t.element.addClass( function ( i, orig ) {
+				return orig + " ui-listview ui-extendable-list-container" + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
+			});
+
+			o.id = "#" + $el.attr( "id" );
+
+			if ( $el.data( "extenditems" ) ) {
+				o.extenditems = parseInt( $el.data( "extenditems" ), 10 );
+			}
+
+			$( o.id ).bind( "pagehide", function (e) {
+				$( o.id ).empty();
+			});
+
+			/* Scroll view */
+			if ( $( ".ui-scrollview-clip" ).size() > 0) {
+				o.scrollview = true;
+			} else {
+				o.scrollview = false;
+			}
+
+			/* After DB Load complete, Init Extendable list */
+			if ( $( o.id ).hasClass( "elLoadSuccess" ) ) {
+				if ( !$( o.id ).hasClass( "elInitComplete" ) ) {
+					if ( $el.data( "template" ) ) {
+						o.template = $el.data( "template" );
+
+						/* to support swipe list, <li> or <ul> can be main node of extendable list. */
+						if ( $el.data( "swipelist" ) == true ) {
+							o.childSelector = " ul";
+						} else {
+							o.shildSelector = " li";
+						}
+					}
+
+					$( o.id ).addClass( "elInitComplete" );
+				}
+
+				t._initList();
+			}
+		},
+
+		destroy : function () {
+			var o = this.options;
+
+			$( o.id ).empty();
+
+			TOTAL_ITEMS = 0;
+			last_index = 0;
+
+			$( "#load_more_message" ).die();
+		},
+
+		_itemApply: function ( $list, item ) {
+			var $countli = item.find( ".ui-li-count" );
+
+			if ( $countli.length ) {
+				item.addClass( "ui-li-has-count" );
+			}
+
+			$countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" );
+
+			// TODO class has to be defined in markup
+			item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end()
+				.find( "p, dl" ).addClass( "ui-li-desc" ).end()
+				.find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each(function () {
+					item.addClass( $( this ).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+				}).end()
+				.find( ".ui-li-aside" ).each(function () {
+					var $this = $( this );
+					$this.prependTo( $this.parent() ); //shift aside to front for css float
+				});
+		},
+
+		_removeCorners: function ( li, which ) {
+			var top = "ui-corner-top ui-corner-tr ui-corner-tl",
+				bot = "ui-corner-bottom ui-corner-br ui-corner-bl";
+
+			li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) );
+
+			if ( which === "top" ) {
+				li.removeClass( top );
+			} else if ( which === "bottom" ) {
+				li.removeClass( bot );
+			} else {
+				li.removeClass( top + " " + bot );
+			}
+		},
+
+		_refreshCorners: function ( create ) {
+			var $li,
+				$visibleli,
+				$topli,
+				$bottomli;
+
+			if ( this.options.inset ) {
+				$li = this.element.children( "li" );
+				// at create time the li are not visible yet so we need to rely on .ui-screen-hidden
+				$visibleli = create ? $li.not( ".ui-screen-hidden" ) : $li.filter( ":visible" );
+
+				this._removeCorners( $li );
+
+				// Select the first visible li element
+				$topli = $visibleli.first()
+					.addClass( "ui-corner-top" );
+
+				$topli.add( $topli.find( ".ui-btn-inner" ) )
+					.find( ".ui-li-link-alt" )
+						.addClass( "ui-corner-tr" )
+					.end()
+					.find( ".ui-li-thumb" )
+						.not( ".ui-li-icon" )
+						.addClass( "ui-corner-tl" );
+
+				// Select the last visible li element
+				$bottomli = $visibleli.last()
+					.addClass( "ui-corner-bottom" );
+
+				$bottomli.add( $bottomli.find( ".ui-btn-inner" ) )
+					.find( ".ui-li-link-alt" )
+						.addClass( "ui-corner-br" )
+					.end()
+					.find( ".ui-li-thumb" )
+						.not( ".ui-li-icon" )
+						.addClass( "ui-corner-bl" );
+			}
+		},
+
+		refresh: function ( create ) {
+			this.parentPage = this.element.closest( ".ui-page" );
+			this._createSubPages();
+
+			var o = this.options,
+				$list = this.element,
+				self = this,
+				dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,
+				listsplittheme = $list.jqmData( "splittheme" ),
+				listspliticon = $list.jqmData( "spliticon" ),
+				li = $list.children( "li" ),
+				counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,
+				item,
+				itemClass,
+				itemTheme,
+				a,
+				last,
+				splittheme,
+				countParent,
+				icon,
+				pos,
+				numli;
+
+			if ( counter ) {
+				$list.find( ".ui-li-dec" ).remove();
+			}
+
+			for ( pos = 0, numli = li.length; pos < numli; pos++ ) {
+				item = li.eq( pos );
+				itemClass = "ui-li";
+
+				// If we're creating the element, we update it regardless
+				if ( create || !item.hasClass( "ui-li" ) ) {
+					itemTheme = item.jqmData( "theme" ) || o.theme;
+					a = item.children( "a" );
+
+					if ( a.length ) {
+						icon = item.jqmData( "icon" );
+
+						item.buttonMarkup({
+							wrapperEls: "div",
+							shadow: false,
+							corners: false,
+							iconpos: "right",
+							/* icon: a.length > 1 || icon === false ? false : icon || "arrow-r",*/
+							icon: false,	/* Remove unnecessary arrow icon */
+							theme: itemTheme
+						});
+
+						if ( ( icon != false ) && ( a.length == 1 ) ) {
+							item.addClass( "ui-li-has-arrow" );
+						}
+
+						a.first().addClass( "ui-link-inherit" );
+
+						if ( a.length > 1 ) {
+							itemClass += " ui-li-has-alt";
+
+							last = a.last();
+							splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;
+
+							last.appendTo(item)
+								.attr( "title", last.getEncodedText() )
+								.addClass( "ui-li-link-alt" )
+								.empty()
+								.buttonMarkup({
+									shadow: false,
+									corners: false,
+									theme: itemTheme,
+									icon: false,
+									iconpos: false
+								})
+								.find( ".ui-btn-inner" )
+								.append(
+									$( "<span />" ).buttonMarkup( {
+										shadow : true,
+										corners : true,
+										theme : splittheme,
+										iconpos : "notext",
+										icon : listspliticon || last.jqmData( "icon" ) || o.splitIcon
+									})
+								);
+						}
+					} else if ( item.jqmData( "role" ) === "list-divider" ) {
+
+						itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;
+						item.attr( "role", "heading" );
+
+						//reset counter when a divider heading is encountered
+						if ( counter ) {
+							counter = 1;
+						}
+
+					} else {
+						itemClass += " ui-li-static ui-body-" + itemTheme;
+					}
+				}
+
+				if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+					countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );
+
+					countParent.addClass( "ui-li-jsnumbering" )
+						.prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );
+				}
+
+				item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass );
+
+				self._itemApply( $list, item );
+			}
+
+			this._refreshCorners( create );
+		},
+
+		//create a string for ID/subpage url creation
+		_idStringEscape: function ( str ) {
+			return str.replace(/\W/g , "-");
+
+		},
+
+		_createSubPages: function () {
+			var parentList = this.element,
+				parentPage = parentList.closest( ".ui-page" ),
+				parentUrl = parentPage.jqmData( "url" ),
+				parentId = parentUrl || parentPage[ 0 ][ $.expando ],
+				parentListId = parentList.attr( "id" ),
+				o = this.options,
+				dns = "data-" + $.mobile.ns,
+				self = this,
+				persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),
+				hasSubPages,
+				newRemove;
+
+			if ( typeof listCountPerPage[ parentId ] === "undefined" ) {
+				listCountPerPage[ parentId ] = -1;
+			}
+
+			parentListId = parentListId || ++listCountPerPage[ parentId ];
+
+			$( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function ( i ) {
+				var self = this,
+					list = $( this ),
+					listId = list.attr( "id" ) || parentListId + "-" + i,
+					parent = list.parent(),
+					nodeEls,
+					title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text
+					id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,
+					theme = list.jqmData( "theme" ) || o.theme,
+					countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,
+					newPage,
+					anchor;
+
+				nodeEls = $( list.prevAll().toArray().reverse() );
+				nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim(parent.contents()[ 0 ].nodeValue) + "</span>" );
+
+				//define hasSubPages for use in later removal
+				hasSubPages = true;
+
+				newPage = list.detach()
+							.wrap( "<div " + dns + "role='page' " +	dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )
+							.parent()
+								.before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )
+								.after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='" + persistentFooterID + "'>" ) : "" )
+								.parent()
+									.appendTo( $.mobile.pageContainer );
+
+				newPage.page();
+
+				anchor = parent.find('a:first');
+
+				if ( !anchor.length ) {
+					anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );
+				}
+
+				anchor.attr( "href", "#" + id );
+
+			}).extendablelist();
+
+			// on pagehide, remove any nested pages along with the parent page, as long as they aren't active
+			// and aren't embedded
+			if ( hasSubPages &&
+					parentPage.is( ":jqmData(external-page='true')" ) &&
+					parentPage.data( "page" ).options.domCache === false ) {
+
+				newRemove = function ( e, ui ) {
+					var nextPage = ui.nextPage, npURL;
+
+					if ( ui.nextPage ) {
+						npURL = nextPage.jqmData( "url" );
+						if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {
+							self.childPages().remove();
+							parentPage.remove();
+						}
+					}
+				};
+
+				// unbind the original page remove and replace with our specialized version
+				parentPage
+					.unbind( "pagehide.remove" )
+					.bind( "pagehide.remove", newRemove);
+			}
+		},
+
+		// TODO sort out a better way to track sub pages of the extendable listview this is brittle
+		childPages: function () {
+			var parentUrl = this.parentPage.jqmData( "url" );
+
+			return $( ":jqmData(url^='" +  parentUrl + "&" + $.mobile.subPageUrlKey + "')" );
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.extendablelist.prototype.options.initSelector, e.target ).extendablelist();
+	});
+
+}( jQuery ));
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Wonseop Kim ( wonseop.kim@samsung.com )
+*/
+
+/**
+ * 'Handler' is widget that is working in conjunction with 'scrollview'.
+ * 'Handler' is supporting 'scroll event( up/down )' and is indicating scroll
+ * position.
+ *
+ * HTML Attributes:
+ *
+ *		data-handler : This attribute is indicating that whether enable.
+ *						If you want to use, you will set 'true'.
+ *		data-handlertheme : Set the widget theme ( optional )
+ *
+ * APIs:
+ *
+ *		enableHandler ( void )
+ *			: Get a status that whether enable.
+ *		enableHandler ( boolean )
+ *			: Set a status that whether enable.
+ *
+ * Events:
+ *
+ * Examples:
+ *
+ *		<div data-role="content" data-scroll="y" data-handler="true">
+ *			<ul data-role="listview">
+ *				<li data-role="list-divider">A</li>
+ *				<li><a href="../../docs/lists/index.html">Adam Kinkaid</a></li>
+ *				<li><a href="../../docs/lists/index.html">Alex Wickerham</a></li>
+ *				<li><a href="../../docs/lists/index.html">Avery Johnson</a></li>
+ *			</ul>
+ *		</div>
+ */
+
+( function ( $, document, undefined ) {
+	// The options of handler in scrollview
+	$.tizen.scrollview.prototype.options.handler = false;
+	$.tizen.scrollview.prototype.options.handlerTheme = "s";
+
+	$.extend( $.tizen.scrollview.prototype, {
+		enableHandler : function ( enabled ) {
+			if ( typeof enabled === 'undefined' ) {
+				return this.options.handler;
+			}
+
+			this.options.handler = !!enabled;
+
+			var view = this.element;
+			if ( this.options.handler ) {
+				view.find( ".ui-scrollbar" ).hide();
+				view.find( ".ui-handler" ).show();
+			} else {
+				view.find( ".ui-handler" ).hide();
+				view.find( ".ui-scrollbar" ).show();
+			}
+		},
+		_handlerTimer : 0
+	});
+
+	$( document ).delegate( ":jqmData(scroll)", "scrollviewcreate", function () {
+		if ( $( this ).attr( "data-" + $.mobile.ns + "scroll" ) === "none" ) {
+			return;
+		}
+
+		var self = this,
+			$this = $( this ),
+			scrollview = $this.data( "scrollview" ),
+			prefix = "<div class=\"ui-handler ui-handler-",
+			suffix = "\"><div class=\"ui-handler-track\"><div class=\"ui-handler-thumb\"></div></div></div>",
+			direction = scrollview.options.direction,
+			isHorizontal = ( scrollview.options.direction === "x" ),
+			_$view = scrollview._$view,
+			_$clip = scrollview._$clip,
+			handler = null,
+			handlerThumb = null,
+			viewLength = 0,
+			clipLength = 0,
+			handlerHeight = 0,
+			handlerMargin = 0,
+			trackLength = 0,
+			isTouchable = $.support.touch,
+			dragStartEvt = ( isTouchable ? "touchstart" : "mousedown" ) + ".handler",
+			dragMoveEvtDefault = ( isTouchable ? "touchmove" : "mousemove" ),
+			dragMoveEvt = dragMoveEvtDefault + ".handler",
+			dragStopEvt = ( isTouchable ? "touchend" : "mouseup" ) + ".handler";
+
+		if ( $this.find( ".ui-handler-thumb" ).length !== 0 || typeof direction !== "string" ) {
+			return;
+		}
+
+		$this.append( prefix + direction + suffix );
+		handler = $this.find( ".ui-handler" );
+		handlerThumb = $this.find( ".ui-handler-thumb" ).hide();
+		handlerHeight = ( isHorizontal ? handlerThumb.width() : handlerThumb.height() );
+		handlerMargin = ( isHorizontal ? parseInt( handler.css( "right" ), 10 ) : parseInt( handler.css( "bottom" ), 10 ) );
+
+		scrollview.enableHandler( scrollview.options.handler );
+
+		$.extend( self, {
+			moveData : null
+		});
+
+		// handler drag
+		handlerThumb.bind( dragStartEvt, {
+			e : handlerThumb
+		}, function ( event ) {
+			scrollview._stopMScroll();
+
+			var target = event.data.e, t = ( isTouchable ? event.originalEvent.targetTouches[0] : event );
+
+			self.moveData = {
+				target : target,
+				X : parseInt( target.css( 'left' ), 10 ) || 0,
+				Y : parseInt( target.css( 'top' ), 10 ) || 0,
+				pX : t.pageX,
+				pY : t.pageY
+			};
+			clipLength = ( isHorizontal ? _$clip.width() : _$clip.height() );
+			viewLength = ( isHorizontal ? _$view.outerWidth( true ) : _$view.outerHeight( true ) ) - clipLength;
+			trackLength = clipLength - handlerHeight - handlerMargin;
+
+			_$view.trigger( "scrollstart" );
+			event.preventDefault();
+			event.stopPropagation();
+
+			$( document ).bind( dragMoveEvt, function ( event ) {
+				var moveData = self.moveData,
+					handlePos = 0,
+					scrollPos = 0,
+					t = ( isTouchable ? event.originalEvent.targetTouches[0] : event );
+
+				handlePos = ( isHorizontal ? moveData.X + t.pageX - moveData.pX : moveData.Y + t.pageY - moveData.pY );
+
+				if ( handlePos < 0 ) {
+					handlePos = 0;
+				}
+
+				if ( handlePos > trackLength ) {
+					handlePos = trackLength;
+				}
+				scrollPos = - Math.round( handlePos / trackLength * viewLength );
+
+				$this.attr( "display", "none" );
+				if ( isHorizontal ) {
+					scrollview._setScrollPosition( scrollPos, 0 );
+					moveData.target.css( {
+						left : handlePos
+					});
+				} else {
+					scrollview._setScrollPosition( 0, scrollPos );
+					moveData.target.css( {
+						top : handlePos
+					});
+				}
+				$this.attr( "display", "inline" );
+
+				event.preventDefault();
+				event.stopPropagation();
+			}).bind( dragStopEvt, function ( event ) {
+				$( document ).unbind( dragMoveEvt ).unbind( dragStopEvt );
+
+				self.moveData = null;
+				_$view.trigger( "scrollstop" );
+
+				event.preventDefault();
+			});
+		});
+
+		$( document ).bind( dragMoveEvtDefault, function ( event ) {
+			var isVisible = false,
+				vclass = "ui-scrollbar-visible";
+
+			if ( scrollview._$vScrollBar ) {
+				isVisible = scrollview._$vScrollBar.hasClass( vclass );
+			} else if ( scrollview._$hScrollBar ) {
+				isVisible = scrollview._$hScrollBar.hasClass( vclass );
+			}
+
+			if ( isVisible || self.moveData !== null ) {
+				if ( handlerThumb.hasClass( "ui-handler-visible" ) ) {
+					_$view.trigger( "scrollupdate" );
+				} else {
+					_$view.trigger( "scrollstart" );
+				}
+			}
+		});
+
+		$this.bind( "scrollstart", function ( event ) {
+			if ( !scrollview.enableHandler() ) {
+				return;
+			}
+			clipLength = ( isHorizontal ? _$clip.width() : _$clip.height() );
+			viewLength = ( isHorizontal ? _$view.outerWidth( true ) : _$view.outerHeight( true ) ) - clipLength;
+			trackLength = clipLength - handlerHeight - handlerMargin;
+
+			if ( clipLength > viewLength || trackLength < ( handlerHeight * 4 / 3 ) ) {
+				return;
+			}
+
+			handlerThumb.addClass( "ui-handler-visible" );
+			handlerThumb.stop().fadeIn( 'fast' );
+
+			event.preventDefault();
+			event.stopPropagation();
+		}).bind( "scrollupdate", function ( event, data ) {
+			if ( !scrollview.enableHandler() || clipLength > viewLength || trackLength < ( handlerHeight * 4 / 3 ) ) {
+				return;
+			}
+
+			var scrollPos = scrollview.getScrollPosition(), handlerPos = 0;
+
+			handlerThumb.stop( true, true ).hide().css( "opacity", 1.0 );
+
+			if ( isHorizontal ) {
+				handlerPos = Math.round( scrollPos.x / viewLength * trackLength );
+				handlerThumb.css( "left", handlerPos );
+			} else {
+				handlerPos = Math.round( scrollPos.y / viewLength * trackLength );
+				handlerThumb.css( "top", handlerPos );
+			}
+
+			handlerThumb.show();
+
+			event.preventDefault();
+			event.stopPropagation();
+		}).bind( "scrollstop", function ( event ) {
+			if ( !scrollview.enableHandler() || clipLength > viewLength ) {
+				return;
+			}
+
+			scrollview._handlerTimer = setTimeout( function () {
+				if ( scrollview._timerID === 0 && self.moveData === null ) {
+					handlerThumb.removeClass( "ui-handler-visible" );
+					handlerThumb.stop( true, true ).fadeOut( 'fast' );
+					clearTimeout( scrollview._handlerTimer );
+					scrollview._handlerTimer = 0;
+				}
+			}, 1000 );
+
+			event.preventDefault();
+		});
+	});
+} ( jQuery, document ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays three sliders that allow the user to select the
+// hue, saturation, and value for a color.
+//
+// To apply, add the attribute data-role="hsvpicker" to a <div>
+// element inside a page. Alternatively, call hsvpicker() 
+// on an element (see below).
+//
+// Options:
+//
+//     color: String; the initial color can be specified in html using the
+//            data-color="#ff00ff" attribute or when constructed
+//            in javascript, eg
+//                $( "#myhsvpicker" ).hsvpicker({ color: "#ff00ff" });
+//            where the html might be :
+//                <div id="myhsvpicker"></div>
+//            The color can be changed post-construction like this :
+//                $( "#myhsvpicker" ).hsvpicker( "option", "color", "#ABCDEF" );
+//            Default: "#1a8039"
+//
+// Events:
+//
+//     colorchanged: Fired when the color is changed.
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.hsvpicker", $.tizen.colorwidget, {
+		options: {
+			initSelector: ":jqmData(role='hsvpicker')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='hsvpicker' class='ui-hsvpicker'>" +
+  "    <div class='hsvpicker-clrchannel-container jquery-mobile-ui-widget'>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='hue' data-location='left' data-inline='true' data-icon='reveal-left'></a>" +
+  "        </div>" +
+  "        <div class='hsvpicker-clrchannel-masks-container'>" +
+  "            <div class='hsvpicker-clrchannel-mask hsvpicker-clrchannel-mask-white'></div>" +
+  "            <div id='hsvpicker-hue-hue' class='hsvpicker-clrchannel-mask jquery-todons-colorwidget-clrlib-hue-gradient'></div>" +
+  "            <div id='hsvpicker-hue-mask-val' class='hsvpicker-clrchannel-mask hsvpicker-clrchannel-mask-black' data-event-source='hue'></div>" +
+  "            <div id='hsvpicker-hue-selector' class='hsvpicker-clrchannel-selector ui-corner-all'></div>" +
+  "        </div>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='hue' data-location='right' data-inline='true' data-icon='reveal'></a>" +
+  "        </div>" +
+  "    </div>" +
+  "    <div class='hsvpicker-clrchannel-container jquery-mobile-ui-widget'>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='sat' data-location='left' data-inline='true' data-icon='reveal-left'></a>" +
+  "        </div>" +
+  "        <div class='hsvpicker-clrchannel-masks-container'>" +
+  "            <div id='hsvpicker-sat-hue' class='hsvpicker-clrchannel-mask'></div>" +
+  "            <div id='hsvpicker-sat-gradient' class='hsvpicker-clrchannel-mask  sat-gradient'></div>" +
+  "            <div id='hsvpicker-sat-mask-val' class='hsvpicker-clrchannel-mask hsvpicker-clrchannel-mask-black' data-event-source='sat'></div>" +
+  "            <div id='hsvpicker-sat-selector' class='hsvpicker-clrchannel-selector ui-corner-all'></div>" +
+  "        </div>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='sat' data-location='right' data-inline='true' data-icon='reveal'></a>" +
+  "        </div>" +
+  "    </div>" +
+  "    <div class='hsvpicker-clrchannel-container jquery-mobile-ui-widget'>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='val' data-location='left' data-inline='true' data-icon='reveal-left'></a>" +
+  "        </div>" +
+  "        <div class='hsvpicker-clrchannel-masks-container'>" +
+  "            <div class='hsvpicker-clrchannel-mask hsvpicker-clrchannel-mask-white'></div>" +
+  "            <div id='hsvpicker-val-hue' class='hsvpicker-clrchannel-mask'></div>" +
+  "            <div id='hsvpicker-val-gradient' class='hsvpicker-clrchannel-mask val-gradient' data-event-source='val'></div>" +
+  "            <div id='hsvpicker-val-selector' class='hsvpicker-clrchannel-selector ui-corner-all'></div>" +
+  "        </div>" +
+  "        <div class='hsvpicker-arrow-btn-container'>" +
+  "            <a href='#' class='hsvpicker-arrow-btn' data-target='val' data-location='right' data-inline='true' data-icon='reveal'></a>" +
+  "        </div>" +
+  "    </div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				container: "#hsvpicker",
+				hue: {
+					eventSource: "[data-event-source='hue']",
+					selector: "#hsvpicker-hue-selector",
+					hue: "#hsvpicker-hue-hue",
+					valMask:  "#hsvpicker-hue-mask-val"
+				},
+				sat: {
+					gradient: "#hsvpicker-sat-gradient",
+					eventSource: "[data-event-source='sat']",
+					selector: "#hsvpicker-sat-selector",
+					hue: "#hsvpicker-sat-hue",
+					valMask: "#hsvpicker-sat-mask-val"
+				},
+				val: {
+					gradient: "#hsvpicker-val-gradient",
+					eventSource: "[data-event-source='val']",
+					selector: "#hsvpicker-val-selector",
+					hue: "#hsvpicker-val-hue"
+				}
+			}
+		},
+
+		_create: function () {
+			var self = this,
+				chan,
+				hsvIdx,
+				max,
+				step;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.container );
+
+			this._ui.hue.hue.huegradient();
+
+			$.extend( this, {
+				dragging_hsv: [ 0, 0, 0],
+				selectorDraggingOffset: {
+					x : -1,
+					y : -1
+				},
+				dragging: -1
+			} );
+
+			this._ui.container.find( ".hsvpicker-arrow-btn" )
+				.buttonMarkup()
+				.bind( "vclick", function ( e ) {
+					chan = $( this).attr( "data-" + ( $.mobile.ns || "" ) + "target" );
+					hsvIdx = ( "hue" === chan ) ? 0 :
+							( "sat" === chan) ? 1 : 2;
+					max = ( 0 == hsvIdx ? 360 : 1 );
+					step = 0.05 * max;
+
+					self.dragging_hsv[hsvIdx] = self.dragging_hsv[hsvIdx] + step * ( "left" === $( this ).attr( "data-" + ( $.mobile.ns || "" ) + "location" ) ? -1 : 1);
+					self.dragging_hsv[hsvIdx] = Math.min( max, Math.max( 0.0, self.dragging_hsv[hsvIdx] ) );
+					self._updateSelectors( self.dragging_hsv );
+				} );
+
+			$( document )
+				.bind( "vmousemove", function ( event ) {
+					if ( self.dragging != -1 ) {
+						event.stopPropagation();
+						event.preventDefault();
+					}
+				} )
+				.bind( "vmouseup", function ( event ) {
+					self.dragging = -1;
+				} );
+
+			this._bindElements( "hue", 0 );
+			this._bindElements( "sat", 1 );
+			this._bindElements( "val", 2 );
+		},
+
+		_bindElements: function ( chan, idx ) {
+			var self = this;
+			this._ui[chan].selector
+				.bind( "mousedown vmousedown", function ( e ) { self._handleMouseDown( chan, idx, e, true ); } )
+				.bind( "vmousemove touchmove", function ( e ) { self._handleMouseMove( chan, idx, e, true ); } )
+				.bind( "vmouseup",             function ( e ) { self.dragging = -1; } );
+			this._ui[chan].eventSource
+				.bind( "mousedown vmousedown", function ( e ) { self._handleMouseDown( chan, idx, e, false ); } )
+				.bind( "vmousemove touchmove", function ( e ) { self._handleMouseMove( chan, idx, e, false ); } )
+				.bind( "vmouseup",             function ( e ) { self.dragging = -1; } );
+		},
+
+		_handleMouseDown: function ( chan, idx, e, isSelector ) {
+			var coords = $.mobile.tizen.targetRelativeCoordsFromEvent( e ),
+				widgetStr = ( isSelector ? "selector" : "eventSource" );
+
+			if ( coords.x >= 0 && coords.x <= this._ui[chan][widgetStr].outerWidth() &&
+					coords.y >= 0 && coords.y <= this._ui[chan][widgetStr].outerHeight() ) {
+
+				this.dragging = idx;
+
+				if ( isSelector ) {
+					this.selectorDraggingOffset.x = coords.x;
+					this.selectorDraggingOffset.y = coords.y;
+				}
+
+				this._handleMouseMove( chan, idx, e, isSelector, coords );
+			}
+		},
+
+		_handleMouseMove: function ( chan, idx, e, isSelector, coords ) {
+			if ( this.dragging === idx ) {
+				coords = ( coords || $.mobile.tizen.targetRelativeCoordsFromEvent( e ) );
+
+				var factor = ( ( 0 === idx ) ? 360 : 1 ),
+					potential = ( isSelector
+							? ( ( this.dragging_hsv[idx] / factor) +
+									( ( coords.x - this.selectorDraggingOffset.x ) / this._ui[chan].eventSource.width() ) )
+									: ( coords.x / this._ui[chan].eventSource.width() ) );
+
+				this.dragging_hsv[idx] = Math.min( 1.0, Math.max( 0.0, potential ) ) * factor;
+
+				if ( !isSelector ) {
+					this.selectorDraggingOffset.x = Math.ceil( this._ui[chan].selector.outerWidth() / 2.0 );
+					this.selectorDraggingOffset.y = Math.ceil( this._ui[chan].selector.outerHeight() / 2.0 );
+				}
+
+				this._updateSelectors( this.dragging_hsv );
+				e.stopPropagation();
+				e.preventDefault();
+			}
+		},
+
+		_updateSelectors: function ( hsv ) {
+			var clrlib = $.tizen.colorwidget.clrlib,
+				clrwidget = $.tizen.colorwidget.prototype,
+				clr = clrlib.HSVToHSL( hsv ),
+				hclr = clrlib.HSVToHSL( [hsv[0], 1.0, 1.0] ),
+				vclr = clrlib.HSVToHSL( [hsv[0], hsv[1], 1.0] );
+
+			this._ui.hue.selector.css( { left : this._ui.hue.eventSource.width() * hsv[0] / 360} );
+			clrwidget._setElementColor.call( this, this._ui.hue.selector,  clr, "background" );
+			if ( $.mobile.browser.ie ) {
+				this._ui.hue.hue.find( "*" ).css( "opacity", hsv[1] );
+			} else {
+				this._ui.hue.hue.css( "opacity", hsv[1] );
+			}
+
+			this._ui.hue.valMask.css( "opacity", 1.0 - hsv[2] );
+
+			this._ui.sat.selector.css( { left : this._ui.sat.eventSource.width() * hsv[1]} );
+			clrwidget._setElementColor.call( this, this._ui.sat.selector,  clr, "background" );
+			clrwidget._setElementColor.call( this, this._ui.sat.hue, hclr, "background" );
+			this._ui.sat.valMask.css( "opacity", 1.0 - hsv[2] );
+
+			this._ui.val.selector.css( { left : this._ui.val.eventSource.width() * hsv[2]} );
+			clrwidget._setElementColor.call( this, this._ui.val.selector,  clr, "background" );
+			clrwidget._setElementColor.call( this, this._ui.val.hue, vclr, "background" );
+			clrwidget._setColor.call( this, clrlib.RGBToHTML( clrlib.HSLToRGB(clr) ) );
+		},
+
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.container[value ? "addClass" : "removeClass"]( "ui-disabled" );
+			this._ui.hue.hue.huegradient( "option", "disabled", value );
+			$.tizen.colorwidget.prototype._displayDisabledState.call( this, this._ui.container );
+		},
+
+		_setColor: function ( clr ) {
+			if ( $.tizen.colorwidget.prototype._setColor.call( this, clr ) ) {
+				this.dragging_hsv = $.tizen.colorwidget.clrlib.RGBToHSV( $.tizen.colorwidget.clrlib.HTMLToRGB( this.options.color ) );
+				this._updateSelectors( this.dragging_hsv );
+			}
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.hsvpicker.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.hsvpicker();
+	} );
+
+}( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/*
+ * Notification widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'imageslider'
+ *  data-start-index: start index
+ *  data-vertical-align: set to top or middle or bottom.
+ *
+ * APIs
+ *
+ *  add(image_file): add the image (parameter: url of iamge)
+ *  del(image_index): delete the image (parameter: index of image)
+ *  refresh(): refresh the widget, should be called after add or del.
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Example
+ *
+ * <div data-role="imageslider" id="imageslider" data-start-index="3" data-vertical-align="middle">
+ *	<img src="01.jpg">
+ *	<img src="02.jpg">
+ *	<img src="03.jpg">
+ *	<img src="04.jpg">
+ *	<img src="05.jpg">
+ * </div>
+ *
+ *
+ * $('#imageslider-add').bind('vmouseup', function ( e ) {
+ *	$('#imageslider').imageslider('add', '9.jpg');
+ *	$('#imageslider').imageslider('add', '10.jpg');
+ *	$('#imageslider').imageslider('refresh');
+ * });
+ *
+ * $('#imageslider-del').bind('vmouseup', function ( e ) {
+ *	$('#imageslider').imageslider('del');
+ * });
+ *
+ */
+
+(function ( $, window, undefined ) {
+	$.widget( "tizen.imageslider", $.mobile.widget, {
+		options: {
+			photoFlicking: false
+		},
+
+		dragging: false,
+		moving: false,
+		max_width: 0,
+		max_height: 0,
+		org_x: 0,
+		org_time: null,
+		cur_img: null,
+		prev_img: null,
+		next_img: null,
+		images: [],
+		images_hold: [],
+		index: 0,
+		align_type: null,
+		direction: 1,
+		container: null,
+		interval: null,
+
+		_resize: function ( obj ) {
+			var width,
+				height,
+				margin = 40,
+				ratio,
+				img_max_width = this.max_width - margin,
+				img_max_height = this.max_height - margin;
+
+			height = obj.height();
+			width = obj.width();
+
+			ratio = height / width;
+
+			if ( width > img_max_width ) {
+				obj.width( img_max_width );
+				obj.height( img_max_width * ratio );
+			}
+
+			height = obj.height();
+
+			if ( height > img_max_height ) {
+				obj.height( img_max_height );
+				obj.width( img_max_height / ratio );
+			}
+		},
+
+		_align: function ( obj, img ) {
+			var img_top = 0;
+
+			if ( !obj.length ) {
+				return;
+			}
+
+			if ( this.align_type == "middle" ) {
+				img_top = ( this.max_height - img.height() ) / 2;
+			} else if ( this.align_type == "bottom" ) {
+				img_top = this.max_height - img.height();
+			} else {
+				img_top = 0;
+			}
+
+			obj.css( 'top', img_top + 'px' );
+		},
+
+		_detach: function ( image_index, obj ) {
+			if ( !obj.length ) {
+				return;
+			}
+			if ( image_index < 0 ) {
+				return;
+			}
+			if ( image_index >= this.images.length ) {
+				return;
+			}
+
+			this.images[image_index].detach();
+			obj.css( "display", "none" );
+		},
+
+		_attach: function ( image_index, obj ) {
+			if ( !obj.length ) {
+				return;
+			}
+			if ( image_index < 0 ) {
+				return;
+			}
+			if ( image_index >= this.images.length ) {
+				return;
+			}
+
+			obj.css( "display", "block" );
+			obj.append( this.images[image_index] );
+			this._resize( this.images[image_index] );
+			this._align( obj, this.images[image_index] );
+		},
+
+		_drag: function ( _x ) {
+			var delta,
+				coord_x;
+
+			if ( !this.dragging ) {
+				return;
+			}
+
+			if ( this.options.photoFlicking === false ) {
+				delta = this.org_x - _x;
+
+				// first image
+				if ( delta < 0 && !this.prev_img.length ) {
+					return;
+				}
+				// last image
+				if ( delta > 0 && !this.next_img.length ) {
+					return;
+				}
+			}
+
+			coord_x = _x - this.org_x;
+
+			this.cur_img.css( 'left', coord_x + 'px' );
+			if ( this.next_img.length ) {
+				this.next_img.css( 'left', coord_x + this.max_width + 'px' );
+			}
+			if ( this.prev_img.length ) {
+				this.prev_img.css( 'left', coord_x - this.max_width + 'px' );
+			}
+		},
+
+		_move: function ( _x ) {
+			var delta = this.org_x - _x,
+				flip = 0,
+				date,
+				drag_time,
+				sec,
+				self;
+
+			if ( delta == 0 ) {
+				return;
+			}
+
+			if ( delta > 0 ) {
+				flip = delta < ( this.max_width * 0.45 ) ? 0 : 1;
+			} else {
+				flip = -delta < ( this.max_width * 0.45 ) ? 0 : 1;
+			}
+
+			if ( !flip ) {
+				date = new Date();
+				drag_time = date.getTime() - this.org_time;
+
+				if ( Math.abs( delta ) / drag_time > 1 ) {
+					flip = 1;
+				}
+			}
+
+			if ( flip ) {
+				if ( delta > 0 && this.next_img.length ) {
+					/* next */
+					this._detach( this.index - 1, this.prev_img );
+
+					this.prev_img = this.cur_img;
+					this.cur_img = this.next_img;
+					this.next_img = this.next_img.next();
+
+					this.index++;
+
+					if ( this.next_img.length ) {
+						this.next_img.css( 'left', this.max_width + 'px' );
+						this._attach( this.index + 1, this.next_img );
+					}
+
+					this.direction = 1;
+
+				} else if ( delta < 0 && this.prev_img.length ) {
+					/* prev */
+					this._detach( this.index + 1, this.next_img );
+
+					this.next_img = this.cur_img;
+					this.cur_img = this.prev_img;
+					this.prev_img = this.prev_img.prev();
+
+					this.index--;
+
+					if ( this.prev_img.length ) {
+						this.prev_img.css( 'left', -this.max_width + 'px' );
+						this._attach( this.index - 1, this.prev_img );
+					}
+
+					this.direction = -1;
+				}
+			}
+
+			sec = 500;
+			self = this;
+
+			this.moving = true;
+
+			this.interval = setInterval( function () {
+				self.moving = false;
+				clearInterval( self.interval );
+			}, sec - 50 );
+
+			this.cur_img.animate( { left: 0 }, sec );
+			if ( this.next_img.length ) {
+				this.next_img.animate( { left: this.max_width }, sec );
+			}
+			if ( this.prev_img.length ) {
+				this.prev_img.animate( { left: -this.max_width }, sec );
+			}
+		},
+
+		_add_event: function () {
+			var self = this,
+				date;
+
+			this.container.bind( 'vmousemove', function ( e ) {
+				e.preventDefault();
+
+				if ( self.moving ) {
+					return;
+				}
+				if ( !self.dragging ) {
+					return;
+				}
+
+				self._drag( e.pageX );
+			} );
+
+			this.container.bind( 'vmousedown', function ( e ) {
+				e.preventDefault();
+
+				if ( self.moving ) {
+					return;
+				}
+
+				self.dragging = true;
+
+				self.org_x = e.pageX;
+
+				date = new Date();
+				self.org_time = date.getTime();
+			} );
+
+			this.container.bind( 'vmouseup', function ( e ) {
+				if ( self.moving ) {
+					return;
+				}
+
+				self.dragging = false;
+
+				self._move( e.pageX );
+			} );
+
+			this.container.bind( 'vmouseout', function ( e ) {
+				if ( self.moving ) {
+					return;
+				}
+				if ( !self.dragging ) {
+					return;
+				}
+
+				if ( ( e.pageX < 20 ) ||
+						( e.pageX > ( self.max_width - 20 ) ) ) {
+					self._move( e.pageX );
+					self.dragging = false;
+				}
+			} );
+		},
+
+		_del_event: function () {
+			this.container.unbind( 'vmousemove' );
+			this.container.unbind( 'vmousedown' );
+			this.container.unbind( 'vmouseup' );
+			this.container.unbind( 'vmouseout' );
+		},
+
+		_show: function () {
+			this.cur_img = $( 'div' ).find( '.ui-imageslider-bg:eq(' + this.index + ')' );
+			this.prev_img = this.cur_img.prev();
+			this.next_img = this.cur_img.next();
+
+			this._attach( this.index - 1, this.prev_img );
+			this._attach( this.index, this.cur_img );
+			this._attach( this.index + 1, this.next_img );
+
+			if ( this.prev_img.length ) {
+				this.prev_img.css( 'left', -this.max_width + 'px' );
+			}
+
+			this.cur_img.css( 'left', '0px' );
+
+			if ( this.next_img.length ) {
+				this.next_img.css( 'left', this.max_width + 'px' );
+			}
+		},
+
+		show: function () {
+			this._show();
+			this._add_event();
+		},
+
+		_hide: function () {
+			this._detach( this.index - 1, this.prev_img );
+			this._detach( this.index, this.cur_img );
+			this._detach( this.index + 1, this.next_img );
+		},
+
+		hide: function () {
+			this._hide();
+			this._del_event();
+		},
+
+		_get_height: function () {
+			var $page = $( '.ui-page' ),
+				$content = $page.children( '.ui-content' ),
+				$header = $page.children( '.ui-header' ),
+				$footer = $page.children( '.ui-footer' ),
+				header_h = $header.outerHeight(),
+				footer_h = $footer.outerHeight(),
+				padding = parseFloat( $content.css( 'padding-top' ) ) + parseFloat( $content.css( 'padding-bottom' ) ),
+				content_h = $( window ).height() - header_h - footer_h - padding * 2;
+
+			return content_h;
+		},
+
+		_create: function () {
+			var temp_img,
+				start_index,
+				i = 0;
+
+			$( this.element ).wrapInner( '<div class="ui-imageslider"></div>' );
+			$( this.element ).find( 'img' ).wrap( '<div class="ui-imageslider-bg"></div>' );
+
+			this.container = $( this.element ).find('.ui-imageslider');
+
+			this.max_width = $( window ).width();
+			this.max_height = this._get_height();
+			this.container.css( 'height', this.max_height );
+
+			temp_img = $( 'div' ).find( '.ui-imageslider-bg:first' );
+
+			while ( temp_img.length ) {
+				this.images[i] = temp_img.find( 'img' );
+				temp_img = temp_img.next();
+				i++;
+			}
+
+			for ( i = 0; i < this.images.length; i++ ) {
+				this.images[i].detach();
+			}
+
+			start_index = parseInt( $( this.element ).attr( 'data-start-index' ), 10 );
+			if ( start_index === undefined ) {
+				start_index = 0;
+			}
+			if ( start_index < 0 ) {
+				start_index = 0;
+			}
+			if ( start_index >= this.images.length ) {
+				start_index = this.images.length - 1;
+			}
+
+			this.index = start_index;
+
+			this.align_type = $( this.element ).attr( 'data-vertical-align' );
+		},
+
+		_update: function () {
+			var image_file,
+				bg_html,
+				temp_img;
+
+			while ( this.images_hold.length ) {
+				image_file = this.images_hold.shift();
+
+				bg_html = $( '<div class="ui-imageslider-bg"></div>' );
+				temp_img = $( '<img src="' + image_file + '"></div>' );
+
+				bg_html.append( temp_img );
+				this.container.append( bg_html );
+				this.images.push( temp_img );
+			}
+		},
+
+		refresh: function ( start_index ) {
+			this._update();
+
+			this._hide();
+
+			if ( start_index === undefined ) {
+				start_index = this.index;
+			}
+			if ( start_index < 0 ) {
+				start_index = 0;
+			}
+			if ( start_index >= this.images.length ) {
+				start_index = this.images.length - 1;
+			}
+
+			this.index = start_index;
+
+			this._show();
+		},
+
+		add: function ( image_file ) {
+			this.images_hold.push( image_file );
+		},
+
+		del: function ( image_index ) {
+			var temp_img;
+
+			if ( image_index === undefined ) {
+				image_index = this.index;
+			}
+
+			if ( image_index < 0 || image_index >= this.images.length ) {
+				return;
+			}
+
+			if ( image_index == this.index ) {
+				temp_img = this.cur_img;
+
+				if ( this.index == 0 ) {
+					this.direction = 1;
+				} else if ( this.index == this.images.length - 1 ) {
+					this.direction = -1;
+				}
+
+				if ( this.direction < 0 ) {
+					this.cur_img = this.prev_img;
+					this.prev_img = this.prev_img.prev();
+					if ( this.prev_img.length ) {
+						this.prev_img.css( 'left', -this.max_width );
+						this._attach( image_index - 2, this.prev_img );
+					}
+					this.index--;
+				} else {
+					this.cur_img = this.next_img;
+					this.next_img = this.next_img.next();
+					if ( this.next_img.length ) {
+						this.next_img.css( 'left', this.max_width );
+						this._attach( image_index + 2, this.next_img );
+					}
+				}
+
+				this.cur_img.animate( { left: 0 }, 500 );
+
+			} else if ( image_index == this.index - 1 ) {
+				temp_img = this.prev_img;
+				this.prev_img = this.prev_img.prev();
+				if ( this.prev_img.length ) {
+					this.prev_img.css( 'left', -this.max_width );
+					this._attach( image_index - 1, this.prev_img );
+				}
+				this.index--;
+
+			} else if ( image_index == this.index + 1 ) {
+				temp_img = this.next_img;
+				this.next_img = this.next_img.next();
+				if ( this.next_img.length ) {
+					this.next_img.css( 'left', this.max_width );
+					this._attach( image_index + 1, this.next_img );
+				}
+
+			} else {
+				temp_img = $( 'div' ).find( '.ui-imageslider-bg:eq(' + image_index + ')' );
+			}
+
+			this.images.splice( image_index, 1 );
+			temp_img.detach();
+		}
+	}); /* End of widget */
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( e.target ).find( ":jqmData(role='imageslider')" ).imageslider();
+	});
+
+	$( document ).bind( "pageshow", function ( e ) {
+		$( e.target ).find( ":jqmData(role='imageslider')" ).imageslider( 'show' );
+	});
+
+	$( document ).bind( "pagebeforehide", function ( e ) {
+		$( e.target ).find( ":jqmData(role='imageslider')" ).imageslider( 'hide' );
+	} );
+
+}( jQuery, this ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Horizontal/vertical box layout extension.
+//
+// This will arrange the child elements of a container in a horizontal
+// or vertical row. This only makes sense if your container is a div
+// and contains children which are also divs; the children should
+// also have a height and width set in CSS, otherwise the layout
+// manager won't know what to do with them.
+//
+// Apply it by setting data-layout="hbox" or data-layout="vbox" (vertical
+// on a container element or calling $(element).layouthbox() or
+// $(element).layoutvbox().
+//
+// Usually, you would use a div as the container to get the right effect
+// (an element with display:block).
+//
+// Options can be set programmatically:
+//
+//   $(element).layouthbox('option', 'scrollable', false)
+//   $(element).layoutvbox('option', 'scrollable', false)
+//
+// or via a data-layout-options attribute on the container:
+//
+//   <div data-layout="hbox" data-layout-options='{"hgap":5}'>
+//       <div>child 1</div>
+//       <div>child 2</div>
+//   </div>
+//
+//   <div data-layout="vbox" data-layout-options='{"vgap":5}'>
+//       <div>child 1</div>
+//       <div>child 2</div>
+//   </div>
+//
+// If you change any options after creating the widget, call
+// $(element).layout*box('refresh') to have them picked up.
+// However, note that it's currently not feasible to turn off scrolling
+// once it's on (as calling scrollview('destroy') doesn't remove the
+// scrollview custom mouse handlers).
+//
+// There is one major difference between the horizontal and
+// vertical box layouts: if scrollable=false, the horizontal layout
+// will clip children which overflow the edge of the parent container;
+// by comparison, the vertical container will grow vertically to
+// accommodate the height of its children. This mirrors the behaviour
+// of jQuery Mobile, where elements only ever expand horizontally
+// to fill the width of the window; but will expand vertically forever,
+// unless the page height is artificially constrained.
+//
+// Options:
+//
+//   {Integer} hgap (default=0)
+//   Horizontal gap (in pixels) between the child elements. Only has
+//   an effect on hbox.
+//
+//   {Integer} vgap (default=0)
+//   Vertical gap (in pixels) between the child elements. Only has
+//   an effect on vbox.
+//
+//   {Boolean} scrollable (default=true; can only be set at create time)
+//   Set to true to enable a scrollview on the
+//   container. If false, children will be clipped if
+//   they fall outside the edges of the container after
+//   layouting.
+//
+//   {Boolean} showScrollBars (default=true)
+//   Set to false to hide scrollbars on the container's scrollview.
+//   Has no effect is scrollable=false
+
+(function ( $, undefined ) {
+
+	// hbox
+	$.widget( "tizen.layouthbox", $.tizen.jlayoutadaptor, {
+		fixed: {
+			type: 'flexGrid',
+			rows: 1,
+			direction: 'x',
+			initSelector: ':jqmData(layout="hbox")'
+		},
+
+		_create: function () {
+			if ( !this.options.hgap ) {
+				this.options.hgap = 0;
+			}
+
+			$.tizen.jlayoutadaptor.prototype._create.apply( this, arguments );
+		}
+	} );
+
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( $.tizen.layouthbox.prototype.fixed.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.layouthbox();
+	} );
+
+	// vbox
+	$.widget( "tizen.layoutvbox", $.tizen.jlayoutadaptor, {
+		fixed: {
+			type: 'flexGrid',
+			columns: 1,
+			direction: 'y',
+			initSelector: ':jqmData(layout="vbox")'
+		},
+
+		_create: function () {
+			if ( !this.options.vgap ) {
+				this.options.vgap = 0;
+			}
+
+			$.tizen.jlayoutadaptor.prototype._create.apply( this, arguments );
+		}
+	} );
+
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( $.tizen.layoutvbox.prototype.fixed.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.layoutvbox();
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION - listview controls
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ * 
+ * ***************************************************************************
+ * Copyright (C) 2011 by Intel Corporation Ltd.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// This extension supplies API to toggle the "mode" in which a list
+// is displayed. The modes available is configurable, but defaults
+// to ['edit', 'view']. A list can also have a control panel associated
+// with it. The visibility of the control panel is governed by the current
+// mode (by default, it is visible in 'edit' mode); elements within
+// the listview can also be marked up to be visible in one or more of the
+// available modes.
+//
+// One example use case would be a control panel with a "Select all" checkbox
+// which, when clicked, selects all of the checkboxes in the associated
+// listview items.
+//
+// The control panel itself should be defined as a form element.
+// By default, the control panel will be hidden when the listview is
+// initialised, unless you supply mode="edit" as a
+// data-listview-controls option (when using the default modes). If you
+// want the control panel to be visible in some mode other than
+// the default, use a data-listviewcontrols-show-in="<mode>" attribute
+// on the control panel element.
+//
+// Example usage (using the default 'edit' and 'view' modes):
+//
+// <!-- this is the controls element, displayed in 'edit' mode by default -->
+// <form id="listviewcontrols-control-panel">
+//   <fieldset data-role="controlgroup">
+//     <input type="checkbox" id="listviewcontrols-demo-checkbox-uber" />
+//     <label for="listviewcontrols-demo-checkbox-uber">Select all</label>
+//   </fieldset>
+// </form>
+//
+// <!-- this is the list associated with the controls -->
+// <ul data-role="listview" data-listviewcontrols="#listviewcontrols-control-panel">
+//
+//   <li>
+//
+//     <!-- this element is only visible in 'edit' mode -->
+//     <fieldset data-role="controlgroup" data-listviewcontrols-show-in="edit">
+//       <input type="checkbox" id="listviewcontrols-demo-checkbox-1" />
+//       <label for="listviewcontrols-demo-checkbox-1">Greg</label>
+//     </fieldset>
+//
+//     <!-- this element is only visible in 'view' mode -->
+//     <span data-listviewcontrols-show-in="view">Greg</span>
+//
+//   </li>
+//
+//   ... more li elements marked up the same way ...
+//
+// </ul>
+//
+// To associate the listview with the control panel, add
+// data-listviewcontrols="..selector.." to a listview, where
+// selector selects a single element (the control panel
+// you defined). You can then call
+// listviewcontrols('option', 'mode', '<mode>') on the
+// listview to set the mode.
+//
+// Inside the listview's items, add controls to each item
+// which are only visible when in one of the modes. To do this,
+// add form elements (e.g. checkboxes) to the items as you see fit. Then,
+// mark each form element with data-listviewcontrols-show-in="<mode>".
+// The control's visibility now depends on the mode of the listviewcontrols:
+// it is only shown when its <mode> setting matches the current mode
+// of the listviewcontrols widget. You are responsible for properly
+// styling the form elements inside the listview so the listview looks
+// correct when they are hidden or visible.
+//
+// The control panel (by default, visible when in "show" mode) is flexible
+// and can contain any valid form elements (or other jqm components). It's
+// up to you to define the behaviour associated with interactions on
+// the control panel and/or controls inside list items.
+//
+// Methods:
+//
+//   visibleListItems
+//     Returns a jQuery object containing all the li elements in the
+//     listview which are currently visible and not dividers. (This
+//     is just a convenience to make operating on the list as a whole
+//     slightly simpler.)
+//
+// Options (set in options hash passed to constructor, or via the
+// option method, or declaratively by attribute described below):
+//
+//   controlPanelSelector {String}
+//     Selector string for selecting the element representing the
+//     control panel for the listview. The context for find() is the
+//     document (to give the most flexibility), so your selector
+//     should be specific. Set declaratively with
+//       data-listviewcontrols="...selector...".
+//
+//   modesAvailable {String[]; default=['edit', 'view']}
+//     An array of the modes available for these controls.
+//
+//   mode {String; default='view'}
+//     Current mode for the widget, which governs the visibility
+//     of the listview control panel and any elements marked
+//     with data-listviewcontrols-show-in="<mode>".
+//     Set declaratively with
+//       data-listviewcontrols-options='{"mode":"<mode>"}'.
+//
+//   controlPanelShowIn {String; default=modesAvailable[0]}
+//     The mode in which the control panel is visible; defaults to the
+//     first element of modesAvailable. Can be set declaratively
+//     on the listview controls element with
+//       data-listviewcontrols-show-in="<mode>"
+
+(function ($) {
+
+	$.widget( "todons.listviewcontrols", $.mobile.widget, {
+		_defaults: {
+			controlPanelSelector: null,
+			modesAvailable: ['edit', 'view'],
+			mode: 'view',
+			controlPanelShowIn: null
+		},
+
+		_listviewCssClass: 'ui-listviewcontrols-listview',
+		_controlsCssClass: 'ui-listviewcontrols-panel',
+
+		_create: function () {
+			var self = this,
+				o = this.options,
+				optionsValid = true,
+				page = this.element.closest( '.ui-page' ),
+				controlPanelSelectorAttr = 'data-' + $.mobile.ns + 'listviewcontrols',
+				controlPanelSelector = this.element.attr( controlPanelSelectorAttr ),
+				dataOptions = this.element.jqmData( 'listviewcontrols-options' ),
+				controlPanelShowInAttr;
+
+			o.controlPanelSelector = o.controlPanelSelector || controlPanelSelector;
+
+			// precedence for options: defaults < jqmData attribute < options arg
+			o = $.extend( {}, this._defaults, dataOptions, o );
+
+			optionsValid = ( this._validOption( 'modesAvailable', o.modesAvailable, o ) &&
+					this._validOption( 'controlPanelSelector', o.controlPanelSelector, o ) &&
+					this._validOption( 'mode', o.mode, o ) );
+
+			if ( !optionsValid ) {
+				return false;
+			}
+
+			// get the controls element
+			this.controlPanel = $( document ).find( o.controlPanelSelector ).first();
+
+			if ( this.controlPanel.length === 0 ) {
+				return false;
+			}
+
+			// once we have the controls element, we may need to override the
+			// mode in which controls are shown
+			controlPanelShowInAttr = this.controlPanel.jqmData( 'listviewcontrols-show-in' );
+			if ( controlPanelShowInAttr ) {
+				o.controlPanelShowIn = controlPanelShowInAttr;
+			} else if ( !o.controlPanelShowIn ) {
+				o.controlPanelShowIn = o.modesAvailable[0];
+			}
+
+			if ( !this._validOption( 'controlPanelShowIn', o.controlPanelShowIn, o ) ) {
+				return;
+			}
+
+			// done setting options
+			this.options = o;
+
+			// mark the controls and the list with a class
+			this.element.removeClass(this._listviewCssClass).addClass(this._listviewCssClass);
+			this.controlPanel.removeClass(this._controlsCssClass).addClass(this._controlsCssClass);
+
+			// show the widget
+			if ( page && !page.is( ':visible' ) ) {
+				page.bind( 'pageshow', function () { self.refresh(); } );
+			} else {
+				this.refresh();
+			}
+		},
+
+		_validOption: function ( varName, value, otherOptions ) {
+			var ok = false,
+				i = 0;
+
+			if ( varName === 'mode' ) {
+				ok = ( $.inArray( value, otherOptions.modesAvailable ) >= 0 );
+			} else if ( varName === 'controlPanelSelector' ) {
+				ok = ( $.type( value ) === 'string' );
+			} else if ( varName === 'modesAvailable' ) {
+				ok = ( $.isArray( value ) && value.length > 1 );
+
+				if ( ok ) {
+					for ( i = 0; i < value.length; i++ ) {
+						if ( value[i] === '' || $.type( value[i] ) !== 'string' ) {
+							ok = false;
+						}
+					}
+				}
+			} else if ( varName === 'controlPanelShowIn' ) {
+				ok = ( $.inArray( value, otherOptions.modesAvailable ) >= 0 );
+			}
+
+			return ok;
+		},
+
+		_setOption: function ( varName, value ) {
+			var oldValue = this.options[varName];
+
+			if ( oldValue !== value && this._validOption( varName, value, this.options ) ) {
+				this.options[varName] = value;
+				this.refresh();
+			}
+		},
+
+		visibleListItems: function () {
+			return this.element.find( 'li:not(:jqmData(role=list-divider)):visible' );
+		},
+
+		refresh: function () {
+			var self = this,
+				triggerUpdateLayout = false,
+				isVisible = null,
+				showIn,
+				modalElements;
+
+			// hide/show the control panel and hide/show controls inside
+			// list items based on their "show-in" option
+			isVisible = this.controlPanel.is( ':visible' );
+
+			if ( this.options.mode === this.options.controlPanelShowIn ) {
+				this.controlPanel.show();
+			} else {
+				this.controlPanel.hide();
+			}
+
+			if ( this.controlPanel.is( ':visible' ) !== isVisible ) {
+				triggerUpdateLayout = true;
+			}
+
+			// we only operate on elements inside list items which aren't dividers
+			modalElements = this.element
+								.find( 'li:not(:jqmData(role=list-divider))' )
+								.find( ':jqmData(listviewcontrols-show-in)' );
+
+			modalElements.each(function () {
+				showIn = $( this ).jqmData( 'listviewcontrols-show-in' );
+
+				isVisible = $( this ).is( ':visible' );
+
+				if ( showIn === self.options.mode ) {
+					$( this ).show();
+				} else {
+					$( this ).hide();
+				}
+
+				if ( $( this ).is( ':visible' ) !== isVisible ) {
+					triggerUpdateLayout = true;
+				}
+			} );
+
+			if ( triggerUpdateLayout ) {
+				this.element.trigger( 'updatelayout' );
+			}
+		}
+	} );
+
+	$( 'ul' ).live( 'listviewcreate', function () {
+		var list = $(this);
+
+		if ( list.is( ':jqmData(listviewcontrols)' ) ) {
+			list.listviewcontrols();
+		}
+	} );
+
+}( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Kangsik Kim <kangsik81.kim@samsung.com>
+*/
+
+/**
+ *	Multibuttonentry widget is a kind of button widget.
+ *	When a user inputs a text and the text gets an change event,
+ *	the text can be changed from it to a button widget.
+ *
+ *	HTML Attributes:
+ *
+ *		data-listUrl : This attribute is represent a 'id' about page.
+ *				This page is containing prepared data for provide to user.
+ *				For example, like address book.
+ *		data-label:	This attribute is providing label for user-guide. (Default : 'To : ')
+ *		data-descMessage : This attribute is managing message format.
+ *				 This message is displayed when widget status was changed to 'focusout'.
+ *
+ *	APIs:
+ *
+ *		inputtext ( void )
+ *			: Get a string from inputbox.
+ *		inputtext (  [string]  )
+ *			: If argument is not exist, will get a string from inputbox.
+ *			If argument is exist, will set a string to inputbox.
+ *		select (  [number]  )
+ *			: If argument is not exist, will act  as a getter.
+ *			Get a string of selected block.
+ *			If widget is not exist a selected button, it will return 'null'.
+ *			Select a button located on the index. (number : index of button)
+ *		add ( text, [number] )
+ *			: If second argument is not exist, will insert to a new textblock at last position.
+ *			Insert a new button at position that is pointed by index. (number : index of button)
+ *		remove ( [number] )
+ *			: If argument is not exist, will remove all buttons.
+ *			Remove a button that is pointed by index. (number : index of button)
+ *		length ( void )
+ *			: Get a number of buttons.
+ *		foucsIn ( void )
+ *			: This method change a status to 'focusin'.
+ *			This status is able to manage a widget.
+ *		focusOut ( void )
+ *			: This method change a status to 'focusout'.
+ *			This status is not able to manage a widget.
+ *
+ *
+ *	Events:
+ *
+ *		select : This event will occur when select a button.
+ *		add : This event will occur when insert new button.
+ *		remove : This event will occur when remove a button.
+ *
+ *	Examples:
+ *
+ *		<div data-role="multibuttonentry" data-label="To : " data-listUrl:"#addressbook" data-descMessage="{0} & {1} more...">
+ *		</div>
+ *
+ */
+
+( function ( $, window, document, undefined ) {
+	$.widget( "tizen.multibuttonentry", $.mobile.widget, {
+		_focusStatus : null,
+		_items : null,
+		_viewWidth : 0,
+		_reservedWidth : 0,
+		_currentWidth : 0,
+		_fontSize : 0,
+		_anchorWidth : 0,
+		_labelWidth : 0,
+		_marginWidth : 0,
+		options : {
+			label : "To : ",
+			listUrl : "#addressbook",
+			descMessage : "{0} & {1} more..."
+		},
+		_create : function () {
+			var self = this,
+				$view = this.element,
+				role = $view.jqmData( "role" ),
+				option = this.options,
+				inputbox = $( document.createElement( "input" ) ),
+				labeltag = $( document.createElement( "label" ) ),
+				moreBlock = $( document.createElement( "a" ) );
+
+			$view.hide().empty().addClass( "ui-" + role );
+
+			// create a label tag.
+			$( labeltag ).text( this.options.label ).addClass( "ui-multibuttonentry-label" );
+			$view.append( labeltag );
+
+			// create a input tag
+			$( inputbox ).text( option.label ).addClass( "ui-multibuttonentry-input" );
+			$view.append( inputbox );
+
+			// create a anchor tag.
+			$( moreBlock ).text( "+" ).attr( "href", option.listUrl ).addClass( "ui-multibuttonentry-link" );
+
+			// append default htmlelements to main widget.
+			$view.append( moreBlock );
+
+			// bind a event
+			this._bindEvents();
+			self._focusStatus = "init";
+			// display widget
+			$view.show();
+			$view.attr( "tabindex", -1 ).focusin( function ( e ) {
+				self.focusIn();
+			});
+
+			// assign global variables
+			self._viewWidth = $view.innerWidth();
+			self._reservedWidth += self._calcBlockWidth( moreBlock );
+			self._reservedWidth += self._calcBlockWidth( labeltag );
+			self._fontSize = parseInt( $( moreBlock ).css( "font-size" ), 10 );
+			self._currentWidth = self._reservedWidth;
+		},
+		// bind events
+		_bindEvents : function () {
+			var self = this,
+				$view = self.element,
+				option = self.options,
+				inputbox = $view.find( ".ui-multibuttonentry-input" ),
+				moreBlock = $view.find( ".ui-multibuttonentry-link" );
+
+			inputbox.bind( "keydown", function ( event ) {
+				// 8  : backspace
+				// 13 : Enter
+				var keyValue = event.keyCode,
+					valueString = $( inputbox ).val();
+
+				if ( keyValue == 8 ) {
+					if ( valueString.length === 0 ) {
+						self._validateTargetBlock();
+					}
+				} else if ( keyValue == 13 ) {
+					if ( valueString.length !== 0 ) {
+						self._addTextBlock( valueString );
+					}
+					inputbox.val( "" );
+				} else {
+					self._unlockTextBlock();
+				}
+			});
+
+			moreBlock.click( function () {
+				$.mobile.changePage( option.listUrl, {
+					transition: "slide",
+					reverse: false,
+					changeHash: false
+				} );
+			} );
+
+			$( document ).bind( "pagechange.mbe", function ( event ) {
+				if ( $view.innerWidth() === 0 ) {
+					return ;
+				}
+				var inputBox = $view.find( ".ui-multibuttonentry-input" );
+				if ( self._labelWidth === 0 ) {
+					self._labelWidth = $view.find( ".ui-multibuttonentry-label" ).outerWidth( true );
+					self._anchorWidth = $view.find( ".ui-multibuttonentry-link" ).outerWidth( true );
+					self._marginWidth = parseInt( ( $( inputBox ).css( "margin-left" ) ), 10 );
+					self._marginWidth += parseInt( ( $( inputBox ).css( "margin-right" ) ), 10 );
+					self._viewWidth = $view.innerWidth();
+				}
+				self._modifyInputBoxWidth();
+			});
+		},
+		// create a textbutton and append this button to parent layer.
+		// @param arg1 : string
+		// @param arg2 : index
+		_addTextBlock : function ( messages, blcokIndex ) {
+			if ( arguments.length === 0 ) {
+				return;
+			}
+
+			if ( ! messages ) {
+				return ;
+			}
+
+			var self = this,
+				$view = self.element,
+				content = messages,
+				index = blcokIndex,
+				blocks = null,
+				dataBlock = null,
+				displayText = null,
+				textBlock = null;
+
+			if ( self._viewWidth === 0 ) {
+				self._viewWidth = $view.innerWidth();
+			}
+			// save src data
+			dataBlock = $( document.createElement( 'input' ) );
+			dataBlock.val( content ).addClass( "ui-multibuttonentry-data" ).hide();
+
+			// Create a new text HTMLDivElement.
+			textBlock = $( document.createElement( 'div' ) );
+			displayText = self._ellipsisTextBlock( content ) ;
+			textBlock.text( displayText ).addClass( "ui-multibuttonentry-block" );
+			textBlock.append( dataBlock );
+			// bind a event to HTMLDivElement.
+			textBlock.bind( "vclick", function ( event ) {
+				if ( self._focusStatus === "focusOut" ) {
+					self.focusInEvent();
+					return;
+				}
+
+				if ( $( this ).hasClass( "ui-multibuttonentry-sblock" ) ) {
+					// If block is selected, it will be removed.
+					self._removeTextBlock();
+				}
+
+				var lockBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+				if ( typeof lockBlock != "undefined" ) {
+					lockBlock.removeClass( "ui-multibuttonentry-sblock" ).addClass( "ui-multibuttonentry-block" );
+				}
+				$( this ).removeClass( "ui-multibuttonentry-block" ).addClass( "ui-multibuttonentry-sblock" );
+				self._trigger( "select" );
+			});
+
+			blocks = $view.find( "div" );
+			if ( index !== null && index <= blocks.length ) {
+				$( blocks[index] ).before( textBlock );
+			} else {
+				$view.find( ".ui-multibuttonentry-input" ).before( textBlock );
+			}
+
+			self._currentWidth += self._calcBlockWidth( textBlock );
+			self._modifyInputBoxWidth();
+			self._trigger( "add" );
+		},
+		_removeTextBlock : function () {
+			var self = this,
+				$view = this.element,
+				targetBlock = null,
+				lockBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+
+			if ( lockBlock !== null && lockBlock.length > 0 ) {
+				self._currentWidth -= self._calcBlockWidth( lockBlock );
+				lockBlock.remove();
+				self._modifyInputBoxWidth();
+				this._trigger( "remove" );
+			} else {
+				$view.find( "div:last" ).removeClass( "ui-multibuttonentry-block" ).addClass( "ui-multibuttonentry-sblock" );
+			}
+		},
+		_calcBlockWidth : function ( block ) {
+			var blockWidth = 0;
+			blockWidth = $( block ).outerWidth( true );
+			return blockWidth;
+		},
+		_unlockTextBlock : function () {
+			var $view = this.element,
+				lockBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+			if ( lockBlock !== null ) {
+				lockBlock.removeClass( "ui-multibuttonentry-sblock" ).addClass( "ui-multibuttonentry-block" );
+			}
+		},
+		// call when remove text block by backspace key.
+		_validateTargetBlock : function () {
+			var self = this,
+				$view = self.element,
+				lastBlock = $view.find( "div:last" ),
+				tmpBlock = null;
+
+			if ( lastBlock.hasClass( "ui-multibuttonentry-sblock" ) ) {
+				self._removeTextBlock();
+			} else {
+				tmpBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+				tmpBlock.removeClass( "ui-multibuttonentry-sblock" ).addClass( "ui-multibuttonentry-block" );
+				lastBlock.removeClass( "ui-multibuttonentry-block" ).addClass( "ui-multibuttonentry-sblock" );
+			}
+		},
+		_ellipsisTextBlock : function ( text ) {
+			var self = this,
+				str = text,
+				length = 0,
+				maxWidth = self._viewWidth,
+				maxCharCnt = parseInt( ( self._viewWidth / self._fontSize ), 10 ) - 5,
+				ellipsisStr = null;
+			if ( str ) {
+				length = str.length ;
+				if ( length > maxCharCnt ) {
+					ellipsisStr = str.substring( 0, maxCharCnt );
+					ellipsisStr += "...";
+				} else {
+					ellipsisStr = str;
+				}
+			}
+			return ellipsisStr;
+		},
+		_modifyInputBoxWidth : function () {
+			var self = this,
+				$view = self.element,
+				labelWidth = self._labelWidth,
+				anchorWidth = self._anchorWidth,
+				inputBoxWidth = self._viewWidth - labelWidth - anchorWidth,
+				blocks = $view.find( "div" ),
+				blockWidth = 0,
+				index = 0,
+				margin = self._marginWidth,
+				inputBox = $view.find( ".ui-multibuttonentry-input" );
+
+			if ( $view.width() === 0 ) {
+				return ;
+			}
+
+			for ( index = 0; index < blocks.length; index += 1 ) {
+				blockWidth = self._calcBlockWidth( blocks[index] );
+				inputBoxWidth = inputBoxWidth - blockWidth;
+				if ( inputBoxWidth <= 0 ) {
+					if ( inputBoxWidth + anchorWidth >= 0 ) {
+						inputBoxWidth = self._viewWidth - anchorWidth;
+					} else {
+						inputBoxWidth = self._viewWidth - blockWidth - anchorWidth;
+					}
+				}
+			}
+			$( inputBox ).width( inputBoxWidth - margin - 1 );
+		},
+		_stringFormat : function ( expression ) {
+			var pattern = null,
+				message = expression,
+				i = 0;
+			for ( i = 1; i < arguments.length; i += 1 ) {
+				pattern = "{" + ( i - 1 ) + "}";
+				message = message.replace( pattern, arguments[i] );
+			}
+			return message;
+		},
+		_resizeBlock : function () {
+			var self = this,
+				$view = self.element,
+				dataBlocks = $( ".ui-multibuttonentry-data" ),
+				blocks = $view.find( "div" ),
+				srcTexts = [],
+				index = 0;
+
+			$view.hide();
+			for ( index = 0 ; index < dataBlocks.length ; index += 1 ) {
+				srcTexts[index] = $( dataBlocks[index] ).val();
+				self._addTextBlock( srcTexts[index] );
+			}
+			blocks.remove();
+			$view.show();
+		},
+
+		//----------------------------------------------------//
+		//					Public Method					//
+		//----------------------------------------------------//
+		//
+		// Focus In Event
+		//
+		focusIn : function () {
+			if ( this._focusStatus === "focusIn" ) {
+				return;
+			}
+
+			var $view = this.element;
+
+			$view.find( "label" ).show();
+			$view.find( ".ui-multibuttonentry-desclabel" ).remove();
+			$view.find( "div.ui-multibuttonentry-sblock" ).removeClass( "ui-multibuttonentry-sblock" ).addClass( "ui-multibuttonentry-block" );
+			$view.find( "div" ).show();
+			$view.find( ".ui-multibuttonentry-input" ).show();
+			$view.find( "a" ).show();
+
+			// change focus state.
+			this._modifyInputBoxWidth();
+			this._focusStatus = "focusIn";
+		},
+		focusOut : function () {
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			var self = this,
+				$view = self.element,
+				tempBlock = null,
+				statement = "",
+				index = 0,
+				lastIndex = 10,
+				label = $view.find( "label" ),
+				more = $view.find( "span" ),
+				blocks = $view.find( "div" ),
+				currentWidth = $view.outerWidth( true ) - more.outerWidth( true ) - label.outerWidth( true ),
+				textWidth = currentWidth;
+
+			$view.find( ".ui-multibuttonentry-input" ).hide();
+			$view.find( "a" ).hide();
+			blocks.hide();
+
+			// div button
+			currentWidth = currentWidth - self._reservedWidth;
+			for ( index = 0; index < blocks.length; index += 1 ) {
+				currentWidth = currentWidth - $( blocks[index] ).outerWidth( true );
+				statement += ", " + $( blocks[index] ).text();
+				if ( currentWidth <= 0 ) {
+					statement = "," + $( blocks[0] ).text();
+					statement = self._stringFormat( self.options.descMessage, statement, blocks.length - 1 );
+					break;
+				}
+				lastIndex = statement.length;
+			}
+			tempBlock = $( document.createElement( 'input' ) );
+			tempBlock.val( statement.substr( 1, statement.length ) );
+			tempBlock.addClass( "ui-multibuttonentry-desclabel" ).addClass( "ui-multibuttonentry-desclabel" );
+			tempBlock.width( textWidth - ( self._reservedWidth ) );
+			tempBlock.attr( "disabled", true );
+			$view.find( "label" ).after( tempBlock );
+			// update foucs state
+			this._focusStatus = "focusOut";
+		},
+		inputText : function ( message ) {
+			var $view = this.element;
+
+			if ( arguments.length === 0 ) {
+				return $view.find( ".ui-multibuttonentry-input" ).val();
+			}
+			$view.find( ".ui-multibuttonentry-input" ).val( message );
+			return message;
+		},
+		select : function ( index ) {
+			var $view = this.element,
+				lockBlock = null,
+				blocks = null;
+
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			if ( arguments.length === 0 ) {
+				// return a selected block.
+				lockBlock = $view.find( "div.ui-multibuttonentry-sblock" );
+				if ( lockBlock) {
+					return lockBlock.text();
+				}
+				return null;
+			}
+			// 1. unlock all blocks.
+			this._unlockTextBlock();
+			// 2. select pointed block.
+			blocks = $view.find( "div" );
+			if ( blocks.length > index ) {
+				$( blocks[index] ).removeClass( "ui-multibuttonentry-block" ).addClass( "ui-multibuttonentry-sblock" );
+				this._trigger( "select" );
+			}
+			return null;
+		},
+		add : function ( message, position ) {
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			this._addTextBlock( message, position );
+		},
+		remove : function ( position ) {
+			var self = this,
+				$view = this.element,
+				blocks = $view.find( "div" ),
+				index = 0;
+			if ( this._focusStatus === "focusOut" ) {
+				return;
+			}
+
+			if ( arguments.length === 0 ) {
+				blocks.remove();
+				this._trigger( "clear" );
+			} else if ( typeof position == "number" ) {
+				// remove selected button
+				index = ( ( position < blocks.length ) ? position : ( blocks.length - 1 ) );
+				$( blocks[index] ).remove();
+				this._trigger( "remove" );
+			}
+			self._modifyInputBoxWidth();
+		},
+		length : function () {
+			return this.element.find( "div" ).length;
+		},
+		refresh : function () {
+			var self = this;
+			self.element.hide();
+			self.element.show();
+		},
+		destory : function () {
+			var $view = this.element;
+
+			$view.find( "label" ).remove();
+			$view.find( "div" ).unbind( "vclick" ).remove();
+			$view.find( "a" ).remove();
+			$view.find( ".ui-multibuttonentry-input" ).unbind( "keydown" ).remove();
+
+			this._trigger( "destory" );
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function () {
+		$( ":jqmData(role='multibuttonentry')" ).multibuttonentry();
+	});
+
+	$( window ).bind( "resize", function () {
+		$( ":jqmData(role='multibuttonentry')" ).multibuttonentry( "refresh" );
+	});
+} ( jQuery, window, document ) );
+/*
+ * Authors: Yonghwi Park <yonghwi0324.park@samsung.com>
+ *		 Wonseop Kim <wonseop.kim@samsung.com>
+ */
+
+/**
+ * MultiMediaView is a widget that provides an audio or a video content handling features.
+ * A multi-media content handled with this widget can be played with HTML5's <audio> or <video> tag.
+ * If a user wants to play a music file, he should use "<audio>" tag.
+ * And he should use "<video>" tag to play a video file.
+ *
+ * HTML Attributes:
+ *			data-theme : Set a theme of widget.
+ *				If this value is not defined, widget will use parent`s theme. (optional)
+ *			data-controls : If this value is 'true', widget will use belonging controller.
+ *				If this value is 'false', widget will use browser`s controller.
+ *				Default value is 'true'.
+ *			data-fullscreen : Set a status that fullscreen when inital start.
+ *				Default value is 'false'.
+ *
+ * APIs:
+ *			width( [number] )
+ *					: Get or set a widget of widget.
+ *			height( [number] )
+ *					: Get or set a height of widget.
+ *			size( number, number )
+ *					: Set a size of widget and resize a widget.
+ *					 First argument is width and second argument is height.
+ *			fullscreen( [boolean] )
+ *					: Set a status that fullscreen.
+ *
+ * Events:
+ *
+ *			create :  triggered when a multimediaview is created.
+ *
+ * Examples:
+ *
+ *			VIDEO :
+ *				<video data-controls="true" style="width:100%;">
+ *					<source src="media/oceans-clip.mp4" type="video/mp4" />
+ *					Your browser does not support the video tag.
+ *				</video>
+ *
+ *			AUDIO :
+ *				<audio data-controls="true" style="width:100%;">
+ *					<source src="media/Over the horizon.mp3" type="audio/mp3" />
+ *					Your browser does not support the audio tag.
+ *				</audio>
+ *
+ */
+
+( function ( $, document, window, undefined ) {
+	$.widget( "tizen.multimediaview", $.mobile.widget, {
+		options : {
+			theme : null,
+			controls : true,
+			fullscreen : false,
+			initSelector : "video, audio"
+		},
+		_create : function () {
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				option = self.options,
+				role = "multimediaview",
+				control = null;
+
+			$.extend( this, {
+				role : null,
+				isControlHide : false,
+				controlTimer : null,
+				isVolumeHide : true,
+				isVertical : true,
+				backupView : null
+			});
+
+			self.role = role;
+			view.addClass( "ui-multimediaview" );
+			control = self._createControl();
+
+			if ( view[0].nodeName === "AUDIO" ) {
+				control.addClass( "ui-multimediaview-audio" );
+			}
+
+			control.hide();
+			view.wrap( "<div class='ui-multimediaview-wrap'>" ).after( control );
+			if ( option.controls ) {
+				if ( view.attr("controls") ) {
+					view.removeAttr( "controls" );
+				}
+			}
+
+			self._addEvent();
+
+			$( document ).bind( "pagechange.multimediaview", function ( e ) {
+				var $page = $( e.target );
+				if ( $page.find( view ).length > 0 && viewElement.autoplay ) {
+					viewElement.play();
+				}
+
+				if ( option.controls ) {
+					control.show();
+					self._resize();
+				}
+			}).bind( "pagebeforechange.multimediaview", function ( e ) {
+				if ( viewElement.played.length !== 0 ) {
+					viewElement.pause();
+					control.hide();
+				}
+			});
+			$( window ).bind( "resize.multimediaview orientationchange.multimediaview", function ( e ) {
+				if ( !option.controls ) {
+					return;
+				}
+				var $page = $( e.target ),
+					$scrollview = view.parents( ".ui-scrollview-clip" );
+
+				$scrollview.each( function ( i ) {
+					if ( $.data( this, "scrollview" ) ) {
+						$( this ).scrollview( "scrollTo", 0, 0 );
+					}
+				});
+
+				// for maintaining page layout
+				if ( !option.fullscreen ) {
+					$( ".ui-footer:visible" ).show();
+				} else {
+					$( ".ui-footer" ).hide();
+					self._fitContentArea( $page );
+				}
+
+				self._resize();
+			});
+		},
+		_resize : function () {
+			var view = this.element,
+				parent = view.parent(),
+				control = parent.find( ".ui-multimediaview-control" ),
+				viewWidth = 0,
+				viewHeight = 0,
+				viewOffset = null;
+
+			this._resizeFullscreen( this.options.fullscreen );
+			viewWidth = ( ( view[0].nodeName === "VIDEO" ) ? view.width() : parent.width() );
+			viewHeight = ( ( view[0].nodeName === "VIDEO" ) ? view.height() : control.height() );
+			viewOffset = view.offset();
+
+			this._resizeControl( viewOffset, viewWidth, viewHeight );
+
+			this._updateSeekBar();
+			this._updateVolumeState();
+		},
+		_resizeControl : function ( offset, width, height ) {
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				buttons = control.find( ".ui-button" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationLabel = control.find( ".ui-durationlabel" ),
+				controlWidth = width,
+				controlHeight = control.outerHeight( true ),
+				availableWidth = 0,
+				controlOffset = null;
+
+			if ( control ) {
+				if ( view[0].nodeName === "VIDEO" ) {
+					controlOffset = control.offset();
+					controlOffset.left = offset.left;
+					controlOffset.top = offset.top + height - controlHeight;
+					control.offset( controlOffset );
+				}
+
+				control.width( controlWidth );
+			}
+
+			if ( seekBar ) {
+				availableWidth = control.width() - ( buttons.outerWidth( true ) * buttons.length );
+				availableWidth -= ( parseInt( buttons.eq( 0 ).css( "margin-left" ), 10 ) + parseInt( buttons.eq( 0 ).css( "margin-right" ), 10 ) ) * buttons.length;
+				if ( !self.isVolumeHide ) {
+					availableWidth -= volumeControl.outerWidth( true );
+				}
+				seekBar.width( availableWidth );
+			}
+
+			if ( durationLabel && !isNaN( viewElement.duration ) ) {
+				durationLabel.find( "p" ).text( self._convertTimeFormat( viewElement.duration ) );
+			}
+
+			if ( viewElement.autoplay && viewElement.paused === false ) {
+				playpauseButton.removeClass( "ui-play-icon" ).addClass( "ui-pause-icon" );
+			}
+		},
+		_resizeFullscreen : function ( isFullscreen ) {
+			var self = this,
+				view = self.element,
+				parent = view.parent(),
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				timestampLabel = control.find( ".ui-timestamplabel" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationBar = seekBar.find( ".ui-duration" ),
+				currenttimeBar = seekBar.find( ".ui-currenttime" ),
+				docWidth = 0,
+				docHeight = 0;
+
+			if ( isFullscreen ) {
+				if ( !self.backupView ) {
+					self.backupView = {
+						width : view[0].style.getPropertyValue( "width" ) || "",
+						height : view[0].style.getPropertyValue( "height" ) || "",
+						position : view.css( "position" ),
+						zindex : view.css( "z-index" )
+					};
+				}
+				docWidth = $( "body" )[0].clientWidth;
+				docHeight = $( "body" )[0].clientHeight;
+
+				view.width( docWidth ).height( docHeight - 1 );
+				view.addClass( "ui-" + self.role + "-fullscreen" );
+				view.offset( {
+					top : 0,
+					left : 0
+				});
+			} else {
+				if ( !self.backupView ) {
+					return;
+				}
+
+				view.removeClass( "ui-" + self.role + "-fullscreen" );
+				view.css( {
+					"width" : self.backupView.width,
+					"height" : self.backupView.height,
+					"position": self.backupView.position,
+					"z-index": self.backupView.zindex
+				});
+				self.backupView = null;
+			}
+			parent.show();
+		},
+		_addEvent : function () {
+			var self = this,
+				view = self.element,
+				viewElement = view[0],
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				timestampLabel = control.find( ".ui-timestamplabel" ),
+				durationLabel = control.find( ".ui-durationlabel" ),
+				volumeButton = control.find( ".ui-volumebutton" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				volumeBar = volumeControl.find( ".ui-volumebar" ),
+				volumeGuide = volumeControl.find( ".ui-guide" ),
+				volumeHandle = volumeControl.find( ".ui-handler" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				durationBar = seekBar.find( ".ui-duration" ),
+				currenttimeBar = seekBar.find( ".ui-currenttime" );
+
+			view.bind( "loadedmetadata.multimediaview", function ( e ) {
+				if ( !isNaN( viewElement.duration ) ) {
+					durationLabel.find( "p" ).text( self._convertTimeFormat( viewElement.duration ) );
+				}
+				self._resize();
+			}).bind( "timeupdate.multimediaview", function ( e ) {
+				self._updateSeekBar();
+			}).bind( "play.multimediaview", function ( e ) {
+				playpauseButton.removeClass( "ui-play-icon" ).addClass( "ui-pause-icon" );
+			}).bind( "pause.multimediaview", function ( e ) {
+				playpauseButton.removeClass( "ui-pause-icon" ).addClass( "ui-play-icon" );
+			}).bind( "ended.multimediaview", function ( e ) {
+				if ( typeof viewElement.loop == "undefined" || viewElement.loop === "" ) {
+					self.stop();
+				}
+			}).bind( "volumechange.multimediaview", function ( e ) {
+				if ( viewElement.volume < 0.1 ) {
+					viewElement.muted = true;
+					volumeButton.removeClass( "ui-volume-icon" ).addClass( "ui-mute-icon" );
+				} else {
+					viewElement.muted = false;
+					volumeButton.removeClass( "ui-mute-icon" ).addClass( "ui-volume-icon" );
+				}
+
+				if ( !self.isVolumeHide ) {
+					self._updateVolumeState();
+				}
+			}).bind( "durationchange.multimediaview", function ( e ) {
+				if ( !isNaN( viewElement.duration ) ) {
+					durationLabel.find( "p" ).text( self._convertTimeFormat( viewElement.duration ) );
+				}
+				self._resize();
+			}).bind( "error.multimediaview", function ( e ) {
+				switch ( e.target.error.code ) {
+				case e.target.error.MEDIA_ERR_ABORTED :
+					window.alert( 'You aborted the video playback.' );
+					break;
+				case e.target.error.MEDIA_ERR_NETWORK :
+					window.alert( 'A network error caused the video download to fail part-way.' );
+					break;
+				case e.target.error.MEDIA_ERR_DECODE :
+					window.alert( 'The video playback was aborted due to a corruption problem or because the video used features your browser did not support.' );
+					break;
+				case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED :
+					window.alert( 'The video could not be loaded, either because the server or network failed or because the format is not supported.' );
+					break;
+				default :
+					window.alert( 'An unknown error occurred.' );
+					break;
+				}
+			}).bind( "vclick.multimediaview", function ( e ) {
+				if ( !self.options.controls ) {
+					return;
+				}
+
+				control.fadeToggle( "fast", function () {
+					var offset = control.offset();
+					self.isControlHide = !self.isControlHide;
+					if ( self.options.mediatype == "video" ) {
+						self._startTimer();
+					}
+				});
+				self._resize();
+			});
+
+			playpauseButton.bind( "vclick.multimediaview", function () {
+				self._endTimer();
+
+				if ( viewElement.paused ) {
+					viewElement.play();
+				} else {
+					viewElement.pause();
+				}
+
+				if ( self.options.mediatype == "video" ) {
+					self._startTimer();
+				}
+			});
+
+			fullscreenButton.bind( "vclick.multimediaview", function () {
+				self.fullscreen( !self.options.fullscreen );
+				control.fadeIn( "fast" );
+				self._endTimer();
+			});
+
+			seekBar.bind( "vmousedown.multimediaview", function ( e ) {
+				var x = e.clientX,
+					duration = viewElement.duration,
+					durationOffset = durationBar.offset(),
+					durationWidth = durationBar.width(),
+					timerate = ( x - durationOffset.left ) / durationWidth,
+					time = duration * timerate;
+
+				viewElement.currentTime = time;
+
+				self._endTimer();
+
+				e.preventDefault();
+				e.stopPropagation();
+
+				$( document ).bind( "vmousemove.multimediaview", function ( e ) {
+					var x = e.clientX,
+						timerate = ( x - durationOffset.left ) / durationWidth;
+
+					viewElement.currentTime = duration * timerate;
+
+					e.preventDefault();
+					e.stopPropagation();
+				}).bind( "vmouseup.multimediaview", function () {
+					$( document ).unbind( "vmousemove.multimediaview vmouseup.multimediaview" );
+					if ( viewElement.paused ) {
+						viewElement.pause();
+					} else {
+						viewElement.play();
+					}
+				});
+			});
+
+			volumeButton.bind( "vclick.multimediaview", function () {
+				if ( self.isVolumeHide ) {
+					var view = self.element,
+						volume = viewElement.volume;
+
+					self.isVolumeHide = false;
+					self._resize();
+					volumeControl.fadeIn( "fast" );
+					self._updateVolumeState();
+					self._updateSeekBar();
+				} else {
+					self.isVolumeHide = true;
+					volumeControl.fadeOut( "fast", function () {
+						self._resize();
+					});
+					self._updateSeekBar();
+				}
+			});
+
+			volumeBar.bind( "vmousedown.multimediaview", function ( e ) {
+				var baseX = e.clientX,
+					volumeGuideLeft = volumeGuide.offset().left,
+					volumeGuideWidth = volumeGuide.width(),
+					volumeBase = volumeGuideLeft + volumeGuideWidth,
+					handlerOffset = volumeHandle.offset(),
+					volumerate = ( baseX - volumeGuideLeft ) / volumeGuideWidth,
+					currentVolume = ( baseX - volumeGuideLeft ) / volumeGuideWidth;
+
+				self._endTimer();
+				self._setVolume( currentVolume.toFixed( 2 ) );
+
+				e.preventDefault();
+				e.stopPropagation();
+
+				$( document ).bind( "vmousemove.multimediaview", function ( e ) {
+					var currentX = e.clientX,
+						currentVolume = ( currentX - volumeGuideLeft ) / volumeGuideWidth;
+
+					self._setVolume( currentVolume.toFixed( 2 ) );
+
+					e.preventDefault();
+					e.stopPropagation();
+				}).bind( "vmouseup.multimediaview", function () {
+					$( document ).unbind( "vmousemove.multimediaview vmouseup.multimediaview" );
+
+					if ( self.options.mediatype == "video" ) {
+						self._startTimer();
+					}
+				});
+			});
+		},
+		_removeEvent : function () {
+			var self = this,
+				view = self.element,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				playpauseButton = control.find( ".ui-playpausebutton" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				seekBar = control.find( ".ui-seekbar" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				volumeBar = volumeControl.find( ".ui-volumebar" ),
+				volumeHandle = volumeControl.find( ".ui-handler" );
+
+			view.unbind( ".multimediaview" );
+			playpauseButton.unbind( ".multimediaview" );
+			fullscreenButton.unbind( ".multimediaview" );
+			seekBar.unbind( ".multimediaview" );
+			volumeBar.unbind( ".multimediaview" );
+			volumeHandle.unbind( ".multimediaview" );
+		},
+		_createControl : function () {
+			var self = this,
+				view = self.element,
+				control = $( "<span></span>" ),
+				playpauseButton = $( "<span></span>" ),
+				seekBar = $( "<span></span>" ),
+				timestampLabel = $( "<span><p>00:00:00</p></span>" ),
+				durationLabel = $( "<span><p>00:00:00</p></span>" ),
+				volumeButton = $( "<span></span>" ),
+				volumeControl = $( "<span></span>" ),
+				volumeBar = $( "<div></div>" ),
+				volumeGuide = $( "<span></span>" ),
+				volumeValue = $( "<span></span>" ),
+				volumeHandle = $( "<span></span>" ),
+				fullscreenButton = $( "<span></span>" ),
+				durationBar = $( "<span></span>" ),
+				currenttimeBar = $( "<span></span>" );
+
+			control.addClass( "ui-" + self.role + "-control" );
+			playpauseButton.addClass( "ui-playpausebutton ui-button" );
+			seekBar.addClass( "ui-seekbar" );
+			timestampLabel.addClass( "ui-timestamplabel" );
+			durationLabel.addClass( "ui-durationlabel" );
+			volumeButton.addClass( "ui-volumebutton ui-button" );
+			fullscreenButton.addClass( "ui-fullscreenbutton ui-button" );
+			durationBar.addClass( "ui-duration" );
+			currenttimeBar.addClass( "ui-currenttime" );
+			volumeControl.addClass( "ui-volumecontrol" );
+			volumeBar.addClass( "ui-volumebar" );
+			volumeGuide.addClass( "ui-guide" );
+			volumeValue.addClass( "ui-value" );
+			volumeHandle.addClass( "ui-handler" );
+
+			seekBar.append( durationBar ).append( currenttimeBar ).append( durationLabel ).append( timestampLabel );
+
+			playpauseButton.addClass( "ui-play-icon" );
+			if ( view[0].muted ) {
+				$( volumeButton ).addClass( "ui-mute-icon" );
+			} else {
+				$( volumeButton ).addClass( "ui-volume-icon" );
+			}
+
+			volumeBar.append( volumeGuide ).append( volumeValue ).append( volumeHandle );
+			volumeControl.append( volumeBar );
+
+			control.append( playpauseButton ).append( seekBar ).append( volumeControl ).append( volumeButton );
+
+			if ( self.element[0].nodeName === "VIDEO" ) {
+				$( fullscreenButton ).addClass( "ui-fullscreen-on" );
+				control.append( fullscreenButton );
+			}
+			volumeControl.hide();
+
+			return control;
+		},
+		_startTimer : function ( duration ) {
+			this._endTimer();
+
+			if ( !duration ) {
+				duration = 3000;
+			}
+
+			var self = this,
+				view = self.element,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				volumeControl = control.find( ".ui-volumecontrol" );
+
+			self.controlTimer = setTimeout( function () {
+				self.isVolumeHide = true;
+				self.isControlHide = true;
+				self.controlTimer = null;
+				volumeControl.hide();
+				control.fadeOut( "fast" );
+			}, duration );
+		},
+		_endTimer : function () {
+			if ( this.controlTimer ) {
+				clearTimeout( this.controlTimer );
+				this.controlTimer = null;
+			}
+		},
+		_convertTimeFormat : function ( systime ) {
+			var ss = parseInt( systime % 60, 10 ).toString(),
+				mm = parseInt( ( systime / 60 ) % 60, 10 ).toString(),
+				hh = parseInt( systime / 3600, 10 ).toString(),
+				time =	( ( hh.length < 2  ) ? "0" + hh : hh ) + ":" +
+						( ( mm.length < 2  ) ? "0" + mm : mm ) + ":" +
+						( ( ss.length < 2  ) ? "0" + ss : ss );
+
+			return time;
+		},
+		_updateSeekBar : function ( currenttime ) {
+			var self = this,
+				view = self.element,
+				duration = view[0].duration,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				seekBar = control.find(  ".ui-seekbar"  ),
+				durationBar = seekBar.find( ".ui-duration" ),
+				currenttimeBar = seekBar.find( ".ui-currenttime" ),
+				timestampLabel = control.find( ".ui-timestamplabel" ),
+				durationOffset = durationBar.offset(),
+				durationWidth = durationBar.width(),
+				durationHeight = durationBar.height(),
+				timebarWidth = 0;
+
+			if ( typeof currenttime == "undefined" ) {
+				currenttime = view[0].currentTime;
+			}
+			timebarWidth = parseInt( currenttime / duration * durationWidth, 10 );
+			durationBar.offset( durationOffset );
+			currenttimeBar.offset( durationOffset ).width( timebarWidth );
+			timestampLabel.find( "p" ).text( self._convertTimeFormat( currenttime ) );
+		},
+		_updateVolumeState : function () {
+			var self = this,
+				view = self.element,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				volumeControl = control.find( ".ui-volumecontrol" ),
+				volumeButton = control.find( ".ui-volumebutton" ),
+				volumeBar = volumeControl.find( ".ui-volumebar" ),
+				volumeGuide = volumeControl.find( ".ui-guide" ),
+				volumeValue = volumeControl.find( ".ui-value" ),
+				volumeHandle = volumeControl.find( ".ui-handler" ),
+				handlerWidth = volumeHandle.width(),
+				handlerHeight = volumeHandle.height(),
+				volumeGuideHeight = volumeGuide.height(),
+				volumeGuideWidth = volumeGuide.width(),
+				volumeGuideTop = 0,
+				volumeGuideLeft = 0,
+				volumeBase = 0,
+				handlerOffset = null,
+				volume = view[0].volume;
+
+			volumeGuideTop = parseInt( volumeGuide.offset().top, 10 );
+			volumeGuideLeft = parseInt( volumeGuide.offset().left, 10 );
+			volumeBase = volumeGuideLeft;
+			handlerOffset = volumeHandle.offset();
+			handlerOffset.top = volumeGuideTop - parseInt( ( handlerHeight - volumeGuideHeight ) / 2, 10 );
+			handlerOffset.left = volumeBase + parseInt( volumeGuideWidth * volume, 10 ) - parseInt( handlerWidth / 2, 10 );
+			volumeHandle.offset( handlerOffset );
+			volumeValue.width( parseInt( volumeGuideWidth * ( volume ), 10 ) );
+		},
+		_setVolume : function ( value ) {
+			var viewElement = this.element[0];
+
+			if ( value < 0.0 || value > 1.0 ) {
+				return;
+			}
+
+			viewElement.volume = value;
+		},
+		_fitContentArea: function ( page, parent ) {
+			if ( typeof parent == "undefined" ) {
+				parent = window;
+			}
+
+			var $page = $( page ),
+				$content = $( ".ui-content:visible:first" ),
+				hh = $( ".ui-header:visible" ).outerHeight() || 0,
+				fh = $( ".ui-footer:visible" ).outerHeight() || 0,
+				pt = parseFloat( $content.css( "padding-top" ) ),
+				pb = parseFloat( $content.css( "padding-bottom" ) ),
+				wh = ( ( parent === window ) ? window.innerHeight : $( parent ).height() ),
+				height = wh - ( hh + fh ) - ( pt + pb );
+
+			$content.offset( {
+				top : ( hh + pt )
+			}).height( height );
+		},
+		width : function ( value ) {
+			var self = this,
+				args = arguments,
+				view = self.element;
+
+			if ( args.length === 0 ) {
+				return view.width();
+			}
+			if ( args.length === 1 ) {
+				view.width( value );
+				self._resize();
+			}
+		},
+		height : function ( value ) {
+			var self = this,
+				view = self.element,
+				args = arguments;
+
+			if ( args.length === 0 ) {
+				return view.height();
+			}
+			if ( args.length === 1 ) {
+				view.height( value );
+				self._resize();
+			}
+		},
+		size : function ( width, height ) {
+			var self = this,
+				view = self.element;
+
+			view.width( width ).height( height );
+			self._resize();
+		},
+		fullscreen : function ( value ) {
+			var self = this,
+				view = self.element,
+				control = view.parent().find( ".ui-multimediaview-control" ),
+				fullscreenButton = control.find( ".ui-fullscreenbutton" ),
+				args = arguments,
+				option = self.options,
+				currentPage = $( ".ui-page-active" );
+
+			if ( args.length === 0 ) {
+				return option.fullscreen;
+			}
+			if ( args.length === 1 ) {
+				view.parents( ".ui-content" ).scrollview( "scrollTo", 0, 0 );
+
+				this.options.fullscreen = value;
+				if ( value ) {
+					currentPage.children( ".ui-header" ).hide();
+					currentPage.children( ".ui-footer" ).hide();
+					this._fitContentArea( currentPage );
+					fullscreenButton.removeClass( "ui-fullscreen-on" ).addClass( "ui-fullscreen-off" );
+				} else {
+					currentPage.children( ".ui-header" ).show();
+					currentPage.children( ".ui-footer" ).show();
+					this._fitContentArea( currentPage );
+					fullscreenButton.removeClass( "ui-fullscreen-off" ).addClass( "ui-fullscreen-on" );
+				}
+				self._resize();
+			}
+		},
+		refresh : function () {
+			this._resize();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.multimediaview.prototype.enhanceWithin( e.target );
+	});
+} ( jQuery, document, window ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/*
+ * nocontents widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'nocontents'.
+ *  data-text1: top message.
+ *  data-text2: bottom message.
+ *  data-type: type of nocontents. You can set text, picture, multimedia and unnamed.
+ *
+ * APIs
+ *
+ *  N/A
+ *
+ * Events
+ *
+ *  N/A
+ *
+ * Examples
+ *
+ * Text Type
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2" data-type="text"></div>
+ *
+ * Picture Type
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2" data-type="picture"></div>
+ *
+ * Multimedia Type
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2" data-type="multimedia"></div>
+ *
+ * Unnamed Type
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2"></div>
+ * or
+ * <div data-role="nocontents" id="nocontents" data-text1="Text1" data-text2="Text2" data-type="unnamed"></div>
+ *
+ */
+
+(function ( $, window, undefined ) {
+	$.widget( "tizen.nocontents", $.mobile.widget, {
+
+		max_height: 0,
+		container: null,
+		icon_img: null,
+		text0_bg: null,
+		text1_bg: null,
+
+		_get_height: function () {
+			var $page = $('.ui-page'),
+				$content = $page.children('.ui-content'),
+				$header = $page.children('.ui-header'),
+				$footer = $page.children('.ui-footer'),
+				header_h = $header.outerHeight() || 0,
+				footer_h = $footer.outerHeight() || 0,
+				padding_t = parseFloat( $content.css('padding-top') ) || 0,
+				padding_b = parseFloat( $content.css('padding-bottom') ) || 0,
+				content_h = $(window).height() - header_h - footer_h -
+					(padding_t + padding_b) * 2,
+				container_h = this.container.height();
+
+			return ( content_h < container_h ? container_h : content_h );
+		},
+
+		_align: function () {
+			var content_height = this._get_height(),
+				icon_height = this.icon_img.height(),
+				icon_width = this.icon_img.width(),
+				content_gap = 46,
+				text0_height = this.text0_bg.height() || 0,
+				text1_height = this.text1_bg.height() || 0,
+				text_top = 0,
+				icon_top = (content_height -
+					(icon_height + content_gap +
+					 text0_height + text1_height)) / 2;
+
+			if ( icon_top < content_gap ) {
+				icon_top = content_gap;
+			}
+
+			this.container.height( content_height );
+
+			this.icon_img.css( 'left',
+				($(window).width() - icon_width) / 2 );
+			this.icon_img.css( 'top', icon_top );
+
+			text_top = icon_top + icon_height + content_gap;
+
+			this.text0_bg.css( 'top', text_top );
+			this.text1_bg.css( 'top', text_top + text0_height );
+		},
+
+		_create: function () {
+			var icon_type = $( this.element ).jqmData('type'),
+				text = new Array(2);
+
+			if ( icon_type === undefined ||
+					(icon_type !== "picture" &&
+					 icon_type !== "multimedia" &&
+					 icon_type !== "text") ) {
+				icon_type = "unnamed";
+			}
+
+			text[0] = $( this.element ).jqmData('text1');
+			text[1] = $( this.element ).jqmData('text2');
+
+			if ( text[0] === undefined ) {
+				text[0] = "";
+			}
+
+			if ( text[1] === undefined ) {
+				text[1] = "";
+			}
+
+			this.container = $('<div class="ui-nocontents"/>');
+			this.icon_img = $('<div class="ui-nocontents-icon-' +
+					icon_type + '"/>');
+
+			this.text0_bg = $('<div class="ui-nocontents-text">' +
+					text[0] + '<div>');
+			this.text1_bg = $('<div class="ui-nocontents-text">' +
+					text[1] + '<div>');
+
+			this.container.append( this.icon_img );
+			this.container.append( this.text0_bg );
+			this.container.append( this.text1_bg );
+
+			$( this.element ).append( this.container );
+
+			this._align();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( e.target ).find(":jqmData(role='nocontents')").nocontents();
+	});
+} ( jQuery, this ));
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/*
+ * Notification widget
+ *
+ * HTML Attributes
+ *
+ *  data-role: set to 'notification'.
+ *  data-type: 'ticker' or 'popup'.
+ *  data-text1: top text for tickernoti, text to show for smallpopup.
+ *  data-text2: bottom text for tickernoti, smallpopup will ignore this text.
+ *  data-param: parameter for 'tapped' event.
+ *  data-interval: time to showing. If don't set, will show infinitely.
+ *
+ * APIs
+ *
+ *  show(): show the notification.
+ *  hide(): hide the notification.
+ *
+ * Events
+ *
+ *  tapped: When you tap or click the smallpopup, this event will be raised.
+ *
+ * Examples
+ *
+ * // tickernoti
+ * <div data-role="notification" id="notification" data-type="ticker" data-text1="text1" data-text2="text2" data-param="parameters" data-interval="3000"></div>
+ *
+ * // smallpopup
+ * <div data-role="notification" id="notification" data-type="popup" data-text1="text1" data-param="parameters" data-interval="3000"></div>
+ *
+ * // event
+ * $('#notification-demo').bind('tapped', function (e, m) {
+ *	alert('notification is tapped\nparameter:"' + m + '"');
+ * });
+ *
+ */
+
+(function ( $, window ) {
+	$.widget( "tizen.notification", $.mobile.widget, {
+		btn: null,
+		param: null,
+		interval: null,
+		seconds: null,
+		running: false,
+
+		_refresh: function () {
+			this._del_event();
+			this._update();
+			this._add_event();
+
+			$( this.html ).addClass("fix");
+		},
+
+		show: function () {
+			if ( this.running ) {
+				this._refresh();
+				return;
+			}
+
+			this._update();
+
+			this._add_event();
+
+			this.running = true;
+			$( this.html ).addClass("show");
+		},
+
+		hide: function () {
+			if ( !this.running ) {
+				return;
+			}
+
+			$( this.html ).addClass("hide");
+			$( this.html ).removeClass("show").removeClass("fix");
+			this._del_event();
+
+			this.running = false;
+		},
+
+		close: function () {
+			$( this.html ).removeClass("show").removeClass("hide").removeClass("fix");
+			this._del_event();
+
+			this.running = false;
+		},
+
+		_get_container: function () {
+			if ( this.type === 'ticker' ) {
+				return $( this.element ).find(".ui-ticker");
+			}
+
+			return $( this.element ).find(".ui-smallpopup");
+		},
+
+		_add_event: function () {
+			var self = this,
+				container = this._get_container();
+
+			if ( this.type === 'ticker' ) {
+				container.find(".ui-ticker-btn").append( this.btn );
+
+				this.btn.bind( "vmouseup", function () {
+					self.hide();
+				});
+			}
+
+			container.bind( 'vmouseup', function () {
+				self.element.trigger( 'tapped', self.param );
+				self.hide();
+			});
+
+			if ( this.seconds !== undefined && this.second !== 0 ) {
+				this.interval = setInterval( function () {
+					self.hide();
+				}, this.seconds );
+			}
+		},
+
+		_del_event: function () {
+			var container = this._get_container();
+
+			if ( this.type === 'ticker' ) {
+				this.btn.unbind("vmouseup");
+			}
+			container.unbind('vmouseup');
+			clearInterval( this.interval );
+		},
+
+		_set_position: function () {
+			var container = this._get_container(),
+				container_h = parseFloat( container.css('height') ),
+				$page = $('.ui-page'),
+				$footer = $page.children('.ui-footer'),
+				footer_h = $footer.outerHeight() || 0,
+				position = $(window).height() - container_h - footer_h;
+
+			container.css( 'top', position );
+		},
+
+		_update: function () {
+			var text = new Array(2);
+
+			if ( this.html ) {
+				this.html.detach();
+			}
+
+			text[0] = $(this.element).jqmData('text1');
+			text[1] = $(this.element).jqmData('text2');
+			this.param = $(this.element).jqmData('param');
+			this.seconds = $(this.element).jqmData('interval');
+			this.type = $(this.element).jqmData('type') || 'popup';
+
+			if ( this.type === 'ticker' ) {
+				this.html = $('<div class="ui-ticker">' +
+						'<div class="ui-ticker-icon"></div>' +
+						'<div class="ui-ticker-text1-bg">' +
+						text[0] + '</div>' +
+						'<div class="ui-ticker-text2-bg">' +
+						text[1] + '</div>' +
+						'<div class="ui-ticker-body"></div>' +
+						'<div class="ui-ticker-btn"></div>' +
+						'</div>');
+
+				$( this.element ).append( this.html );
+			} else {
+				this.html = $('<div class="ui-smallpopup">' +
+						'<div class="ui-smallpopup-text-bg">' +
+						text[0] + '</div>' +
+						'</div>');
+
+				$( this.element ).append( this.html );
+
+				this._set_position();
+			}
+		},
+
+		_create: function () {
+			this.btn = $("<a href='#' class='ui-input-cancel' title='close' data-theme='s'>Close</a>")
+				.tap( function ( event ) {
+					event.preventDefault();
+				})
+				.buttonMarkup({
+					inline: true,
+					corners: true,
+					shadow: true
+				});
+
+			this._update();
+			this.running = false;
+		}
+	}); // End of widget
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( e.target ).find(":jqmData(role='notification')").notification();
+	});
+
+	$( document ).bind( "pagebeforehide", function ( e ) {
+		$( e.target ).find(":jqmData(role='notification')").notification('close');
+	});
+}( jQuery, this ));
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// optionheader provides a collapsible toolbar for buttons and
+// segmented controls directly under the title bar. It
+// wraps a jQuery Mobile grid in a collapsible container; clicking
+// on the container, or on one of the buttons inside the container,
+// will collapse it.
+//
+// To add an option header to a page, mark up the header with a
+// data-role="optionheader" attribute, as shown in this example:
+//
+// <div data-role="header">
+//     <h1>Option header - 3 buttons example</h1>
+//     <div data-role="optionheader">
+//        <div class="ui-grid-b">
+//             <div class="ui-block-a"><a data-role="button">Previous</a></div>
+//             <div class="ui-block-b"><a data-role="button">Cancel</a></div>
+//             <div class="ui-block-c"><a data-role="button">Next</a></div>
+//        </div>
+//     </div>
+// </div>
+//
+// The optionheader can also be used inline (e.g. in a content block or
+// a widget).
+//
+// Alternatively, use $('...').optionheader() to apply programmatically.
+//
+// The grid inside the optionheader should be marked up as for
+// a standard jQuery Mobile grid. (The widget has been tested with one
+// or two rows of 2-4 columns each.)
+//
+// Note that if you use this with fixed headers, you may find that
+// expanding the option header increases the page size so that scrollbars
+// appear (jQuery Mobile's own collapsible content areas cause the
+// same issue). You can alleviate this somewhat by calling the show() method
+// on the page toolbars each time the size of the header changes.
+//
+// The widget is configurable via a data-options attribute on the same
+// div as the data-role="optionheader" attribute, e.g.
+//
+// <div data-role="header">
+//     <h1>Option header - configured</h1>
+//     <div data-role="optionheader" data-options='{"collapsed":true, "duration":1.5}'>
+//        <div class="ui-grid-b">
+//             <div class="ui-block-a"><a data-role="button">Previous</a></div>
+//             <div class="ui-block-b"><a data-role="button">Cancel</a></div>
+//             <div class="ui-block-c"><a data-role="button">Next</a></div>
+//        </div>
+//     </div>
+// </div>
+//
+// Options can also be set with $(...).optionheader('option', 'name', value).
+// However, if you do this, you'll need to call $(...).optionheader('refresh')
+// afterwards for the new values to take effect (note that optionheader()
+// can be applied multiple times to an element without side effects).
+//
+// See below for the available options.
+//
+// Theme: by default, gets a 'b' swatch; override with data-theme="X"
+// as per usual
+//
+// Options (can be set with a data-options attribute):
+//
+//   {Boolean} [showIndicator=true] Set to true (the default) to show
+//   the upward-pointing arrow indicator on top of the title bar.
+//   {Boolean} [startCollapsed=false] Sets the appearance when the option
+//   header is first displayed; defaults to false (i.e. show the header
+//   expanded on first draw). NB setting this option later has no
+//   effect: use collapse() to collapse a widget which is already
+//   drawn.
+//   {Boolean} [expandable=true] Sets whether the header will expand
+//   in response to clicks; default = true.
+//   {Float} [duration=0.25] Duration of the expand/collapse animation.
+//
+// Methods (see below for docs):
+//
+//   toggle(options)
+//   expand(options)
+//   collapse(options)
+//
+// Events:
+//
+//   expand: Triggered when the option header is expanded
+//   collapse: Triggered when the option header is collapsed
+//
+
+
+(function ($, undefined) {
+	$.widget("tizen.optionheader", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(role='optionheader')",
+			showIndicator: true,
+			theme: 's',
+			startCollapsed: false,
+			expandable: true,
+			duration: 0.25,
+			collapseOnInit : true,
+			default_font_size : $('html').css('font-size')
+		},
+		collapsedHeight: '5px',
+
+		_create: function () {
+			var options,
+				theme,
+				self = this,
+				elementHeight = 106,
+				parentPage,
+				dataOptions = this.element.jqmData( 'options' ),
+				page = this.element.closest( ':jqmData(role="page")' );
+			// parse data-options
+			$.extend( this.options, dataOptions );
+
+			this.isCollapsed = this.options.collapseOnInit;
+			this.expandedHeight = null;
+
+			// parse data-theme and reset options.theme if it's present
+			theme = this.element.jqmData( 'theme' ) || this.options.theme;
+			this.options.theme = theme;
+
+			this.element.closest( ':jqmData(role="header")' ).addClass( "ui-option-header-resizing" );
+
+			// set up the click handler; it's done here so it can
+			// easily be removed, as there should only be one instance
+			// of the handler function for each class instance
+			this.clickHandler = function () {
+				self.toggle();
+			};
+
+			/* Apply REM scaling */
+			elementHeight = elementHeight / ( 36 / parseInt(this.option.default_font_size) );
+
+			if ( this.element.height() < elementHeight ) {
+				this.element.css( "height", elementHeight );
+			}
+
+			// get the element's dimensions
+			// and to set its initial collapse state;
+			// either do it now (if the page is visible already)
+			// or on pageshow
+
+			if ( page.is(":visible") ) {
+				self.refresh();
+				self._realize();
+			} else {
+				self.refresh();
+
+				page.bind( "pagebeforeshow", function () {
+					self._setArrowLeft();
+					self._realize();
+				});
+			}
+			self._setArrowLeft();
+	//        this.refresh();
+		},
+
+		_realize: function () {
+			if ( !this.expandedHeight ) {
+				this.expandedHeight = this.element.height();
+			}
+
+			if ( this.isCollapsed ) {
+	//        if (this.options.startCollapsed) {
+				this.collapse( {duration: 0} );
+			}
+		},
+
+		_setArrowLeft: function () {
+			var matchingBtn = $( this.element ).jqmData( "for" ),
+				arrowCenter = 14,
+				btn2Position = 10,
+				btn3Position = 144,
+				matchBtn = $( this.element ).parents( ".ui-page" ).find( "#" + matchingBtn ),
+				buttonRight = matchBtn.nextAll().is( "a" ) ? btn3Position : btn2Position;
+				/* Apply REM scaling */
+				scaleFactor = ( 36 / parseInt(this.option.default_font_size) );
+
+			if ( $(this.element).parents(".ui-page").find( "#" + matchingBtn ).length != 0 ) {
+
+				if ( this.options.expandable ) {
+					matchBtn.bind( 'vclick', this.clickHandler );
+				} else {
+					matchBtn.unbind( 'vclick', this.clickHandler );
+				}
+
+				// decide arrow Button position
+				if ( matchBtn.css( "left" ) && matchBtn.css( "left" ) != "auto" ) {
+					$( ".ui-triangle-image" ).css( "left", matchBtn.width() / 2 + parseInt(matchBtn.css( "left" ), 10) - ( arrowCenter / scaleFactor ) + "px" );
+				} else if ( matchBtn.css("right") ) {
+					$( ".ui-triangle-image" ).css( "left", document.documentElement.clientWidth - matchBtn.width() / 2 - ( ( buttonRight - arrowCenter ) / scaleFactor ) + "px" );
+				}
+			} else {
+				$( ".ui-triangle-image" ).css( "left", document.documentElement.clientWidth / 2 - ( arrowCenter / scaleFactor ) + "px" );
+			}
+		},
+		// Draw the option header, according to current options
+		refresh: function () {
+			var el = this.element,
+				arrow = $( '<div class="ui-option-header-triangle-arrow"></div>' ),
+				optionHeaderClass = 'ui-option-header',
+				gridRowSelector = '.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d,.ui-grid-e',
+				theme = this.options.theme,
+				numRows,
+				rowsClass,
+				themeClass,
+				klass,
+				o = $.extend( {grid: null} ),
+				$kids = el.find( "div" ).eq( 0 ).children().children(),
+				letter,
+				gridCols = {solo: 1, a: 2, b: 3, c: 4, d: 5},
+				grid = o.grid;
+
+			if ( !grid ) {
+				if ( $kids.length <= 5 ) {
+					for ( letter in gridCols ) {
+						if ( gridCols[ letter ] === $kids.length ) {
+							grid = letter;
+						}
+					}
+					numRows = $kids.length / gridCols[grid];
+				} else {
+					numRows = 2;
+				}
+			}
+
+	        // count ui-grid-* elements to get number of rows
+	//        numRows = el.find(gridRowSelector).length;
+
+	        // ...at least one row
+	//        numRows = Math.max(1, numRows);
+
+	        // add classes to outer div:
+	        //   ui-option-header-N-row, where N = options.rows
+	        //   ui-bar-X, where X = options.theme (defaults to 'c')
+	        //   ui-option-header
+			rowsClass = 'ui-option-header-' + numRows + '-row';
+			themeClass = 'ui-body-' + this.options.theme;
+
+			el.removeClass( rowsClass ).addClass( rowsClass );
+			el.removeClass( themeClass ).addClass( themeClass );
+			el.removeClass( optionHeaderClass ).addClass( optionHeaderClass );
+
+			// remove any arrow currently visible
+			el.prev( '.ui-option-header-triangle-arrow' ).remove();
+	//        el.prev('.ui-triangle-container').remove();
+
+			// if there are elements inside the option header
+			// and this.options.showIndicator,
+			// insert a triangle arrow as the first element inside the
+			// optionheader div to show the header has hidden content
+			if ( this.options.showIndicator ) {
+				el.before( arrow );
+				arrow.append("<div class='ui-triangle-image'></div>");
+	//            arrow.triangle({"color": el.css('background-color'), offset: "50%"});
+			}
+
+	        // if expandable, bind clicks to the toggle() method
+			if ( this.options.expandable ) {
+	//            el.unbind('vclick', this.clickHandler).bind('vclick', this.clickHandler);
+	//            arrow.unbind('vclick', this.clickHandler).bind('vclick', this.clickHandler);
+				el.bind( 'vclick', this.clickHandler );
+				arrow.bind( 'vclick', this.clickHandler );
+
+			} else {
+				el.unbind( 'vclick', this.clickHandler );
+				arrow.unbind( 'vclick', this.clickHandler );
+			}
+
+			// for each ui-grid-a element, add a class ui-option-header-row-M
+			// to it, where M is the xpath position() of the div
+	/*        el.find(gridRowSelector).each(function (index) {
+	            var klass = 'ui-option-header-row-' + (index + 1);
+	            $(this).removeClass(klass).addClass(klass);
+	        });*/
+			klass = 'ui-option-header-row-' + ( numRows );
+			el.find( "div" ).eq( 0 ).removeClass( klass ).addClass( klass );
+
+			// redraw the buttons (now that the optionheader has the right
+			// swatch)
+			el.find( '.ui-btn' ).each(function () {
+				$( this ).attr( 'data-' + $.mobile.ns + 'theme', theme );
+
+				// hack the class of the button to remove the old swatch
+				var klass = $( this ).attr( 'class' );
+				klass = klass.replace(/ui-btn-up-\w{1}\s*/, '');
+				klass = klass + ' ui-btn-up-' + theme;
+				$( this ).attr( 'class', klass );
+			});
+		},
+
+		_setHeight: function ( height, isCollapsed, options ) {
+			var self = this,
+				elt = this.element.get( 0 ),
+				duration,
+				commonCallback,
+				callback,
+				handler;
+
+			options = options || {};
+
+			// set default duration if not specified
+			duration = options.duration;
+			if ( typeof duration == 'undefined' ) {
+				duration = this.options.duration;
+			}
+
+			// the callback to always call after expanding or collapsing
+			commonCallback = function () {
+				self.isCollapsed = isCollapsed;
+
+				if ( isCollapsed ) {
+					self.element.trigger( 'collapse' );
+				} else {
+					self.element.trigger( 'expand' );
+				}
+			};
+
+			// combine commonCallback with any user-specified callback
+			if ( options.callback ) {
+				callback = function () {
+					options.callback();
+					commonCallback();
+				};
+			} else {
+				callback = function () {
+					commonCallback();
+				};
+			}
+
+			// apply the animation
+			if ( duration > 0 && $.support.cssTransitions ) {
+				// add a handler to invoke a callback when the animation is done
+
+				handler = {
+					handleEvent: function ( e ) {
+						elt.removeEventListener( 'webkitTransitionEnd', this );
+						self.element.css( '-webkit-transition', null );
+						callback();
+					}
+				};
+
+				elt.addEventListener( 'webkitTransitionEnd', handler, false );
+
+				// apply the transition
+				this.element.css( '-webkit-transition', 'height ' + duration + 's ease-out' );
+				this.element.css( 'height', height );
+			} else {
+			// make sure the callback gets called even when there's no
+			// animation
+				this.element.css( 'height', height );
+				callback();
+			}
+		},
+
+		/**
+		* Toggle the expanded/collapsed state of the widget.
+		* {Object} [options] Configuration for the expand/collapse
+		* {Integer} [options.duration] Duration of the expand/collapse;
+		* defaults to this.options.duration
+		* {Function} options.callback Function to call after toggle completes
+		*/
+
+		toggle: function ( options ) {
+			var toggle_header = this.element.parents( ":jqmData(role='header')" ),
+				toggle_content = this.element.parents( ":jqmData(role='page')" ).find( ".ui-content" ),
+				CollapsedTop = 110,
+				ExpandedTop = 206,
+				CalculateTime,
+				/* Apply REM scaling */
+				scaleFactor = ( 36 / parseInt($('html').css('font-size')));
+			if ( toggle_header.children().is( ".input-search-bar" ) ) {
+				CollapsedTop = 218;
+				ExpandedTop = 314;
+			}
+
+			/* Scale Factor */
+			CollapsedTop = ( CollapsedTop / scaleFactor );
+			ExpandedTop = ( ExpandedTop / scaleFactor );
+
+			if ( $( window ).scrollTop() <= CollapsedTop ) {
+				toggle_header.css( "position", "relative" );
+				toggle_content.css( "top", "0px" );
+			}
+
+			if ( this.isCollapsed ) {
+				this.expand( options );
+
+				if ( $( window ).scrollTop() <= ExpandedTop ) {
+					CalculateTime = setTimeout( function () {
+						toggle_header.css( 'position', 'fixed' );
+						toggle_content.css( 'top', ExpandedTop + "px" );
+					}, 500 );
+				} else {
+					//   Need to move scroll top
+					toggle_header.css( 'position', 'fixed' );
+					toggle_content.css( 'top', ExpandedTop + "px" );
+				}
+				this.options.collapseOnInit = false;
+			} else {
+				this.collapse( options );
+				if ( $(window).scrollTop() <= ExpandedTop ) {
+					CalculateTime = setTimeout( function () {
+						toggle_header.css( 'position', 'fixed' );
+						toggle_content.css( 'top', CollapsedTop + "px" );
+					}, 500 );
+				} else {
+					toggle_header.css( 'position', 'fixed' );
+					toggle_content.css( 'top', CollapsedTop + "px" );
+				}
+			}
+			this.options.collapseOnInit = true;
+		},
+
+		_setDisabled: function ( value ) {
+			$.Widget.prototype._setOption.call( this, "disabled", value );
+			this.element.add( this.element.prev( ".ui-triangle-container" ) )[value ? "addClass" : "removeClass"]("ui-disabled");
+		},
+		/**
+		* Takes the same options as toggle()
+		*/
+		collapse: function ( options ) {
+			var collapsedBarHeight = 10,
+			scaleFactor = ( 36 / parseInt($('html').css('font-size')));
+
+			collapsedBarHeight = collapsedBarHeight / scaleFactor;
+
+	//        if (!this.isCollapsed) {
+			this._setHeight( collapsedBarHeight + "px", true, options );
+	//        }
+		},
+
+		/**
+		* Takes the same options as toggle()
+		*/
+		expand: function ( options ) {
+	//        if (this.isCollapsed) {
+			this._setHeight( this.expandedHeight, false, options );
+	//        }
+		}
+	});
+
+	// auto self-init widgets
+	$(document).bind("pagecreate create", function ( e ) {
+	    $($.tizen.optionheader.prototype.options.initSelector, e.target)
+			.not(":jqmData(role='none'), :jqmData(role='nojs')")
+			.optionheader();
+	});
+
+}(jQuery) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Youmin Ha <youmin.ha@samsung.com>
+ */
+
+/**
+ * Pagecontrol widget shows number bullets, receives touch event for each bullet,
+ * and runs your callback for each touch event.
+ *
+ * HTML Attributes:
+ *
+ *		Pagecontrol widget uses <div> element as an element itself. It takes following attributes.
+ *
+ *		data-role:	This widget must have 'pagecontrol' as data-role value.
+ *		data-max:	Maximum nimber of pagecontrol bullets. This property must not exceed 10.
+ *		data-initVal:	Initially selected value of the pagecontrol widget. Must between 1 and data-max. If this attribute is not given, initial value is set to 1.
+ *
+ * APIs:
+ *
+ *		setValue( value )
+ *			: Set current value. Actually triggers 'change' event to the widget with given value.
+ *			@param[in] value	A value to be changed.
+ *
+ *		getValue( )
+ *			: Get current value.
+ *			@return		Current value.
+ *
+ * Events:
+ *
+ *		change:	Raised when a value is changed, by setting it by javascript, or by user's touch event.
+ *
+ * Examples:
+ *
+ *		<div id="foo" data-role="pagecontrol" data-max="10"></div>
+ *		...
+ *		<script language="text/javascript">
+ *
+ *		// Bind callback to value change
+ *		$('foo').bind('change', function (event, value) {
+ *			// event: 'change'
+ *			// value: changed value
+ *		});
+ *
+ *		// Set a value to 3
+ *		$('foo').trigger('change', 3);
+ *		</script>
+ */
+
+(function ($, undefined) {
+	$.widget( "tizen.pagecontrol", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(role='pagecontrol')"
+		},
+
+		_create: function ( ) {
+		},
+
+		_init: function ( ) {
+			var self = this,
+				e = this.element,
+				maxVal = e.data( "max" ),
+				currentVal = e.attr( "data-initVal" ),
+				i = 0,
+				btn = null,
+				buf = null,
+				page_margin_class = 'page_n_margin_44';
+
+
+			// Set default values
+			if ( ! maxVal ) {
+				maxVal = 1;
+			} else if ( maxVal > 10 ) {
+				maxVal = 10;
+			}
+			e.data( "max", maxVal );
+
+			if ( ! currentVal ) {
+				currentVal = 1;
+			}
+			e.data( "current", currentVal );
+
+			// Set pagecontrol class
+			e.addClass( 'pagecontrol' );
+
+			// Set empty callback variable
+			self.changeCallback = null;
+
+			// Calculate left/right margin
+			if ( maxVal <= 7 ) {
+				page_margin_class = 'page_n_margin_44';
+			} else if ( maxVal == 8 ) {
+				page_margin_class = 'page_n_margin_35';
+			} else if ( maxVal == 9 ) {
+				page_margin_class = 'page_n_margin_26';
+			} else {
+				page_margin_class = 'page_n_margin_19';
+			}
+
+			// subroutine: find a child by value
+			function getBtn( value ) {
+				return e.children( ":jqmData(value='" + value + "')" );
+			}
+
+			// subroutine: change active button by value
+			function changeActiveBtn( newNum ) {
+				var oldNum = e.data( 'current' );
+
+				// Check value
+				if ( newNum < 1 || newNum > e.max ) {
+					return false;
+				}
+
+				getBtn( oldNum ).removeClass( 'page_n_' + oldNum )
+						.addClass( 'page_n_dot' );
+				getBtn( newNum ).removeClass( 'page_n_dot' )
+						.addClass( 'page_n_' + newNum );
+			}
+
+			function triggerChange( event ) {
+				// Trigger change event
+				e.trigger( 'change', $( this ).data( 'value' ) );
+			}
+
+			// Add dot icons
+			for ( i = 1; i <= maxVal; i++ ) {
+				btn = $( '<div class="page_n page_n_dot ' + page_margin_class + '" data-value="' + i + '"></div>' );
+				e.append( btn );
+				if ( i == currentVal ) {
+					btn.removeClass( 'page_n_dot' )
+						.addClass( 'page_n_' + i );
+				}
+				// bind vclick event to each icon
+				btn.bind( 'vclick', triggerChange );
+			}
+
+			// pagecontrol element's change event
+			e.bind( 'change', function ( event, value ) {
+				// 1. Change activated button
+				changeActiveBtn( value );
+
+				// 2. Store new value (DO NOT change this order!)
+				e.data( 'current', value );
+
+			});
+		}
+	});	// end: $.widget()
+
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.pagecontrol.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.pagecontrol( );
+	});
+
+} ( jQuery ) );
+
+/*
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+// pagelist widget
+//
+// Given an element, this widget collects all links contained in the descendants of the element and constructs
+// a popupwindow widget containing numbered buttons for each encountered link.
+//
+// You can mark any one element in your document with "data-pagelist='true'" and a pagelist will be created that
+// will allow the user to navigate between the pages linked to within the element.
+//
+// Currently, only one pagelist can exist in a document and, once created, it cannot be modified.
+
+(function ( $, undefined ) {
+
+	window.ensureNS( "jQuery.mobile.tizen" );
+
+	$.widget( "tizen.pagelist", $.tizen.widgetex, {
+		_htmlProto: {
+source:
+
+$("<div><div id='pagelist' class='ui-pagelist' data-role='popupwindow' data-shadow='false' data-overlayTheme=''>" +
+  "    <a id='pagelist-button' data-role='button' data-inline='true'></a>" +
+  "    <br id='pagelist-rowbreak'></br>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				pageList: "#pagelist",
+				button:   "#pagelist-button",
+				rowBreak: "#pagelist-rowbreak"
+			}
+		},
+		_create: function () {
+			var self = this,
+				popPageList = false,
+				idx = 0;
+
+			this._ui.button.remove();
+			this._ui.rowBreak.remove();
+			this._ui.pageList
+				.appendTo( $( "body" ) )
+				.popupwindow()
+				.bind( "vclick", function ( e ) {
+					$( this ).popupwindow( "close" );
+				} );
+
+			this.element.find( "a[href]" ).each( function ( elemIdx, elem ) {
+				if ( idx > 0 && ( ( idx % 10 ) != 0 ) ) {
+					self._ui.pageList.append( self._ui.rowBreak.clone() );
+				}
+
+				self._ui.button
+					.clone()
+					.attr( "href", $( elem ).attr( "href" ) )
+					.text( ++idx )
+					.appendTo( self._ui.pageList )
+					.buttonMarkup()
+					.bind( "vclick", function () { self._ui.pageList.popupwindow( "close" ); } )
+					.find( ".ui-btn-inner" )
+					.css( { padding: 2 } );
+			} );
+
+			$( document ).bind( "keydown", function ( e ) {
+				popPageList = ( e.keyCode === $.mobile.keyCode.CONTROL );
+			} );
+			$( document ).bind( "keyup", function ( e ) {
+				if ( e.keyCode === $.mobile.keyCode.CONTROL && popPageList ) {
+					var maxDim = { cx: 0, cy: 0 };
+					self._ui.pageList.popupwindow( "open", undefined, 0 );
+					self._ui.pageList.find( "a" )
+						.each( function () {
+							var btn = $( this ),
+								dim = {
+									cx: btn.outerWidth( true ),
+									cy: btn.outerHeight( true )
+								};
+
+							// Make sure things will be even later, because padding cannot have decimals - apparently :-S
+							if ( dim.cx % 2 ) {
+								btn.css( "padding-left", parseInt( btn.css( "padding-left" ), 10 ) + 1 );
+							}
+							if ( dim.cy % 2 ) {
+								btn.css( "padding-bottom", parseInt( btn.css( "padding-bottom" ), 10 ) + 1 );
+							}
+
+							maxDim.cx = Math.max( maxDim.cx, dim.cx );
+							maxDim.cy = Math.max( maxDim.cy, dim.cy );
+						} )
+						.each( function () {
+							var padding = {
+									h: Math.max( 0, ( maxDim.cx - $( this ).outerWidth( true ) ) / 2 ),
+									v: Math.max( 0, ( maxDim.cy - $( this ).outerHeight( true ) ) / 2 )
+								},
+								btn = $( this ),
+								inner = btn.find( ".ui-btn-inner" );
+
+							inner.css( {
+								"padding-left"		: parseInt( inner.css( "padding-left" ), 10 ) + padding.h,
+								"padding-top"		: parseInt( inner.css( "padding-top" ), 10 ) + padding.v,
+								"padding-right"		: parseInt( inner.css( "padding-right" ), 10 ) + padding.h,
+								"padding-bottom"	: parseInt( inner.css( "padding-bottom" ), 10 ) + padding.v
+							} );
+							btn[( ( btn.attr( "href" ) === "#" + $.mobile.activePage.attr( "id" ) ) ? "addClass" : "removeClass" )]( "ui-btn-active" );
+						} );
+					e.stopPropagation();
+					e.preventDefault();
+				}
+				popPageList = false;
+			} );
+		}
+	} );
+
+	// Look for an element marked as a pagelist and assign $.mobile.tizen.pagelist with a newly created pagelist.
+	// If $.mobile.tizen.pagelist is already assigned, ignore any new "data-pagelist='true'" designations.
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( ":jqmData(pagelist='true')", e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.each( function () {
+				if ( $.mobile.tizen.pagelist === undefined ) {
+					$.extend( $.mobile.tizen, {
+						pagelist: $( this ).pagelist()
+					} );
+				}
+				return false;
+			} );
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>,
+ *          Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Shows other elements inside a popup window.
+//
+// To apply, add the attribute data-role="popupwindow" to a <div> element inside
+// a page. Alternatively, call popupwindow()
+// on an element, eg :
+//
+//     $("#mypopupwindowContent").popupwindow();
+// where the html might be :
+//     <div id="mypopupwindowContent"></div>
+//
+// To trigger the popupwindow to appear, it is necessary to make a call to its
+// 'open()' method. This is typically done by binding a function to an event
+// emitted by an input element, such as a the clicked event emitted by a button
+// element. The open() method takes two arguments, specifying the x and y
+// screen coordinates of the center of the popup window.
+
+// You can associate a button with a popup window like this:
+//      <div id="mypopupContent" style="display: table;" data-role="popupwindow">
+//          <table>
+//              <tr> <td>Eenie</td>   <td>Meenie</td>  <td>Mynie</td>   <td>Mo</td>  </tr>
+//              <tr> <td>Catch-a</td> <td>Tiger</td>   <td>By-the</td>  <td>Toe</td> </tr>
+//              <tr> <td>If-he</td>   <td>Hollers</td> <td>Let-him</td> <td>Go</td>  </tr>
+//              <tr> <td>Eenie</td>   <td>Meenie</td>  <td>Mynie</td>   <td>Mo</td>  </tr>
+//          </table>
+//      </div>
+// <a href="#myPopupContent" data-rel="popupwindow" data-role="button">Show popup</a>
+//
+// Options:
+//
+//     theme: String; the theme for the popupwindow contents
+//                   Default: null
+//
+//     overlayTheme: String; the theme for the popupwindow
+//                   Default: null
+//
+//     shadow: Boolean; display a shadow around the popupwindow
+//             Default: true
+//
+//     corners: Boolean; display a shadow around the popupwindow
+//             Default: true
+//
+//     fade: Boolean; fades the opening and closing of the popupwindow
+//
+//     transition: String; the transition to use when opening or closing
+//                 a popupwindow
+//                 Default: $.mobile.defaultDialogTransition
+//
+// Events:
+//     close: Emitted when the popupwindow is closed.
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.popupwindow", $.tizen.widgetex, {
+		options: {
+			theme: null,
+			overlayTheme: "s",
+			style: "custom",
+			disabled: false,
+			shadow: true,
+			corners: true,
+			fade: true,
+			widthRatio: 0.8612,
+			transition: $.mobile.defaultDialogTransition,
+			initSelector: ":jqmData(role='popupwindow')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div>" +
+  "    <div id='popupwindow-screen' class='ui-selectmenu-screen ui-screen-hidden ui-popupwindow-screen'></div>" +
+  "    <div id='popupwindow-container' class='ui-popupwindow ui-popupwindow-padding ui-selectmenu-hidden ui-overlay-shadow ui-corner-all'></div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				screen:    "#popupwindow-screen",
+				container: "#popupwindow-container"
+			}
+		},
+
+		_create: function () {
+			var thisPage = this.element.closest(":jqmData(role='page')"),
+				self = this,
+				popup = this.element,
+				o = this.options,
+				style = popup.attr( 'data-style' );
+
+			if (thisPage.length === 0) {
+				thisPage = $("body");
+			}
+
+			// Drop a placeholder into the location from which we shall rip out the popup window contents
+			this._ui.placeholder =
+					$("<div><!-- placeholder" +
+									(this.element.attr("id") === undefined
+									 ? ""
+									 : " for " + this.element.attr("id")) + " --></div>")
+					.css("display", "none")
+					.insertBefore(this.element);
+
+			// Apply the proto
+			thisPage.append(this._ui.screen);
+			this._ui.container.insertAfter(this._ui.screen);
+			this._ui.container.append(this.element);
+
+			// Define instance variables
+			$.extend( self, {
+				_isOpen: false
+			});
+
+			//Data Style Start
+			if (style) {
+				o.style = style;
+			}
+
+			popup.addClass( o.style );
+			popup.find( ":jqmData(role='title')" )
+					.wrapAll( "<div class='popup-title'></div>" );
+			popup.find( ":jqmData(role='text')" )
+					.wrapAll( "<div class='popup-text'></div>" );
+			popup.find( ":jqmData(role='button-bg')" )
+					.wrapAll( "<div class='popup-button-bg'></div>" );
+			popup.find( ":jqmData(role='check-bg')" )
+					.wrapAll( "<div class='popup-check-bg'></div>" );
+			popup.find( ":jqmData(role='scroller-bg')" )
+					.wrapAll( "<div class='popup-scroller-bg'></div>" );
+			popup.find( ":jqmData(role='text-bottom-bg')" )
+					.wrapAll( "<div class='popup-text-bottom-bg'></div>" );
+			popup.find( ":jqmData(role='text-left')" )
+					.wrapAll( "<div class='popup-text-left'></div>" );
+			popup.find( ":jqmData(role='text-right')" )
+					.wrapAll( "<div class='popup-text-right'></div>" );
+			popup.find( ":jqmData(role='progress-bg')" )
+					.wrapAll( "<div class='popup-progress-bg'></div>" );
+			//Data Style End
+
+			// Events on "screen" overlay
+			this._ui.screen.bind( "vclick", function (event) {
+				self.close();
+			});
+		},
+
+		_realSetTheme: function (dst, theme) {
+
+			var classes = (dst.attr("class") || "").split(" "),
+				alreadyAdded = true,
+				currentTheme = null,
+				matches;
+
+			while (classes.length > 0) {
+				currentTheme = classes.pop();
+				matches = currentTheme.match(/^ui-body-([a-z])$/);
+				if (matches && matches.length > 1) {
+					currentTheme = matches[1];
+					break;
+				} else {
+					currentTheme = null;
+				}
+			}
+
+			dst.removeClass("ui-body-" + currentTheme);
+			if ((theme || "").match(/[a-z]/)) {
+				dst.addClass("ui-body-" + theme);
+			}
+		},
+
+		_setTheme: function (value) {
+			this._realSetTheme(this.element, value);
+			this.options.theme = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "theme", value);
+		},
+
+		_setOverlayTheme: function (value) {
+			this._realSetTheme(this._ui.container, value);
+			// The screen must always have some kind of background for fade to work, so, if the theme is being unset,
+	// set the background to "a".
+			this._realSetTheme(this._ui.screen, (value === "" ? "a" : value));
+			this.options.overlayTheme = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "overlay-theme", value);
+		},
+
+		_setShadow: function (value) {
+			this.options.shadow = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "shadow", value);
+			this._ui.container[value ? "addClass" : "removeClass"]("ui-overlay-shadow");
+		},
+
+		_setCorners: function (value) {
+			this.options.corners = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "corners", value);
+			this._ui.container[value ? "addClass" : "removeClass"]("ui-corner-all");
+		},
+
+		_setFade: function (value) {
+			this.options.fade = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "fade", value);
+		},
+
+		_setTransition: function (value) {
+			this._ui.container
+				.removeClass((this.options.transition || ""))
+				.addClass(value);
+			this.options.transition = value;
+			this.element.attr("data-" + ($.mobile.ns || "") + "transition", value);
+		},
+
+		_setDisabled: function (value) {
+			$.Widget.prototype._setOption.call(this, "disabled", value);
+			if (value) {
+				this.close();
+			}
+		},
+
+		_placementCoords: function (x, y, cx, cy) {
+			// Try and center the overlay over the given coordinates
+			var ret,
+				scrollTop = $(window).scrollTop(),
+				screenHeight = $(window).height(),
+				screenWidth = $(window).width(),
+				halfheight = cy / 2,
+				maxwidth = parseFloat( this._ui.container.css( "max-width" ) ),
+				roomtop = y - scrollTop,
+				roombot = scrollTop + screenHeight - y,
+				newtop,
+				newleft;
+
+			if ( roomtop > cy / 2 && roombot > cy / 2 ) {
+				newtop = y - halfheight;
+			} else {
+				// 30px tolerance off the edges
+				newtop = roomtop > roombot ? scrollTop + screenHeight - cy - 30 : scrollTop + 30;
+			}
+
+			// If the menuwidth is smaller than the screen center is
+			if ( cx < maxwidth ) {
+				newleft = ( screenWidth - cx ) / 2;
+			} else {
+				//otherwise insure a >= 30px offset from the left
+				newleft = x - cx / 2;
+
+				// 10px tolerance off the edges
+				if ( newleft < 10 ) {
+					newleft = 10;
+				} else if ( ( newleft + cx ) > screenWidth ) {
+					newleft = screenWidth - cx - 10;
+				}
+			}
+
+			return { x : newleft, y : newtop };
+		},
+
+		destroy: function () {
+		// Put the element back where we ripped it out from
+			this.element.insertBefore(this._ui.placeholder);
+
+			// Clean up
+			this._ui.placeholder.remove();
+			this._ui.container.remove();
+			this._ui.screen.remove();
+			this.element.triggerHandler("destroyed");
+			$.Widget.prototype.destroy.call(this);
+		},
+
+		open: function (x_where, y_where) {
+			if (!(this._isOpen || this.options.disabled)) {
+				var self = this,
+					x = (undefined === x_where ? $(window).width()  / 2 : x_where),
+					y = (undefined === y_where ? $(window).height() / 2 : y_where),
+					coords,
+					zIndexMax = 0,
+					ctxpopup = this.element.data("ctxpopup"),
+					popupWidth,
+					menuHeight,
+					menuWidth,
+					scrollTop,
+					screenHeight,
+					screenWidth,
+					roomtop,
+					roombot,
+					halfheight,
+					maxwidth,
+					newtop,
+					newleft;
+
+				if ( !ctxpopup ) {
+					popupWidth = $(window).width() * this.options.widthRatio;
+					this._ui.container.css("width", popupWidth);
+					// If the width of the popup exceeds the width of the window, we need to limit the width here,
+					// otherwise outer{Width,Height}(true) below will happily report the unrestricted values, causing
+					// the popup to get placed wrong.
+					if (this._ui.container.outerWidth(true) > $(window).width()) {
+						this._ui.container.css({"max-width" : $(window).width() - 30});
+					}
+				}
+
+				coords = this._placementCoords(x, y,
+					this._ui.container.outerWidth(true),
+					this._ui.container.outerHeight(true));
+
+				$(document)
+					.find("*")
+					.each(function () {
+						var el = $(this),
+							zIndex = parseInt(el.css("z-index"), 10);
+						if (!(el.is(self._ui.container) || el.is(self._ui.screen) || isNaN(zIndex))) {
+							zIndexMax = Math.max(zIndexMax, zIndex);
+						}
+					});
+
+				this._ui.screen
+					.height($(document).height())
+					.removeClass("ui-screen-hidden");
+
+				if (this.options.fade) {
+					this._ui.screen.animate({opacity: 0.5}, "fast");
+				} else {
+					this._ui.screen.css({opacity: 0.0});
+				}
+
+				//Recalculate popup position
+				menuHeight = this._ui.container.innerHeight(true);
+				menuWidth = this._ui.container.innerWidth(true);
+				scrollTop = $(window).scrollTop();
+				screenHeight = $(window).height();
+				screenWidth = $(window).width();
+				roomtop = y - scrollTop;
+				roombot = scrollTop + screenHeight - y;
+				halfheight = menuHeight / 2;
+				maxwidth = parseFloat( this._ui.container.css( "max-width" ) );
+				newtop = (screenHeight - menuHeight) / 2 + scrollTop;
+
+				if ( menuWidth < maxwidth ) {
+					newleft = ( screenWidth - menuWidth ) / 2;
+				} else {
+					//otherwise insure a >= 30px offset from the left
+					newleft = x - menuWidth / 2;
+
+					// 30px tolerance off the edges
+					if ( newleft < 30 ) {
+						newleft = 30;
+					} else if ( ( newleft + menuWidth ) > screenWidth ) {
+						newleft = screenWidth - menuWidth - 30;
+					}
+				}
+				//Recalculate popup position End
+				if ( ctxpopup ) {
+					newtop = coords.y;
+					newleft = coords.x;
+				}
+
+				this._ui.container
+					.removeClass("ui-selectmenu-hidden")
+					.css({
+						top: newtop,
+						left: newleft
+					})
+					.addClass("in")
+					.animationComplete(function () {
+						self._ui.screen.height($(document).height());
+					});
+
+				this._isOpen = true;
+			}
+		},
+
+		close: function () {
+			if (this._isOpen) {
+				var self = this,
+					hideScreen = function () {
+						self._ui.screen.addClass("ui-screen-hidden");
+						self._isOpen = false;
+						self.element.trigger("closed");
+					};
+
+				this._ui.container
+					.removeClass("in")
+					.addClass("reverse out")
+					.animationComplete(function () {
+						self._ui.container
+							.removeClass("reverse out")
+							.addClass("ui-selectmenu-hidden")
+							.removeAttr("style");
+					});
+
+				if (this.options.fade) {
+					this._ui.screen.animate({opacity: 0.0}, "fast", hideScreen);
+				} else {
+					hideScreen();
+				}
+			}
+		}
+	});
+
+	$.tizen.popupwindow.bindPopupToButton = function (btn, popup) {
+		if (btn.length === 0 || popup.length === 0) {
+			return;
+		}
+
+		var btnVClickHandler = function (e) {
+			// When /this/ button causes a popup, align the popup's theme with that of the button, unless the popup has a theme pre-set
+			if (!popup.jqmData("overlay-theme-set")) {
+				popup.popupwindow("option", "overlayTheme", btn.jqmData("theme"));
+			}
+			popup.popupwindow("open",
+				btn.offset().left + btn.outerWidth()  / 2,
+				btn.offset().top  + btn.outerHeight() / 2);
+
+			// Swallow event, because it might end up getting picked up by the popup window's screen handler, which
+			// will in turn cause the popup window to close - Thanks Sasha!
+			if (e.stopPropagation) {
+				e.stopPropagation();
+			}
+			if (e.preventDefault) {
+				e.preventDefault();
+			}
+		};
+
+		// If the popup has a theme set, prevent it from being clobbered by the associated button
+		if ((popup.popupwindow("option", "overlayTheme") || "").match(/[a-z]/)) {
+			popup.jqmData("overlay-theme-set", true);
+		}
+
+		btn
+			.attr({
+				"aria-haspopup": true,
+				"aria-owns": btn.attr("href")
+			})
+			.removeAttr("href")
+			.bind("vclick", btnVClickHandler);
+
+		popup.bind("destroyed", function () {
+			btn.unbind("vclick", btnVClickHandler);
+		});
+	};
+
+	$(document).bind("pagecreate create", function (e) {
+		$($.tizen.popupwindow.prototype.options.initSelector, e.target)
+			.not(":jqmData(role='none'), :jqmData(role='nojs')")
+			.popupwindow();
+
+		$("a[href^='#']:jqmData(rel='popupwindow')", e.target).each(function () {
+			$.tizen.popupwindow.bindPopupToButton($(this), $($(this).attr("href")));
+		});
+	});
+
+}(jQuery));
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// This widget is implemented in an extremely ugly way. It should derive from $.tizen.popupwindow, but it doesn't
+// because there's a bug in jquery.ui.widget.js which was fixed in jquery-ui commit
+// b9153258b0f0edbff49496ed16d2aa93bec07d95. Once a version of jquery-ui containing that commit is released
+// (probably >= 1.9m5), and jQuery Mobile picks up the widget from there, this widget needs to be rewritten properly.
+// The problem is that, when a widget inherits from a superclass and declares an object in its prototype identical in key
+// to one in the superclass, upon calling $.widget the object is overwritten in both the prototype of the superclass and
+// the prototype of the subclass. The prototype of the superclass should remain unchanged.
+
+(function ( $, undefined ) {
+	$.widget( "tizen.ctxpopup", $.tizen.widgetex, {
+		options: $.extend( {}, $.tizen.popupwindow.prototype.options, {
+			initSelector: ":not(:not(" + $.tizen.popupwindow.prototype.options.initSelector + ")):not(:not(:jqmData(show-arrow='true'), :jqmData(show-arrow)))"
+		} ),
+
+		_htmlProto: {
+source:
+
+$("<div><div id='outer' class='ui-ctxpopup'>" +
+  "    <div id='top' class='ui-ctxpopup-row' data-role='triangle' data-location='top'></div>" +
+  "    <div class='ui-ctxpopup-row'>" +
+  "        <div id='left' class='ui-ctxpopup-cell' data-role='triangle' data-location='left'></div>" +
+  "        <div id='container' class='ui-ctxpopup-cell'></div>" +
+  "        <div id='right' class='ui-ctxpopup-cell' data-role='triangle' data-location='right'></div>" +
+  "    </div>" +
+  "    <div id='bottom' class='ui-ctxpopup-row' data-role='triangle' data-location='bottom'></div>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				outer		: "#outer",
+				container	: "#container", // the key has to have the name "container"
+				arrow		: {
+					all		: ":jqmData(role='triangle')",
+					l		: "#left",
+					t		: "#top",
+					r		: "#right",
+					b		: "#bottom"
+				}
+			}
+		},
+
+		_create: function () {
+			if ( !this.element.data( "popupwindow" ) ) {
+				this.element.popupwindow();
+			}
+
+			this.element.data( "popupwindow" )
+				._ui.container
+				.removeClass( "ui-popupwindow-padding" )
+				.append( this._ui.outer );
+			this._ui.outer.trigger( "create" ); // Creates the triangle widgets
+			this._ui.container
+				.addClass( "ui-popupwindow-padding" )
+				.append( this.element );
+		},
+
+		_setOption: function ( key, value ) {
+			$.tizen.popupwindow.prototype._setOption.apply( this.element.data( "popupwindow" ), arguments );
+			this.options[key] = value;
+		}
+	} );
+
+	var origOpen = $.tizen.popupwindow.prototype.open,
+		orig_setOption = $.tizen.popupwindow.prototype._setOption,
+		orig_placementCoords = $.tizen.popupwindow.prototype._placementCoords;
+
+	$.tizen.popupwindow.prototype._setOption = function ( key, value ) {
+		var ctxpopup = this.element.data( "ctxpopup" ),
+			needsApplying = true,
+			origContainer;
+		if ( ctxpopup ) {
+			if ( "shadow" === key || "overlayTheme" === key || "corners" === key ) {
+				origContainer = this._ui.container;
+
+				this._ui.container = ctxpopup._ui.container;
+				orig_setOption.apply( this, arguments );
+				this._ui.container = origContainer;
+				needsApplying = false;
+			}
+			ctxpopup.options[key] = value;
+		}
+
+		if ( needsApplying ) {
+			orig_setOption.apply(this, arguments);
+		}
+	};
+
+	$.tizen.popupwindow.prototype._placementCoords = function ( x, y, cx, cy ) {
+		var ctxpopup = this.element.data( "ctxpopup" ),
+			self = this,
+			coords = {},
+			minDiff,
+			minDiffIdx;
+
+		function getCoords( arrow, x_factor, y_factor ) {
+			// Unhide the arrow we want to test to take it into account
+			ctxpopup._ui.arrow.all.hide();
+			ctxpopup._ui.arrow[arrow].show();
+
+			var isHorizontal = ( "b" === arrow || "t" === arrow ),
+			// Names of keys used in calculations depend on whether things are horizontal or not
+				coord = ( isHorizontal
+						? { point: "x", size: "cx", beg: "left", outerSize: "outerWidth",  niceSize: "width", triangleSize : "height" }
+						: { point: "y", size: "cy", beg: "top",  outerSize: "outerHeight", niceSize: "height", triangleSize : "width" } ),
+				size = {
+					cx : self._ui.container.width(),
+					cy : self._ui.container.height()
+				},
+				halfSize = {
+					cx : size.cx / 2,
+					cy : size.cy / 2
+				},
+				desired = {
+					"x" : x + halfSize.cx * x_factor,
+					"y" : y + halfSize.cy * y_factor
+				},
+				orig = orig_placementCoords.call( self, desired.x, desired.y, size.cx, size.cy ),
+
+			// The triangleOffset must be clamped to the range described below:
+			//
+			//                          +-------...
+			//                          |   /\
+			//                          |  /  \
+			//                   ----+--+-,-----...
+			//lowerDiff       -->____|  |/ <-- possible rounded corner
+			//triangle size   -->    | /|
+			//                   ____|/ |
+			//                    ^  |\ | <-- lowest possible offset for triangle
+			// actual range of    |  | \| 
+			// arrow offset       |  |  | 
+			// values due to      |  .  . Payload table cell looks like
+			// possible rounded   |  .  . a popup window, and it may have
+			// corners and arrow  |  .  . arbitrary things like borders,
+			// triangle size -    |  |  | shadows, and rounded corners.
+			// our clamp range    |  | /|
+			//                   _v__|/ |
+			//triangle size   -->    |\ | <-- highest possible offset for triangle
+			//                   ____| \|
+			//upperDiff       -->    |  |\ <-- possible rounded corner
+			//                   ----+--+-'-----...
+			//                          |  \  /
+			//                          |   \/
+			//                          +-------...
+			//
+			// We calculate lowerDiff and upperDiff by considering the offset and width of the payload (this.element)
+			// versus the offset and width of the element enclosing the triangle, because the payload is inside
+			// whatever decorations (such as borders, shadow, rounded corners) and thus can give a reliable indication
+			// of the thickness of the combined decorations
+
+				arrowBeg = ctxpopup._ui.arrow[arrow].offset()[coord.beg],
+				arrowSize = ctxpopup._ui.arrow[arrow][coord.outerSize]( true ),
+				payloadBeg = self.element.offset()[coord.beg],
+				payloadSize = self.element[coord.outerSize]( true ),
+				triangleSize = ctxpopup._ui.arrow[arrow][coord.triangleSize](),
+				triangleOffset =
+					Math.max(
+						triangleSize // triangle size
+							+ Math.max( 0, payloadBeg - arrowBeg ), // lowerDiff
+						Math.min(
+								arrowSize // bottom
+									- triangleSize // triangle size
+									- Math.max( 0, arrowBeg + arrowSize - ( payloadBeg + payloadSize ) ), // upperDiff
+								arrowSize / 2 // arrow unrestricted offset
+									+ desired[coord.point]
+									- orig[coord.point]
+									- halfSize[coord.size] 
+							)
+					),
+					// Triangle points here
+				final = {
+					"x": orig.x + ( isHorizontal ? triangleOffset : 0) + ("r" === arrow ? size.cx : 0),
+					"y": orig.y + (!isHorizontal ? triangleOffset : 0) + ("b" === arrow ? size.cy : 0)
+				},
+				ret = {
+					actual			: orig,
+					triangleOffset	: triangleOffset,
+					absDiff			: Math.abs( x - final.x ) + Math.abs( y - final.y )
+				};
+
+			// Hide it back
+			ctxpopup._ui.arrow[arrow].hide();
+
+			return ret;
+		}
+
+		if ( ctxpopup ) {
+			// Returns:
+			// {
+			//    absDiff: int
+			//    triangleOffset: int
+			//    actual: { x: int, y: int }
+			// }
+
+			coords = {
+				l : getCoords( "l", 1, 0 ),
+				r : getCoords( "r", -1, 0 ),
+				t : getCoords( "t", 0, 1 ),
+				b : getCoords( "b", 0, -1 )
+			};
+
+			$.each( coords, function ( key, value ) {
+				if ( minDiff === undefined || value.absDiff < minDiff ) {
+					minDiff = value.absDiff;
+					minDiffIdx = key;
+				}
+			} );
+
+			// Side-effect: show the appropriate arrow and move it to the right offset
+			ctxpopup._ui.arrow[minDiffIdx]
+				.show()
+				.triangle( "option", "offset", coords[minDiffIdx].triangleOffset );
+			return coords[minDiffIdx].actual;
+		}
+
+		return orig_placementCoords.call( this, x, y, cx, cy );
+	};
+
+	$.tizen.popupwindow.prototype.open = function ( x, y ) {
+		var ctxpopup = this.element.data( "ctxpopup" );
+
+		if ( ctxpopup ) {
+			this._setShadow( false );
+			this._setCorners( false );
+			this._setOverlayTheme( null );
+			this._setOption( "overlayTheme", ctxpopup.options.overlayTheme );
+			ctxpopup._ui.arrow.all.triangle( "option", "color", ctxpopup._ui.container.css( "background-color" ) );
+
+			// temporary
+			$( '.ui-popupwindow' ).css( 'background', 'none' );
+		}
+
+		origOpen.call( this, x, y );
+	};
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		var ctxpopups = $( $.tizen.ctxpopup.prototype.options.initSelector, e.target );
+		$.tizen.ctxpopup.prototype.enhanceWithin( e.target );
+	} );
+}( jQuery ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+// progress
+(function ( $, window, undefined) {
+	$.widget( "tizen.progress", $.mobile.widget, {
+		options: {
+			style: "circle",
+			running: false
+		},
+
+		_show: function () {
+			if ( !this.init ) {
+				$( this.element ).append( this.html );
+				this.init = true;
+			}
+			var style = this.options.style;
+			$( this.element ).addClass( "ui-progress-container-" + style + "-bg" );
+			$( this.element )
+				.find( ".ui-progress-" + style )
+				.addClass( this.runningClass );
+		},
+
+		_hide: function () {
+			$( this.element )
+				.find( ".ui-progress-" + this.options.style )
+				.removeClass( this.runningClass );
+		},
+
+		running: function ( newRunning ) {
+			// get value
+			if ( newRunning === undefined ) {
+				return this.options.running;
+			}
+
+			// set value
+			this._setOption( "running", newRunning );
+			return this;
+		},
+
+		_setOption: function ( key, value ) {
+			if ( key === "running" ) {
+				// normalize invalid value
+				if ( typeof value !== "boolean" ) {
+					window.alert( "running value MUST be boolean type!" );
+					return;
+				}
+				this.options.running = value;
+				this._refresh();
+			}
+		},
+
+		_refresh: function () {
+			if ( this.options.running ) {
+				this._show();
+			} else {
+				this._hide();
+			}
+		},
+
+		_create: function () {
+			var self = this,
+				element = this.element,
+				style = element.jqmData( "style" ),
+				runningClass;
+
+			if ( style ) {
+				this.options.style = style;
+			}
+
+			this.html = $( '<div class="ui-progress-container-' + style + '">' +
+					'<div class="ui-progress-' + style + '"></div>' +
+					'</div>' );
+
+			runningClass = "ui-progress-" + style + "-running";
+
+			$.extend( this, {
+				init: false,
+				runningClass: runningClass
+			} );
+			this._refresh();
+		}
+	} ); /* End of widget */
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( e.target ).find( ":jqmData(role='progress')" ).progress();
+	} );
+}(jQuery, this));
+/*
+ * jQuery UI Progressbar @VERSION
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ * Original file:
+ *   jquery.ui.progressbar.js
+ */
+/* This is from jquery ui plugin - progressbar 11/16/2011 */
+
+(function ( $, window, undefined ) {
+
+	$.widget( "tizen.progressbar", $.mobile.widget, {
+		options: {
+			value: 0,
+			max: 100
+		},
+
+		min: 0,
+
+		_create: function () {
+			this.element
+				.addClass( "ui-progressbar" )
+				.attr( {
+					role: "progressbar",
+					"aria-valuemin": this.min,
+					"aria-valuemax": this.options.max,
+					"aria-valuenow": this._value()
+				} );
+
+			this.valueDiv = $( "<div class='ui-progressbar-value'></div>" )
+				.appendTo( this.element );
+
+			this.oldValue = this._value();
+			this._refreshValue();
+		},
+
+		_destroy: function () {
+			this.element
+				.removeClass( "ui-progressbar" )
+				.removeAttr( "role" )
+				.removeAttr( "aria-valuemin" )
+				.removeAttr( "aria-valuemax" )
+				.removeAttr( "aria-valuenow" );
+
+			this.valueDiv.remove();
+		},
+
+		value: function ( newValue ) {
+			if ( newValue === undefined ) {
+				return this._value();
+			}
+
+			this._setOption( "value", newValue );
+			return this;
+		},
+
+		_setOption: function ( key, value ) {
+			if ( key === "value" ) {
+				this.options.value = value;
+				this._refreshValue();
+				if ( this._value() === this.options.max ) {
+					this._trigger( "complete" );
+				}
+			}
+			// jquery.ui.widget.js MUST be updated to new version!
+			//this._super( "_setOption", key, value );
+		},
+
+		_value: function () {
+			var val = this.options.value;
+			// normalize invalid value
+			if ( typeof val !== "number" ) {
+				val = 0;
+			}
+			return Math.min( this.options.max, Math.max( this.min, val ) );
+		},
+
+		_percentage: function () {
+			return 100 * this._value() / this.options.max;
+		},
+
+		_refreshValue: function () {
+			var value = this.value(),
+				percentage = this._percentage();
+
+			if ( this.oldValue !== value ) {
+				this.oldValue = value;
+				this._trigger( "change" );
+			}
+
+			this.valueDiv
+				.toggle( value > this.min )
+				.width( percentage.toFixed(0) + "%" );
+			this.element.attr( "aria-valuenow", value );
+		}
+	} );
+
+	// auto self-init widgets
+	$( document ).bind( "pagecreate", function ( e ) {
+		$( e.target ).find( ":jqmData(role='progressbar')" ).progressbar();
+	} );
+
+}( jQuery, this ) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+/*
+* jQuery Mobile Framework : "textinput" plugin for text inputs, textareas
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT or GPL Version 2 licenses.
+* http://jquery.org/license
+* Authors: Jinhyuk Jun <jinhyuk.jun@samsung.com>
+*          Wongi Lee <wongi11.lee@samsung.com>
+*/
+
+/**
+ * Searchbar can be created using <input> element with type=search
+ * <input type="search" name="search" id="search1" value=""  />
+ *
+ * Searchbar can be inserted 3 cases
+ * content : seachbar behave same as content element
+ * header : searchbar placed below title(header), It doesn't move when scrolling page
+ * inside optionheader : Searchbar placed inside optionheader, searchbar can be seen only expand optionheader
+ *
+ * Examples:
+ *
+ *	HTML markup for creating Searchbar
+ *		<input type="search"/>
+ *
+ *	How to make searchbar in content
+ *		<input type="search" name="" id="" value=""  />
+ *
+ *	How to make searchbar in title
+ *		<div data-role="header" data-position ="fixed" >
+ *			<h1>Searchbar</h1>
+ *			<input type="search" name="" id="" value=""  />
+ *		</div>
+ *
+ *	How to make searchbar inside optionheader
+ *		<div data-role="header" data-position ="fixed" >
+ *			<h1>Searchbar</h1>
+ *			<div id="myoptionheader2" data-role="optionheader">
+ *				<input type="search" name="" id="" value=""  />
+ *			</div>
+ *		</div>
+*/
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.searchbar", $.mobile.widget, {
+		options: {
+			theme: null,
+			initSelector: "input[type='search'],:jqmData(type='search'), input[type='tizen-search'],:jqmData(type='tizen-search')"
+		},
+
+		_create: function () {
+			var input = this.element,
+				o = this.options,
+				theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ),
+				themeclass  = " ui-body-" + theme,
+				focusedEl,
+				clearbtn,
+				currentPage = input.closest( ".ui-page" ),
+				searchicon,
+				cancelbtn,
+				defaultText,
+				defaultTextClass,
+				trimedText,
+				newClassName,
+				newStyle,
+				newDiv,
+				inputedText,
+				extraLineHeight,
+				keyupTimeoutBuffer,
+				keyup,
+				keyupTimeout;
+
+			function toggleClear() {
+				if ( !input.val() ) {
+					clearbtn.addClass( "ui-input-clear-hidden" );
+				} else {
+					clearbtn.removeClass( "ui-input-clear-hidden" );
+				}
+			}
+
+			function showCancel() {
+				focusedEl
+					.addClass( "ui-input-search-default" )
+					.removeClass( "ui-input-search-wide" );
+				cancelbtn
+					.addClass( "ui-btn-cancel-show" )
+					.removeClass( "ui-btn-cancel-hide" );
+				searchicon.hide();
+			}
+
+			function hideCancel() {
+				focusedEl
+					.addClass( "ui-input-search-wide" )
+					.removeClass( "ui-input-search-default" );
+				cancelbtn
+					.addClass( "ui-btn-cancel-hide" )
+					.removeClass( "ui-btn-cancel-show" );
+
+				if ( input.val() == "" ) {
+					searchicon.show();
+				}
+
+				toggleClear();
+			}
+
+			$( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" );
+
+			focusedEl = input.addClass( "ui-input-text ui-body-" + theme );
+
+			// XXX: Temporary workaround for issue 785 (Apple bug 8910589).
+			//      Turn off autocorrect and autocomplete on non-iOS 5 devices
+			//      since the popup they use can't be dismissed by the user. Note
+			//      that we test for the presence of the feature by looking for
+			//      the autocorrect property on the input element. We currently
+			//      have no test for iOS 5 or newer so we're temporarily using
+			//      the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas
+			if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) {
+				// Set the attribute instead of the property just in case there
+				// is code that attempts to make modifications via HTML.
+				input[0].setAttribute( "autocorrect", "off" );
+				input[0].setAttribute( "autocomplete", "off" );
+			}
+
+			focusedEl = input.wrap( "<div class='ui-input-search ui-shadow-inset ui-corner-all ui-btn-shadow" + themeclass + "'></div>" ).parent();
+			clearbtn = $( "<a href='#' class='ui-input-clear' title='clear text'>clear text</a>" )
+				.tap( function ( event ) {
+					event.preventDefault();
+					event.stopPropagation();
+
+					input.val( "" )
+						.blur()
+						.focus()
+						.trigger( "change" )
+						.trigger( "input" );
+					clearbtn.addClass( "ui-input-clear-hidden" );
+				} )
+				.appendTo( focusedEl )
+				.buttonMarkup({
+					icon: "deleteSearch",
+					iconpos: "notext",
+					corners: true,
+					shadow: true
+				} );
+
+			toggleClear();
+
+			input.keyup( toggleClear );
+
+			input.bind( 'paste cut keyup focus change blur', toggleClear );
+
+			//SLP --start search bar with cancel button
+			focusedEl.wrapAll( "<div class='input-search-bar'></div>" );
+
+			input.tap( function ( event ) {
+				inputedText = input.val();
+				input
+					.blur()
+					.focus();
+			} );
+
+			searchicon = $("<div class='ui-image-search ui-image-searchfield'></div>");
+			searchicon
+				.tap( function ( event ) {
+					searchicon.hide();
+
+					input
+						.blur()
+						.focus();
+				} )
+				.appendTo( focusedEl );
+
+			cancelbtn = $( "<a href='#' class='ui-input-cancel' title='clear text'>Cancel</a>" )
+				.tap(function ( event ) {
+					event.preventDefault();
+					event.stopPropagation();
+
+					input
+						.val( "" )
+						.blur()
+						.trigger( "change" );
+
+					hideCancel();
+				} )
+				.appendTo( focusedEl.parent() )
+				.buttonMarkup( {
+					iconpos: "cancel",
+					corners: true,
+					shadow: true
+				} );
+
+			// Input Focused
+			input.focus( function () {
+				showCancel();
+				focusedEl.addClass( "ui-focus" );
+			} );
+
+			// Input Blured
+			/* When user touch on page, it's same to blur */
+			$( "div.input-search-bar" ).tap( function ( event ) {
+				input.focus();
+				event.stopPropagation();
+			} );
+
+			$( currentPage ).bind("tap", function ( e ) {
+				focusedEl.removeClass( "ui-focus" );
+				hideCancel();
+				input.trigger( "change" );
+			} );
+
+			// Autogrow
+			if ( input.is( "textarea" ) ) {
+				extraLineHeight = 15;
+				keyupTimeoutBuffer = 100;
+				keyup = function () {
+					var scrollHeight = input[ 0 ].scrollHeight,
+						clientHeight = input[ 0 ].clientHeight;
+
+					if ( clientHeight < scrollHeight ) {
+						input.height(scrollHeight + extraLineHeight);
+					}
+				};
+
+				input.keyup( function () {
+					clearTimeout( keyupTimeout );
+					keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer );
+				});
+
+				// binding to pagechange here ensures that for pages loaded via
+				// ajax the height is recalculated without user input
+				$( document ).one( "pagechange", keyup );
+
+				// Issue 509: the browser is not providing scrollHeight properly until the styles load
+				if ( $.trim( input.val() ) ) {
+					// bind to the window load to make sure the height is calculated based on BOTH
+					// the DOM and CSS
+					$( window ).load( keyup );
+				}
+			}
+
+			// Default Text
+			defaultText = input.jqmData( "default-text" );
+
+			if ( ( defaultText != undefined ) && ( defaultText.length > 0 ) ) {
+				defaultTextClass = "ui-input-default-text";
+				trimedText = defaultText.replace(/\s/g, "");
+
+				/* Make new class for default text string */
+				newClassName = defaultTextClass + "-" + trimedText;
+				newStyle = $( "<style>" + '.' + newClassName + ":after" + "{content:" + "'" + defaultText + "'" + "}" + "</style>" );
+				$( 'html > head' ).append( newStyle );
+
+				/* Make new empty <DIV> for default text */
+				newDiv = $( "<div></div>" );
+
+				/* Add class and append new div */
+				newDiv.addClass( defaultTextClass );
+				newDiv.addClass( newClassName );
+				newDiv.tap( function ( event ) {
+					input.blur();
+					input.focus();
+				} );
+
+				input.parent().append( newDiv );
+
+				/* When focus, default text will be hide. */
+				input
+					.focus( function () {
+						input.parent().find( "div.ui-input-default-text" ).addClass( "ui-input-default-hidden" );
+					} )
+					.blur( function () {
+						var inputedText = input.val();
+						if ( inputedText.length > 0 ) {
+							input.parent().find( "div.ui-input-default-text" ).addClass( "ui-input-default-hidden" );
+						} else {
+							input.parent().find( "div.ui-input-default-text" ).removeClass( "ui-input-default-hidden" );
+						}
+					} );
+			}
+		},
+
+		disable: function () {
+			this.element.attr( "disabled", true );
+			this.element.parent().addClass( "ui-disabled" );
+		},
+
+		enable: function () {
+			this.element.attr( "disabled", false );
+			this.element.parent().removeClass( "ui-disabled" );
+		}
+	} );
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$.tizen.searchbar.prototype.enhanceWithin( e.target );
+	} );
+
+}( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Elliot Smith <elliot.smith@intel.com>
+ */
+
+// shortcutscroll is a scrollview controller, which binds
+// a scrollview to a a list of short cuts; the shortcuts are built
+// from the text on dividers in the list. Clicking on a shortcut
+// instantaneously jumps the scrollview to the selected list divider;
+// mouse movements on the shortcut column move the scrollview to the
+// list divider matching the text currently under the touch; a popup
+// with the text currently under the touch is also displayed.
+//
+// To apply, add the attribute data-shortcutscroll="true" to a listview
+// (a <ul> or <ol> element inside a page). Alternatively, call
+// shortcutscroll() on an element.
+//
+// The closest element with class ui-scrollview-clip is used as the
+// scrollview to be controlled.
+//
+// If a listview has no dividers or a single divider, the widget won't
+// display.
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.shortcutscroll", $.mobile.widget, {
+		options: {
+			initSelector: ":jqmData(shortcutscroll)"
+		},
+
+		_create: function () {
+			var $el = this.element,
+				self = this,
+				$popup,
+				page = $el.closest( ':jqmData(role="page")' ),
+				jumpToDivider;
+
+			this.scrollview = $el.closest( '.ui-scrollview-clip' );
+			this.shortcutsContainer = $( '<div class="ui-shortcutscroll"/>' );
+			this.shortcutsList = $( '<ul></ul>' );
+
+			// popup for the hovering character
+			this.shortcutsContainer.append($( '<div class="ui-shortcutscroll-popup"></div>' ) );
+			$popup = this.shortcutsContainer.find( '.ui-shortcutscroll-popup' );
+
+			this.shortcutsContainer.append( this.shortcutsList );
+			this.scrollview.append( this.shortcutsContainer );
+
+			// find the bottom of the last item in the listview
+			this.lastListItem = $el.children().last();
+
+			// remove scrollbars from scrollview
+			this.scrollview.find( '.ui-scrollbar' ).hide();
+
+			jumpToDivider = function ( divider ) {
+				// get the vertical position of the divider (so we can scroll to it)
+				var dividerY = $( divider ).position().top,
+					// find the bottom of the last list item
+					bottomOffset = self.lastListItem.outerHeight( true ) + self.lastListItem.position().top,
+					scrollviewHeight = self.scrollview.height(),
+
+				// check that after the candidate scroll, the bottom of the
+				// last item will still be at the bottom of the scroll view
+				// and not some way up the page
+					maxScroll = bottomOffset - scrollviewHeight,
+					dstOffset;
+
+				dividerY = ( dividerY > maxScroll ? maxScroll : dividerY );
+
+				// don't apply a negative scroll, as this means the
+				// divider should already be visible
+				dividerY = Math.max( dividerY, 0 );
+
+				// apply the scroll
+				self.scrollview.scrollview( 'scrollTo', 0, -dividerY );
+
+				dstOffset = self.scrollview.offset();
+				$popup
+					.text( $( divider ).text() )
+					.offset( { left : dstOffset.left + ( self.scrollview.width()  - $popup.width() ) / 2,
+								top  : dstOffset.top  + ( self.scrollview.height() - $popup.height() ) / 2 } )
+					.show();
+			};
+
+			this.shortcutsList
+			// bind mouse over so it moves the scroller to the divider
+				.bind( 'touchstart mousedown vmousedown touchmove vmousemove vmouseover ', function ( e ) {
+					// Get coords relative to the element
+					var coords = $.mobile.tizen.targetRelativeCoordsFromEvent( e ),
+						shortcutsListOffset = self.shortcutsList.offset();
+
+					// If the element is a list item, get coordinates relative to the shortcuts list
+					if ( e.target.tagName.toLowerCase() === "li" ) {
+						coords.x += $( e.target ).offset().left - shortcutsListOffset.left;
+						coords.y += $( e.target ).offset().top  - shortcutsListOffset.top;
+					}
+
+					// Hit test each list item
+					self.shortcutsList.find( 'li' ).each( function () {
+						var listItem = $( this ),
+							l = listItem.offset().left - shortcutsListOffset.left,
+							t = listItem.offset().top  - shortcutsListOffset.top,
+							r = l + Math.abs(listItem.outerWidth( true ) ),
+							b = t + Math.abs(listItem.outerHeight( true ) );
+
+						if ( coords.x >= l && coords.x <= r && coords.y >= t && coords.y <= b ) {
+							jumpToDivider( $( listItem.data( 'divider' ) ) );
+							return false;
+						}
+						return true;
+					} );
+
+					e.preventDefault();
+					e.stopPropagation();
+				} )
+				// bind mouseout of the shortcutscroll container to remove popup
+				.bind( 'touchend mouseup vmouseup vmouseout', function () {
+					$popup.hide();
+				} );
+
+			if ( page && !( page.is( ':visible' ) ) ) {
+				page.bind( 'pageshow', function () { self.refresh(); } );
+			} else {
+				this.refresh();
+			}
+
+			// refresh the list when dividers are filtered out
+			$el.bind( 'updatelayout', function () {
+				self.refresh();
+			} );
+		},
+
+		refresh: function () {
+			var self = this,
+				shortcutsTop,
+				minClipHeight,
+				dividers,
+				listItems;
+
+			this.shortcutsList.find( 'li' ).remove();
+
+			// get all the dividers from the list and turn them into shortcuts
+			dividers = this.element.find( '.ui-li-divider' );
+
+			// get all the list items
+			listItems = this.element.find( 'li:not(.ui-li-divider)) ');
+
+			// only use visible dividers
+			dividers = dividers.filter( ':visible' );
+			listItems = listItems.filter( ':visible' );
+
+			if ( dividers.length < 2 ) {
+				this.shortcutsList.hide();
+				return;
+			}
+
+			this.shortcutsList.show();
+
+			this.lastListItem = listItems.last();
+
+			dividers.each( function ( index, divider ) {
+				self.shortcutsList
+					.append( $( '<li>' + $( divider ).text() + '</li>' )
+						.data( 'divider', divider ) );
+			} );
+
+			// position the shortcut flush with the top of the first list divider
+			shortcutsTop = dividers.first().position().top;
+			this.shortcutsContainer.css( 'top', shortcutsTop );
+
+			// make the scrollview clip tall enough to show the whole of the shortcutslist
+			minClipHeight = shortcutsTop + this.shortcutsContainer.outerHeight() + 'px';
+			this.scrollview.css( 'min-height', minClipHeight );
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.shortcutscroll.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.shortcutscroll();
+	} );
+
+} ( jQuery ) );
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Max Waterman <max.waterman@intel.com>
+ * Authors: Minkyu Kang <mk7.kang@samsung.com>
+ */
+
+/**
+ * tizenslider modifies the JQuery Mobile slider and is created in the same way.
+ *
+ * See the JQuery Mobile slider widget for more information :
+ *     http://jquerymobile.com/demos/1.0a4.1/docs/forms/forms-slider.html
+ *
+ * The JQuery Mobile slider option:
+ *     theme: specify the theme using the 'data-theme' attribute
+ *
+ * Options:
+ *     theme: string; the theme to use if none is specified using the 'data-theme' attribute
+ *            default: 'c'
+ *     popupEnabled: boolean; controls whether the popup is displayed or not
+ *                   specify if the popup is enabled using the 'data-popupEnabled' attribute
+ *                   set from javascript using .tizenslider('option','popupEnabled',newValue)
+ *
+ * Events:
+ *     changed: triggers when the value is changed (rather than when the handle is moved)
+ *
+ * Examples:
+ *
+ *     <a href="#" id="popupEnabler" data-role="button" data-inline="true">Enable popup</a>
+ *     <a href="#" id="popupDisabler" data-role="button" data-inline="true">Disable popup</a>
+ *     <div data-role="fieldcontain">
+ *         <input id="mySlider" data-theme='a' data-popupenabled='false' type="range" name="slider" value="7" min="0" max="9" />
+ *     </div>
+ *     <div data-role="fieldcontain">
+ *         <input id="mySlider2" type="range" name="slider" value="77" min="0" max="777" />
+ *     </div>
+ *
+ *     // disable popup from javascript
+ *     $('#mySlider').tizenslider('option','popupEnabled',false);
+ *
+ *     // from buttons
+ *     $('#popupEnabler').bind('vclick', function() {
+ *         $('#mySlider').tizenslider('option','popupEnabled',true);
+ *     });
+ *     $('#popupDisabler').bind('vclick', function() {
+ *         $('#mySlider').tizenslider('option','popupEnabled',false);
+ *     });
+ */
+
+(function ($, window, undefined) {
+	$.widget("tizen.tizenslider", $.mobile.widget, {
+		options: {
+			popupEnabled: true
+		},
+
+		popup: null,
+		handle: null,
+		handleText: null,
+
+		_create: function () {
+			this.currentValue = null;
+			this.popupVisible = false;
+
+			var self = this,
+				inputElement = $(this.element),
+				slider,
+				showPopup,
+				hidePopup,
+				positionPopup,
+				updateSlider,
+				slider_bar,
+				handle_press,
+				popupEnabledAttr,
+				icon;
+
+			// apply jqm slider
+			inputElement.slider();
+
+			// hide the slider input element proper
+			inputElement.hide();
+
+			self.popup = $('<div class="ui-slider-popup"></div>');
+
+			// set the popupEnabled according to the html attribute
+			popupEnabledAttr = inputElement.attr('data-popupenabled');
+			if ( popupEnabledAttr !== undefined ) {
+				self.options.popupEnabled = (popupEnabledAttr === 'true');
+			}
+
+			// get the actual slider added by jqm
+			slider = inputElement.next('.ui-slider');
+
+			icon = inputElement.attr('data-icon');
+
+			// wrap the background
+			if ( icon === undefined ) {
+				slider.wrap('<div class="ui-slider-bg"></div>');
+			} else {
+				slider.wrap('<div class="ui-slider-icon-bg"></div>');
+			}
+
+			// get the handle
+			self.handle = slider.find('.ui-slider-handle');
+
+			// remove the rounded corners from the slider and its children
+			slider.removeClass('ui-btn-corner-all');
+			slider.find('*').removeClass('ui-btn-corner-all');
+
+			// add icon
+
+			switch ( icon ) {
+			case 'bright':
+			case 'volume':
+				slider.before( $('<div class="ui-slider-left-' +
+							icon + '"></div>') );
+				slider.after( $('<div class="ui-slider-right-' +
+							icon + '"></div>') );
+				break;
+
+			case 'text':
+				slider.before( $('<div class="ui-slider-left-text">' +
+					'<span style="position:relative;top:0.4em;">' +
+					inputElement.attr('data-text-left') +
+					'</span></div>') );
+				slider.after( $('<div class="ui-slider-right-text">' +
+					'<span style="position:relative;top:0.4em;">' +
+					inputElement.attr('data-text-right') +
+					'</span></div>') );
+				break;
+			}
+
+			// slider bar
+			slider.append($('<div class="ui-slider-bar"></div>'));
+			self.slider_bar = slider.find('.ui-slider-bar');
+
+			// handle press
+			slider.append($('<div class="ui-slider-handle-press"></div>'));
+			self.handle_press = slider.find('.ui-slider-handle-press');
+			self.handle_press.css('display', 'none');
+
+			// add a popup element (hidden initially)
+			slider.before(self.popup);
+			self.popup.hide();
+
+			// get the element where value can be displayed
+			self.handleText = slider.find('.ui-btn-text');
+			if ( inputElement.attr('max') > 999 ) {
+				self.handleText.css('font-size', '0.8em');
+			}
+
+			// set initial value
+			self.updateSlider();
+
+			// bind to changes in the slider's value to update handle text
+			this.element.bind('change', function () {
+				self.updateSlider();
+			});
+
+			// bind clicks on the handle to show the popup
+			self.handle.bind('vmousedown', function () {
+				self.showPopup();
+			});
+
+			// watch events on the document to turn off the slider popup
+			slider.add(document).bind('vmouseup', function () {
+				self.hidePopup();
+			});
+		},
+
+		_handle_press_show: function () {
+			this.handle_press.css('display', '');
+		},
+
+		_handle_press_hide: function () {
+			this.handle_press.css('display', 'none');
+		},
+
+		// position the popup
+		positionPopup: function () {
+			var dstOffset = this.handle.offset();
+
+			this.popup.offset({
+				left: dstOffset.left + (this.handle.width() - this.popup.width()) / 2,
+				top: dstOffset.top  - this.popup.outerHeight() + 15
+			});
+
+			this.handle_press.offset({
+				left: dstOffset.left,
+				top: dstOffset.top
+			});
+		},
+
+		// show value on the handle and in popup
+		updateSlider: function () {
+			if ( this.popupVisible ) {
+				this.positionPopup();
+			}
+
+			// remove the title attribute from the handle (which is
+			// responsible for the annoying tooltip); NB we have
+			// to do it here as the jqm slider sets it every time
+			// the slider's value changes :(
+			this.handle.removeAttr('title');
+
+			this.slider_bar.width(this.handle.css('left'));
+
+			var newValue = this.element.val();
+
+			if ( newValue === this.currentValue ) {
+				return;
+			}
+
+			this.currentValue = newValue;
+			this.handleText.text(newValue);
+			this.popup.html(newValue);
+
+			this.element.trigger('update', newValue);
+		},
+
+		// show the popup
+		showPopup: function () {
+			if ( !(this.options.popupEnabled && !this.popupVisible) ) {
+				return;
+			}
+
+			this.handleText.hide();
+			this.popup.show();
+			this.popupVisible = true;
+			this._handle_press_show();
+		},
+
+		// hide the popup
+		hidePopup: function () {
+			if ( !(this.options.popupEnabled && this.popupVisible) ) {
+				return;
+			}
+
+			this.handleText.show();
+			this.popup.hide();
+			this.popupVisible = false;
+			this._handle_press_hide();
+		},
+
+		_setOption: function (key, value) {
+			var needToChange = ( value !== this.options[key] );
+
+			if ( !needToChange ) {
+				return;
+			}
+
+			switch ( key ) {
+			case 'popupEnabled':
+				this.options.popupEnabled = value;
+
+				if ( this.options.popupEnabled ) {
+					this.updateSlider();
+				} else {
+					this.hidePopup();
+				}
+
+				break;
+			}
+		}
+	});
+
+	// stop jqm from initialising sliders
+	$(document).bind("pagebeforecreate", function ( e ) {
+		if ($.data(window, "jqmSliderInitSelector") === undefined ) {
+			$.data(window, "jqmSliderInitSelector",
+				$.mobile.slider.prototype.options.initSelector);
+			$.mobile.slider.prototype.options.initSelector = null;
+		}
+	});
+
+	// initialise sliders with our own slider
+	$(document).bind("pagecreate", function ( e ) {
+		var jqmSliderInitSelector = $.data(window, "jqmSliderInitSelector");
+		$(e.target).find(jqmSliderInitSelector).not('select').tizenslider();
+		$(e.target).find(jqmSliderInitSelector).filter('select').slider();
+	});
+
+}( jQuery, this ));
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Kalyan Kondapally <kalyan.kondapally@intel.com>,
+ *          Elliot Smith <elliot.smith@intel.com>
+ */
+
+// Widget which turns a list into a "swipe list":
+// i.e. each list item has a sliding "cover" which can be swiped
+// to the right (to reveal buttons underneath) or left (to
+// cover the buttons again). Clicking on a button under a swipelist
+// also moves the cover back to the left.
+//
+// To create a swipelist, you need markup like this:
+//
+// <pre>
+// &lt;ul data-role="swipelist"&gt;<br/>
+//     &lt;li&gt;<br/>
+//         &lt;div class="ui-grid-b"&gt;<br/>
+//             &lt;div class="ui-block-a"&gt;<br/>
+//                 &lt;a href="#" data-role="button" data-theme="a"&gt;Twitter&lt;/a&gt;<br/>
+//             &lt;/div&gt;<br/>
+//             &lt;div class="ui-block-b"&gt;<br/>
+//                 &lt;a href="#" data-role="button" data-theme="b"&gt;FaceBook&lt;/a&gt;<br/>
+//             &lt;/div&gt;<br/>
+//             &lt;div class="ui-block-c"&gt;<br/>
+//                 &lt;a href="#" data-role="button" data-theme="c"&gt;Google+&lt;/a&gt;<br/>
+//             &lt;/div&gt;<br/>
+//         &lt;/div&gt;<br/>
+//         &lt;div data-role="swipelist-item-cover"&gt;Nigel&lt;/div&gt;<br/>
+//     &lt;/li&gt;<br/>
+//     ...<br/>
+// &lt;/ul&gt;
+// </pre>
+//
+// In this case, the cover is over a grid of buttons;
+// but it is should also be possible to use other types of markup under the
+// list items.
+//
+// Note the use of a separate div, parented by the li element, marked
+// up with data-role="swipelist-item-cover". This div will usually
+// contain text. If you want other elements in your swipelist covers,
+// you may need to style them yourself. Because the covers aren't
+// technically list items, you may need to do some work to make them
+// look right.
+//
+// WARNING: This doesn't work well inside a scrollview widget, as
+// the touch events currently interfere with each other badly (e.g.
+// a swipe will work but cause a scroll as well).
+//
+// Theme: default is to use the theme on the target element,
+// theme passed in options, parent theme, or 'c' if none of the above.
+// If list items are themed individually, the cover will pick up the
+// theme of the list item which is its parent.
+//
+// Events:
+//
+//   animationComplete: Triggered by a cover when it finishes sliding
+//                      (to either the right or left).
+(function ($) {
+
+	$.widget("tizen.swipelist", $.mobile.widget, {
+		options: {
+			theme: null
+		},
+
+		_create: function () {
+			// use the theme set on the element, set in options,
+			// the parent theme, or 'c' (in that order of preference)
+			var theme = this.element.jqmData('theme') ||
+				this.options.theme ||
+				this.element.parent().jqmData('theme') ||
+				'c';
+
+			this.options.theme = theme;
+			this.refresh();
+		},
+
+		refresh: function () {
+			this._cleanupDom();
+
+			var self = this,
+				defaultCoverTheme,
+				covers;
+
+			defaultCoverTheme = 'ui-body-' + this.options.theme;
+
+			// swipelist is a listview
+			if (!this.element.hasClass('ui-listview')) {
+				this.element.listview();
+			}
+
+			this.element.addClass('ui-swipelist');
+
+			// get the list item covers
+			covers = this.element.find(':jqmData(role="swipelist-item-cover")');
+
+			covers.each(function () {
+				var cover = $(this),
+					coverTheme = defaultCoverTheme,
+				// get the parent li element and add classes
+					item = cover.closest('li'),
+					itemHasThemeClass;
+
+				// add swipelist CSS classes
+				item.addClass('ui-swipelist-item');
+				cover.addClass('ui-swipelist-item-cover');
+
+				// set swatch on cover: if the nearest list item has
+				// a swatch set on it, that will be used; otherwise, use
+				// the swatch set for the swipelist
+				itemHasThemeClass = item.attr('class')
+					.match(/ui\-body\-[a-z]|ui\-bar\-[a-z]/);
+
+				if (itemHasThemeClass) {
+					coverTheme = itemHasThemeClass[0];
+				}
+
+				cover.addClass(coverTheme);
+
+				// wrap inner HTML (so it can potentially be styled)
+				if (cover.has('.ui-swipelist-item-cover-inner').length === 0) {
+					cover.wrapInner($('<span/>').addClass('ui-swipelist-item-cover-inner'));
+				}
+
+				// bind to swipe events on the cover and the item
+				if (!(cover.data('animateRight') && cover.data('animateLeft'))) {
+					cover.data('animateRight', function () {
+						self._animateCover(cover, 100);
+					});
+
+					cover.data('animateLeft', function () {
+						self._animateCover(cover, 0);
+					});
+				}
+
+				// bind to synthetic events
+				item.bind('swipeleft', cover.data('animateLeft'));
+				cover.bind('swiperight', cover.data('animateRight'));
+
+				// any clicks on buttons inside the item also trigger
+				// the cover to slide back to the left
+				item.find('.ui-btn').bind('vclick', cover.data('animateLeft'));
+			});
+		},
+
+		_cleanupDom: function () {
+
+			var self = this,
+				defaultCoverTheme,
+				covers;
+
+			defaultCoverTheme = 'ui-body-' + this.options.theme;
+
+			this.element.removeClass('ui-swipelist');
+
+			// get the list item covers
+			covers = this.element.find(':jqmData(role="swipelist-item-cover")');
+
+			covers.each(function () {
+				var cover = $(this),
+					coverTheme = defaultCoverTheme,
+					text,
+					wrapper,
+					// get the parent li element and add classes
+					item = cover.closest('li'),
+					itemClass,
+					itemHasThemeClass;
+
+					// remove swipelist CSS classes
+				item.removeClass('ui-swipelist-item');
+				cover.removeClass('ui-swipelist-item-cover');
+
+				// remove swatch from cover: if the nearest list item has
+				// a swatch set on it, that will be used; otherwise, use
+				// the swatch set for the swipelist
+				itemClass = item.attr('class');
+				itemHasThemeClass = itemClass &&
+					itemClass.match(/ui\-body\-[a-z]|ui\-bar\-[a-z]/);
+
+				if (itemHasThemeClass) {
+					coverTheme = itemHasThemeClass[0];
+				}
+
+				cover.removeClass(coverTheme);
+
+				// remove wrapper HTML
+				wrapper = cover.find('.ui-swipelist-item-cover-inner');
+				wrapper.children().unwrap();
+				text = wrapper.text();
+
+				if (text) {
+					cover.append(text);
+					wrapper.remove();
+				}
+
+				// unbind swipe events
+				if (cover.data('animateRight') && cover.data('animateLeft')) {
+					cover.unbind('swiperight', cover.data('animateRight'));
+					item.unbind('swipeleft', cover.data('animateLeft'));
+
+					// unbind clicks on buttons inside the item
+					item.find('.ui-btn').unbind('vclick', cover.data('animateLeft'));
+
+					cover.data('animateRight', null);
+					cover.data('animateLeft', null);
+				}
+			});
+		},
+
+		// NB I tried to use CSS animations for this, but the performance
+		// and appearance was terrible on Android 2.2 browser;
+		// so I reverted to jQuery animations
+		//
+		// once the cover animation is done, the cover emits an
+		// animationComplete event
+		_animateCover: function (cover, leftPercentage) {
+			var animationOptions = {
+				easing: 'linear',
+				duration: 'fast',
+				queue: true,
+				complete: function () {
+					cover.trigger('animationComplete');
+				}
+			};
+
+			cover.stop();
+			cover.clearQueue();
+			cover.animate({left: leftPercentage + '%'}, animationOptions);
+		},
+
+		destroy: function () {
+			this._cleanupDom();
+		}
+
+	});
+
+	$(document).bind("pagecreate", function (e) {
+		$(e.target).find(":jqmData(role='swipelist')").swipelist();
+	});
+
+}(jQuery));
+/*
+ * jQuery Mobile Widget @VERSION
+ *
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software" ),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ * Authors: Gabriel Schulhof <gabriel.schulhof@intel.com>
+ */
+
+// Displays a simple two-state switch.
+//
+// To apply, add the attribute data-role="switch" to a <div>
+// element inside a page. Alternatively, call switch()
+// on an element, like this :
+//
+//     $( "#myswitch" ).toggleswitch();
+// where the html might be :
+//     <div id="myswitch"></div>
+//
+// Options:
+//     checked: Boolean; the state of the switch
+//     Default: true (up)
+//
+// Events:
+//     changed: Emitted when the switch is changed
+
+(function ( $, undefined ) {
+
+	$.widget( "tizen.toggleswitch", $.tizen.widgetex, {
+		options: {
+			onText			: "On",
+			offText			: "Off",
+			checked			: true,
+			initSelector	: ":jqmData(role='toggleswitch')"
+		},
+
+		_htmlProto: {
+source:
+
+$("<div><div id='outer' class='ui-btn ui-btn-corner-all ui-btn-inline ui-shadow ui-toggleswitch'>" +
+  "    <div class='ui-btn ui-btn-corner-all ui-btn-up-c toggleswitch-background'></div>" +
+  "    <div class='ui-btn ui-btn-corner-all ui-btn-up-c toggleswitch-background ui-btn-active' id='bg'></div>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-floating-button toggleswitch-mover' id='normal'>" +
+  "       <span data-normal-text='true'></span>" +
+  "    </a>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-floating-button toggleswitch-mover ui-btn-active' id='active'>" +
+  "       <span data-active-text='true'></span>" +
+  "    </a>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-sizer'>" +
+  "       <span data-normal-text='true'></span>" +
+  "    </a>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-sizer'>" +
+  "       <span data-active-text='true'></span>" +
+  "    </a>" +
+  "    <a data-role='button' data-shadow='false' class='toggleswitch-floating-button' id='button'>" +
+  "       <span id='btn-span'></span>" +
+  "    </a>" +
+  "</div>" +
+  "</div>")
+,			ui: {
+				outer		: "#outer",
+				bg			: "#bg",
+				txtMovers	: {
+					normal	: "#normal",
+					active	: "#active"
+				},
+				btn			: "#button",
+				btnSpan		: "#btn-span",
+				txt			: {
+					normal	: "[data-normal-text]",
+					active	: "[data-active-text]"
+				}
+			}
+		},
+
+		_value: {
+			attr: "data-" + ( $.mobile.ns || "" ) + "checked",
+			signal: "changed"
+		},
+
+		_create: function () {
+			var self = this;
+
+			this.element
+				.css( "display", "none" )
+				.after( this._ui.outer );
+
+			this._ui.outer.find( "a" ).buttonMarkup();
+			this._ui.txtMovers.normal
+				.add( this._ui.txtMovers.active )
+				.find( "*" )
+				.css( { "border-color": "transparent" } );
+			this._ui.btn.addClass( "toggleswitch-button" );
+/*
+		// Crutches for IE: It does not seem to understand opacity specified in a class, nor that opacity of an element
+		// affects all its children
+		if ($.mobile.browser.ie) {
+			// Remove this class, because it has no effect in IE :-S
+			this._ui.outer.find( "*" ).removeClass( "toggleswitch-button-transparent" );
+			// After adding the button markup, make everything transparent
+			this._ui.normalBackground.find( "*" ).css( "opacity", 0.0);
+			this._ui.activeBackground.find( "*" ).css( "opacity", 0.0);
+			this._ui.refButton.add( this._ui.refButton.find( "*" )).css( "opacity", 0.0);
+			this._ui.realButton.add( this._ui.realButton.find( "*" )).css( "opacity", 0.0);
+			// ... except the buttons that display the inital position of the switch
+			this._ui.initButtons
+				.add( this._ui.initButtons.find( "*" ))
+				.add( this._ui.fButton.find( "*" ))
+				.add( this._ui.fButton)
+				.css( "opacity", 1.0);
+		}
+*/
+			$.extend( this, {
+				_initial: true
+			} );
+
+			this._ui.btn
+				.add( this._ui.outer )
+				.bind( "vclick", function ( e ) {
+					self._setChecked( !( self.options.checked ) );
+					e.stopPropagation();
+				} );
+		},
+/*
+		_makeTransparent: function (obj, b) {
+			if ($.mobile.browser.ie)
+				obj.add(obj.find( "*" )).css( "opacity", b ? 0.0 : 1.0);
+			else
+				obj[b ? "addClass" : "removeClass"]( "toggleswitch-button-transparent" );
+		},
+*/
+		_setDisabled: function ( value ) {
+			$.tizen.widgetex.prototype._setDisabled.call( this, value );
+			this._ui.outer[value ? "addClass" : "removeClass"]( "ui-disabled" );
+		},
+
+		_updateBtnText: function () {
+			var noText = ( ( ( this.options.offText || "" ) === "" &&
+					( this.options.onText || "" ) === "" ) );
+			this._ui.btnSpan.html( ( noText ? "" : "&nbsp;" ) );
+			this._ui.outer.find( "a" )[( noText ? "addClass" : "removeClass" )]( "ui-btn-icon-notext" );
+		},
+
+		_setOnText: function ( value ) {
+			this._ui.txt.active.text( value );
+			this.options.onText = value;
+			this.element.attr( "data-" + ( $.mobile.ns || "" ) + "on-text", value );
+			this._updateBtnText();
+		},
+
+		_setOffText: function ( value ) {
+			this._ui.txt.normal.text( value );
+			this.options.offText = value;
+			this.element.attr( "data-" + ($.mobile.ns || "" ) + "off-text", value );
+			this._updateBtnText();
+		},
+
+		_setChecked: function ( checked ) {
+			if ( this.options.checked != checked ) {
+				var dst = checked
+					? { bg:  "0%", normalTop: "-50%", activeBot: "0%" }
+					: { bg: "50%", normalTop: "0%", activeBot: "-50%" },
+					method = ( this._initial ? "css" : "animate" );
+
+				this._ui.btn.add( this._ui.bg )[method]( { top: dst.bg } );
+				this._ui.txtMovers.normal[method]( { top: dst.normalTop } );
+				this._ui.txtMovers.active[method]( { bottom: dst.activeBot } );
+
+				this._initial = false;
+
+				this.options.checked = checked;
+				this.element.attr( "data-" + ( $.mobile.ns || "" ) + "checked", checked );
+				this._setValue( checked );
+			}
+		}
+	} );
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.toggleswitch.prototype.options.initSelector, e.target )
+			.not( ":jqmData(role='none'), :jqmData(role='nojs')" )
+			.toggleswitch();
+	} );
+
+}( jQuery ) );
+/*
+ * This software is licensed under the MIT licence (as defined by the OSI at
+ * http://www.opensource.org/licenses/mit-license.php)
+ *
+ * ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 by Intel Corporation Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ */
+
+( function ($, undefined) {
+
+	$.widget( "tizen.triangle", $.tizen.widgetex, {
+		options: {
+			extraClass: "",
+			offset: null,
+			color: null,
+			location: "top",
+			initSelector: ":jqmData(role='triangle')"
+		},
+
+		_create: function () {
+			var triangle = $( "<div></div>", {"class" : "ui-triangle"} );
+
+			$.extend(this, {
+				_triangle: triangle
+			});
+
+			this.element.addClass( "ui-triangle-container" ).append( triangle );
+		},
+
+		_doCSS: function () {
+			var location = ( this.options.location || "top" ),
+				offsetCoord = ( ($.inArray(location, ["top", "bottom"]) === -1) ? "top" : "left"),
+				cssArg = {
+					"border-bottom-color" : "top"    === location ? this.options.color : "transparent",
+					"border-top-color"    : "bottom" === location ? this.options.color : "transparent",
+					"border-left-color"   : "right"  === location ? this.options.color : "transparent",
+					"border-right-color"  : "left"   === location ? this.options.color : "transparent"
+				};
+
+			cssArg[offsetCoord] = this.options.offset;
+
+			this._triangle.removeAttr( "style" ).css( cssArg );
+		},
+
+		_setOffset: function ( value ) {
+			this.options.offset = value;
+			this.element.attr( "data-" + ($.mobile.ns || "") + "offset", value );
+			this._doCSS();
+		},
+
+		_setExtraClass: function ( value ) {
+			this._triangle.addClass( value );
+			this.options.extraClass = value;
+			this.element.attr( "data-" + ($.mobile.ns || "") + "extra-class", value );
+		},
+
+		_setColor: function ( value ) {
+			this.options.color = value;
+			this.element.attr( "data-" + ($.mobile.ns || "") + "color", value );
+			this._doCSS();
+		},
+
+		_setLocation: function ( value ) {
+			this.element
+				.removeClass( "ui-triangle-container-" + this.options.location )
+				.addClass( "ui-triangle-container-" + value );
+			this._triangle
+				.removeClass( "ui-triangle-" + this.options.location )
+				.addClass( "ui-triangle-" + value );
+
+			this.options.location = value;
+			this.element.attr( "data-" + ($.mobile.ns || "") + "location", value );
+
+			this._doCSS();
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function ( e ) {
+	    $($.tizen.triangle.prototype.options.initSelector, e.target)
+	        .not(":jqmData(role='none'), :jqmData(role='nojs')")
+	        .triangle();
+	});
+
+}(jQuery) );
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Kangsik Kim <kangsik81.kim@samsung.com>
+*/
+
+/**
+ * Virtual Grid Widget for unlimited data.
+ * To support more then 1,000 items, special grid widget developed.
+ * Fast initialize and light DOM tree.
+ *
+ * HTML Attributes:
+ *
+ *		data-role:  virtualgridview
+ *		data-template : jQuery.template ID that populate into virtual list
+ *		data-dbtable : DB Table name. It used as window[DB NAME]. Loaded data should be converted as window object.
+ *		data-dbkey : Unique key of DB Table. To sync each element on virtual list with DB table.
+ *		data-column : Set a number of column. (Default : 3)
+ *		data-row : Set a number of row. (Default : 10)
+ *
+ *		ID : <UL> element that has "data-role=virtualgrid" must have ID attribute.
+ *		Class : <UL> element that has "data-role=virtualgrid" should have "vgLoadSuccess" class to guaranty DB loading is completed.
+ *
+ * APIs:
+ *
+ *		create ( void )
+ *			: API to call _create method. API for AJAX or DB loading callback.
+ *
+ * Events:
+ *
+ *
+ * Examples:
+ *
+ *			<script id="tizen-demo-namecard" type="text/x-jquery-tmpl">
+ *				<div class="ui-demo-namecard">
+ *					<div class="ui-demo-namecard-pic">
+ *						<img class="ui-demo-namecard-pic-img" src="${TEAM_LOGO}"  />
+ *					</div>
+ *					<div class="ui-demo-namecard-contents">
+ *						<span class="name ui-li-text-main">${NAME}</span>
+ *						<span class="active ui-li-text-sub">${ACTIVE}</span>
+ *						<span class="from ui-li-text-sub">${FROM}</span>
+ *					</div>
+ *				</div>
+ *			</script>
+ *			<div id="virtualgrid-demo" data-role="virtualgrid" data-column="3" data-row="60" data-template="tizen-demo-namecard" data-dbtable="JSON_DATA" >
+ *			</div>
+ *
+ */
+
+( function ( $, window, undefined ) {
+	$.widget( "tizen.virtualgrid", $.mobile.widget, {
+		options : {
+			id : "",
+			column : 3,
+			dbtable : "",
+			template : "",
+			row : 20,
+			dbkey : false
+		},
+		create : function () {
+			this._create();
+		},
+		_create : function () {
+			$.extend( this, {
+				NO_SCROLL : 0,
+				SCROLL_DOWN : 1,
+				SCROLL_UP : -1,
+				_titleHeight : 0,
+				_blockHeight : 0,
+				_bufferSize : 0,
+				_columnWidth : 0,
+				_totalItemCnt : 0,
+				_totalRowCnt : 0,
+				_currentIndex : 0,
+				_remainCount : 0,
+				_viewHeight : 0,
+				_direction : 0,
+				_firstIndex : 0,
+				_lastIndex : 0,
+				_prevPos : 0,
+				_numTopItems : 0
+			});
+
+			var opts = this.options, widget = this;
+			opts.id = "#" + this.element.attr( 'id' );
+
+			if ( $( opts.id ).hasClass( "vgLoadSuccess" ) ) {
+				$( opts.id ).empty();
+				// validation row, column count
+				// initialize global value.
+				widget._lastIndex = opts.row;
+				widget._bufferSize = ( parseInt( ( opts.row / 4 ), 10 ) );
+				widget._totalItemCnt = $( window[opts.dbtable] ).size();
+				widget._pushData( ( opts.template ), window[opts.dbtable] );
+				widget._reposition();
+				widget._addEvents();
+			}
+		},
+		_pushData : function ( template, data ) {
+			var widget = this,
+				opts = this.options,
+				dataTable = data,
+				myTemplate = $( "#" + template ),
+				viewcount = opts.row * opts.column,
+				lastIndex = viewcount,
+				index = 0,
+				rowIndex = 0,
+				colIndex = 0,
+				wrapBlock = null;
+
+			for ( rowIndex = 0; rowIndex < opts.row; rowIndex += 1 ) {
+				wrapBlock = widget._makeWrapBlock( myTemplate, dataTable );
+				$( wrapBlock ).attr( "id", "block_" + rowIndex );
+				$( opts.id ).append( wrapBlock );
+			}
+			widget._blockHeight = $( wrapBlock ).outerHeight();
+		},
+		// make a single row block
+		_makeWrapBlock : function ( myTemplate, dataTable ) {
+			var widget = this,
+				opts = widget.options,
+				index = widget._currentIndex,
+				htmlData = null,
+				colIndex = 0,
+				wrapBlock = document.createElement( "div" );
+
+			$( wrapBlock ).addClass( "ui-virtualgrid-wrapblock" );
+			for ( colIndex = 0; colIndex < opts.column; colIndex++ ) {
+				htmlData = myTemplate.tmpl( dataTable[index] );
+				$( wrapBlock ).append( htmlData );
+				index = index <= widget._totalItemCnt ? index + 1 : 0;
+			}
+			widget._currentIndex = index;
+			return wrapBlock;
+		},
+		_reposition : function () {
+			var widget = this,
+				$view = widget.element,
+				opts = this.options,
+				wrapsBlocks = null,
+				childBlocks = null,
+				blockCount = 0,
+				index = 0,
+				subIndex = 0,
+				firstBlock = $( ".ui-virtualgrid-wrapblock:first" ),
+				subBlocks = firstBlock.children();
+
+			widget._blockHeight = firstBlock.outerHeight();
+			widget._titleHeight = firstBlock.position().top;
+
+			if ( subBlocks[0] ) {
+				widget._columnWidth = $( subBlocks[0] ).outerWidth();
+			}
+
+			wrapsBlocks = $( ".ui-virtualgrid-wrapblock" );
+			blockCount = wrapsBlocks.length;
+			for ( index = 0; index < blockCount; index += 1 ) {
+				$( wrapsBlocks[index] ).css( "top", widget._titleHeight + ( index * widget._blockHeight  ) );
+				childBlocks = $( wrapsBlocks[index] ).children();
+				for ( subIndex = 0; subIndex < childBlocks.length; subIndex += 1 ) {
+					$( childBlocks[subIndex] ).css( "left", ( subIndex * widget._columnWidth ) + 'px' );
+				}
+			}
+			// check total row count and setup total height
+			widget._totalRowCnt = ( widget._totalItemCnt % opts.column ) === 0 ? ( widget._totalItemCnt / opts.column ) : ( parseInt( ( widget._totalItemCnt / opts.column ), 10 ) + 1 );
+			$( opts.id ).height( widget._totalRowCnt * widget._blockHeight );
+		},
+
+		_addEvents : function () {
+			var widget = this;
+
+			$( document ).bind( "scrollupdate.virtualgrid", function ( event ) {
+				widget._doScrollEvent(event);
+			});
+
+			$( document ).bind( "scrollstop.virtualgrid", function ( event ) {
+				widget._doScrollEvent(event);
+			});
+		},
+
+		_doScrollEvent : function ( event ) {
+			var widget = this,
+				$view = this.element,
+				opts = widget.options,
+				dataList = window [opts.dbtable],
+				filterCondition = 0,
+				replaceRowCnt = 0,
+				replacedCount = 0,
+				$scrollview = $view.closest (".ui-scrollview-view"),
+				transformValue = null,
+				curWindowTop = 0;
+
+			transformValue = widget._matrixToArray ($scrollview.css ("-webkit-transform"));
+			curWindowTop = Math.abs (transformValue [5]);
+			if (widget._prevPos > curWindowTop) {
+				widget._direction = widget.SCROLL_UP;
+			} else if (widget._prevPos < curWindowTop) {
+				widget._direction = widget.SCROLL_DOWN;
+			}
+
+			if (widget._direction == widget.SCROLL_DOWN) {
+				filterCondition = (curWindowTop - widget._blockHeight );
+				replaceRowCnt = $ (".ui-virtualgrid-wrapblock").filter (function () {
+					return (parseInt (($ (this).position ().top ), 10) < filterCondition );
+				}).size ();
+				if (replaceRowCnt > widget._bufferSize) {
+					$ (document).bind ("touchstart.virtualgrid", function (event) {
+						event.preventDefault ();
+					});
+
+					replaceRowCnt = replaceRowCnt - widget._bufferSize;
+					replacedCount = widget._moveTopBottom (widget._firstIndex, widget._lastIndex, replaceRowCnt, opts.dbkey);
+					widget._firstIndex += replacedCount;
+					widget._lastIndex += replacedCount;
+					widget._numTopItems -= replacedCount;
+					$ (document).unbind ("touchstart.virtualgrid");
+				}
+			} else if (widget._direction == widget.SCROLL_UP) {
+				filterCondition = (curWindowTop + widget._viewHeight + ( widget._blockHeight * 3) );
+				replaceRowCnt = $ (".ui-virtualgrid-wrapblock").filter (function () {
+					return (parseInt (($ (this).position ().top ), 10) > filterCondition );
+				}).size ();
+				if (replaceRowCnt > widget._bufferSize) {
+					$ (document).bind ("touchstart.virtualgrid", function (event) {
+						event.preventDefault ();
+					});
+
+					replaceRowCnt = replaceRowCnt - widget._bufferSize;
+					replacedCount = widget._moveBottomTop (widget._firstIndex, widget._lastIndex, replaceRowCnt, opts.dbkey);
+					widget._firstIndex -= replacedCount;
+					widget._lastIndex -= replacedCount;
+					widget._numTopItems += replacedCount;
+					$ (document).unbind ("touchstart.virtualgrid");
+				}
+			}
+			// save preve position information.
+			widget._prevPos = curWindowTop;
+		},
+
+		/* Matrix to Array function written by Blender@stackoverflow.nnikishi@emich.edu*/
+		_matrixToArray : function ( matrix ) {
+			var contents = matrix.substr( 7 );
+			contents = contents.substr( 0, contents.length - 1 );
+			return contents.split( ', ' );
+		},
+		//Move older item to bottom
+		_moveTopBottom : function ( v_firstIndex, v_lastIndex, num, key ) {
+			if ( v_firstIndex < 0 ) {
+				return;
+			}
+
+			if ( num < 1 ) {
+				return;
+			}
+
+			var widget = this,
+				opts = widget.options,
+				dataList = window[opts.dbtable],
+				dataIndex = ( ( v_lastIndex ) * opts.column ),
+				count = 0,
+				curBlock = null,
+				cur_item = null,
+				myTemplate = null,
+				htmlData = null,
+				i = 0,
+				j = 0,
+				contentsBlocks = null;
+
+			// wrap block count
+			// print argument value
+			for ( i = 0; i < num; i += 1 ) {
+				if ( v_lastIndex >= widget._totalRowCnt ) {
+					break;
+				}
+
+				// select block
+				curBlock = $( "#block_" + ( v_firstIndex + i ) );
+				if ( !curBlock ) {
+					break;
+				}
+
+				contentsBlocks = curBlock.children();
+
+				for ( j = 0; j < opts.column; j += 1 ) {
+					cur_item = contentsBlocks[j];
+					myTemplate = $( "#" + opts.template );
+					htmlData = myTemplate.tmpl( dataList[dataIndex] );
+					widget._replace( cur_item, htmlData, key );
+					dataIndex += 1;
+				}
+
+				curBlock.css( "top", widget._titleHeight + widget._blockHeight * ( ( v_lastIndex ) ) ).css( "left", 0 );
+
+				contentsBlocks.css( "top", widget._titleHeight + widget._blockHeight * ( ( v_lastIndex ) ) );
+				curBlock.attr( "id", "block_" + ( v_lastIndex ) );
+
+				v_lastIndex++;
+				count++;
+			}
+			return count;
+		},
+		_moveBottomTop : function ( v_firstIndex, v_lastIndex, num, key ) {
+			if ( v_firstIndex < 0 ) {
+				return;
+			}
+
+			if ( num < 1 ) {
+				return;
+			}
+
+			var widget = this,
+				opts = widget.options,
+				dataList = window[opts.dbtable],
+				dataIndex = ( ( v_firstIndex - 1 ) * opts.column ),
+				targetBlock = $( ".ui-virtualgrid-wrapblock:first" ),
+				curBlock = null,
+				contentsBlocks = null,
+				cur_item = null,
+				myTemplate = null,
+				htmlData = null,
+				i = 0,
+				j = 0,
+				count = 0;
+
+			// print argument value
+			for ( i = 0; i < num; i += 1 ) {
+				if ( v_firstIndex - 1 < 0 ) {
+					break;
+				}
+
+				// select block
+				curBlock = $( "#block_" + ( ( v_lastIndex - 1 ) - i ) );
+				if ( !curBlock ) {
+					break;
+				}
+
+				dataIndex = ( ( v_firstIndex - 1 ) * opts.column );
+
+				contentsBlocks = curBlock.children();
+				for ( j = 0; j < opts.column; j += 1 ) {
+					cur_item = contentsBlocks[j];
+					myTemplate = $( "#" + opts.template );
+					htmlData = myTemplate.tmpl( dataList[dataIndex] );
+					widget._replace( cur_item, htmlData, key );
+					dataIndex++;
+				}
+				curBlock.css( "top", widget._titleHeight + widget._blockHeight * ( ( v_firstIndex - 1 ) ) ).css( "left", 0 );
+				curBlock.attr( "id", "block_" + ( v_firstIndex - 1 ) );
+				contentsBlocks.css( "top", widget._titleHeight + widget._blockHeight * ( ( v_firstIndex - 1 ) ) );
+
+				v_firstIndex -= 1;
+				count++;
+			}
+			return count;
+		},
+		/* Text & image src replace function */
+		// @param oldItem   : prev HtmlDivElement
+		// @param newItem   : new HtmlDivElement for replace
+		// @param key       :
+		_replace : function ( oldItem, newItem, key ) {
+			$( oldItem ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).each( function ( index ) {
+				var oldObj = $( this ),
+					newText = $( newItem ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).eq( index ).text();
+
+				$( oldObj ).contents().filter( function () {
+					return ( this.nodeType == 3 );
+				}).get( 0 ).data = newText;
+			});
+
+			$( oldItem ).find( "img" ).each( function ( imgIndex ) {
+				var oldObj = $( this ),
+					newImg = $( newItem ).find( "img" ).eq( imgIndex ).attr( "src" );
+
+				$( oldObj ).attr( "src", newImg );
+			});
+			if ( key ) {
+				$( oldItem ).data( key, $( newItem ).data( key ) );
+			}
+		}
+	});
+
+	$( document ).bind( "pagecreate create", function () {
+		$( ":jqmData(role='virtualgrid')" ).virtualgrid();
+	});
+
+} ( jQuery, window ) );
+
+/* ***************************************************************************
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ * ***************************************************************************
+ *
+ *	Author: Wongi Lee <wongi11.lee@samsung.com>
+ */
+
+/**
+ * Virtual List Widget for unlimited data.
+ * To support more then 1,000 items, special list widget developed. 
+ * Fast initialize and light DOM tree.
+ * DB connection and works like DB cursor.     
+ * 
+ * HTML Attributes:
+ *
+ *		data-role:	virtuallistview
+ *		data-template : jQuery.template ID that populate into virtual list 
+ *		data-dbtable : DB Table name. It used as window[DB NAME]. Loaded data should be converted as window object.
+ *		data-dbkey : Unique key of DB Table. To sync each element on virtual list with DB table. 
+ *		data-row : Optional. Set number of <li> elements that are used for data handling. 
+ *		
+ *		ID : <UL> element that has "data-role=virtuallist" must have ID attribute.
+ *		Class : <UL> element that has "data-role=virtuallist" should have "vlLoadSuccess" class to guaranty DB loading is completed. 
+ *
+ * * APIs:
+ *
+ *		create ( void )
+ *			: API to call _create method. API for AJAX or DB loading callback.
+ *
+ *		recreate ( Array )
+ *			: Update virtual list with new data array. For example, update with search result. 
+ *
+ * Events:
+ *
+ *		touchstart : Temporary preventDefault applied on touchstart event to avoid broken screen.
+ *
+ * Examples:
+ *
+ *		<script id="tmp-3-2-7" type="text/x-jquery-tmpl">
+ *			<li class="ui-li-3-2-7">
+ *				<span class="ui-li-text-main">${NAME}</span>
+ *				<img src="00_winset_icon_favorite_on.png" class="ui-li-icon-sub">
+ *				<span class="ui-li-text-sub">${ACTIVE}</span>
+ *				<span class="ui-li-text-sub2">${FROM}</span>
+ *			</li>
+ *		</script>
+ *
+ *		<ul id="virtuallist-normal_3_2_7_ul" data-role="virtuallistview" data-template="tmp-3-2-7" data-dbtable="JSON_DATA" data-row="100">
+ *		</ul>
+ *
+ */
+
+
+(function ( $, undefined ) {
+
+	/* Code for Virtual List Demo */
+	var listCountPerPage = {},	/* Keeps track of the number of lists per page UID. This allows support for multiple nested list in the same page. https://github.com/jquery/jquery-mobile/issues/1617 */
+		TOTAL_ITEMS = 0,
+		LINE_H = 0,
+		TITLE_H = 0,
+		CONTAINER_W = 0,
+		NO_SCROLL = 0,					/* ENUM */
+		SCROLL_DOWN = 1,				/* ENUM */
+		SCROLL_UP = -1,					/* ENUM */
+		MINIMUM_ROW = 20,
+		direction = NO_SCROLL,
+		first_index,
+		last_index,
+		num_top_items = 0;				//By scroll move, number of hidden elements.
+
+	$.widget( "tizen.virtuallistview", $.mobile.widget, {
+		options: {
+			theme: "s",
+			countTheme: "c",
+			headerTheme: "b",
+			dividerTheme: "b",
+			splitIcon: "arrow-r",
+			splitTheme: "b",
+			inset: false,
+			id:	"",					/* Virtual list UL elemet's ID */
+			childSelector: " li",	/* To support swipe list */
+			dbtable: "",
+			template : "",
+			dbkey: false,			/* Data's unique Key */
+			scrollview: false,
+			row: 100,
+			page_buf: 50,
+			initSelector: ":jqmData(role='virtuallistview')"
+		},
+
+		_stylerMouseUp: function () {
+			$( this ).addClass( "ui-btn-up-s" );
+			$( this ).removeClass( "ui-btn-down-s" );
+		},
+
+		_stylerMouseDown: function () {
+			$( this ).addClass( "ui-btn-down-s" );
+			$( this ).removeClass( "ui-btn-up-s" );
+		},
+
+		_stylerMouseOver: function () {
+			$( this ).toggleClass( "ui-btn-hover-s" );
+		},
+
+		_stylerMouseOut: function () {
+			$( this ).toggleClass( "ui-btn-hover-s" );
+		},
+
+		_pushData: function ( template, data ) {
+			var o = this.options,
+				i,
+				dataTable = data,
+				myTemplate = $( "#" + template ),
+				lastIndex = ( o.row > data.length ? data.length : o.row ),
+				htmlData;
+
+			for ( i = 0; i < lastIndex; i++ ) {
+				htmlData = myTemplate.tmpl( dataTable[i] );
+				$( o.id ).append( $( htmlData ).attr( 'id', 'li_' + i ) );
+			}
+
+			/* After push data, re-style virtuallist widget */
+			$( o.id ).trigger( "create" );
+		},
+
+		_reposition: function ( event ) {
+			var o,
+				t = this,
+				padding;
+
+			if ( event.data ) {
+				o = event.data;
+			} else {
+				o = event;
+			}
+
+			if ( $( o.id + o.childSelector ).size() > 0 ) {
+				TITLE_H = $( o.id + o.childSelector + ':first' ).position().top;
+				LINE_H = $( o.id + o.childSelector + ':first' ).outerHeight();
+
+				CONTAINER_W = $( o.id ).innerWidth();
+
+				padding = parseInt( $( o.id + o.childSelector ).css( "padding-left" ), 10 ) + parseInt( $( o.id + o.childSelector ).css( "padding-right" ), 10 );
+
+				/* Add style */
+				$( o.id + ">" + o.childSelector ).addClass( "position_absolute" ).addClass( "ui-btn-up-s" )
+													.bind( "mouseup", t._stylerMouseUp )
+													.bind( "mousedown", t._stylerMouseDown )
+													.bind( "mouseover", t._stylerMouseOver )
+													.bind( "mouseout", t._stylerMouseOut );
+			}
+
+			$( o.id + ">" + o.childSelector ).each( function ( index ) {
+				$( this ).css( "top", TITLE_H + LINE_H * index + 'px' )
+					.css( "width", CONTAINER_W - padding );
+			} );
+
+			/* Set Max List Height */
+			$( o.id ).height( TOTAL_ITEMS * LINE_H );
+		},
+
+		_resize: function ( event ) {
+			var o,
+				t = this,
+				padding;
+
+			if ( event.data ) {
+				o = event.data;
+			} else {
+				o = event;
+			}
+
+			CONTAINER_W = $( o.id ).innerWidth();
+
+			padding = parseInt( $( o.id + o.childSelector ).css( "padding-left" ), 10 ) + parseInt( $( o.id + o.childSelector ).css( "padding-right" ), 10 );
+
+			$( o.id + o.childSelector ).each( function (index) {
+				$( this ).css( "width", CONTAINER_W - padding );
+			} );
+		},
+
+		_scrollmove: function ( event ) {
+			var velocity = 0,
+				o = event.data,
+				i,
+				dataList = window[o.dbtable],
+				_replace,		/* Function */
+				_moveTopBottom,	/* Function */
+				_moveBottomTop,	/* Function */
+				_matrixToArray,	/* Function */
+				$el,
+				transformValue,
+				curWindowTop,
+				cur_num_top_itmes;
+
+			/* Text & image src replace function */
+			_replace = function ( oldItem, newItem, key ) {
+				var oldObj,
+					newText,
+					newImg;
+
+				$( oldItem ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).each( function ( index ) {
+					oldObj = $( this );
+					newText = $( newItem ).find( ".ui-li-text-main", ".ui-li-text-sub", "ui-btn-text" ).eq( index ).text();
+
+					$( oldObj).contents().filter( function () {
+						return ( this.nodeType == 3 );
+					} ).get( 0 ).data = newText;
+				} );
+
+				$( oldItem ).find( "img" ).each( function ( imgIndex ) {
+					oldObj = $( this );
+					newImg = $( newItem ).find( "img" ).eq( imgIndex ).attr( "src" );
+
+					$( oldObj ).attr( "src", newImg );
+				} );
+
+				if (key) {
+					$( oldItem ).data( key, $( newItem ).data( key ) );
+				}
+			};
+
+			//Move older item to bottom
+			_moveTopBottom = function ( v_firstIndex, v_lastIndex, num, key ) {
+				var myTemplate,
+					htmlData,
+					cur_item;
+
+				if (v_firstIndex < 0) {
+					return;
+				}
+
+				for ( i = 0; i < num; i++ ) {
+					if ( v_lastIndex + i > TOTAL_ITEMS ) {
+						break;
+					}
+
+					cur_item = $( '#li_' + ( v_firstIndex + i ) );
+
+					if ( cur_item ) {
+						/* Make New <LI> element from template. */
+						myTemplate = $( "#" + o.template );
+						htmlData = myTemplate.tmpl( dataList[ v_lastIndex + i ] );
+
+						/* Copy all data to current item. */
+						_replace( cur_item, htmlData, key );
+
+						/* Set New Position */
+						( cur_item ).css( 'top', TITLE_H + LINE_H * ( v_lastIndex + 1 + i ) ).attr( 'id', 'li_' + ( v_lastIndex + 1 + i ) );
+					} else {
+						break;
+					}
+				}
+			};
+
+			// Move older item to bottom
+			_moveBottomTop = function ( v_firstIndex, v_lastIndex, num, key ) {
+				var myTemplate,
+					htmlData,
+					cur_item;
+
+				if ( v_firstIndex < 0 ) {
+					return;
+				}
+
+				for ( i = 0; i < num; i++ ) {
+					cur_item = $( '#li_' + ( v_lastIndex - i ) );
+
+					if ( cur_item ) {
+						if ( v_firstIndex - 1 - i < 0 ) {
+							break;
+						}
+
+						/* Make New <LI> element from template. */
+						myTemplate = $( "#" + o.template );
+						htmlData = myTemplate.tmpl( dataList[ v_firstIndex - 1 - i ] );
+
+						/* Copy all data to current item. */
+						_replace( cur_item, htmlData, key );
+
+						/* Set New Position */
+						$( cur_item ).css( 'top', TITLE_H + LINE_H * ( v_firstIndex - 1 - i ) ).attr( 'id', 'li_' + ( v_firstIndex - 1 - i ) );
+					} else {
+						break;
+					}
+				}
+			};
+
+			/* Matrix to Array function written by Blender@stackoverflow.nnikishi@emich.edu*/
+			_matrixToArray = function ( matrix ) {
+				var contents = matrix.substr( 7 );
+
+				contents = contents.substr( 0, contents.length - 1 );
+
+				return contents.split( ', ' );
+			};
+
+			// Get scroll direction and velocity
+			/* with Scroll view */
+			if ( o.scrollview ) {
+				$el = $( o.id ).parentsUntil( ".ui-page" ).find( ".ui-scrollview-view" );
+				transformValue = _matrixToArray( $el.css( "-webkit-transform" ) );
+				curWindowTop = Math.abs( transformValue[ 5 ] );	/* Y vector */
+			} else {
+				curWindowTop = $( window ).scrollTop() - LINE_H;
+			}
+
+			cur_num_top_itmes = $( o.id + o.childSelector ).filter( function () {
+				return (parseInt( $( this ).css( "top" ), 10 ) < curWindowTop );
+			} ).size();
+
+			if ( num_top_items < cur_num_top_itmes ) {
+				direction = SCROLL_DOWN;
+				velocity = cur_num_top_itmes - num_top_items;
+				num_top_items = cur_num_top_itmes;
+			} else if ( num_top_items > cur_num_top_itmes ) {
+				direction = SCROLL_UP;
+				velocity = num_top_items - cur_num_top_itmes;
+				num_top_items = cur_num_top_itmes;
+			}
+
+			// Move items
+			if ( direction == SCROLL_DOWN ) {
+				if ( cur_num_top_itmes > o.page_buf ) {
+					if ( last_index + velocity > TOTAL_ITEMS ) {
+						velocity = TOTAL_ITEMS - last_index - 1;
+					}
+
+					/* Prevent scroll touch event while DOM access */
+					$(document).bind( "touchstart.virtuallist", function (event) {
+						event.preventDefault();
+					});
+
+					_moveTopBottom( first_index, last_index, velocity, o.dbkey );
+
+					first_index += velocity;
+					last_index += velocity;
+					num_top_items -= velocity;
+
+					/* Unset prevent touch event */
+					$( document ).unbind( "touchstart.virtuallist" );
+				}
+			} else if ( direction == SCROLL_UP ) {
+				if ( cur_num_top_itmes <= o.page_buf ) {
+					if ( first_index < velocity ) {
+						velocity = first_index;
+					}
+
+					/* Prevent scroll touch event while DOM access */
+					$( document ).bind( "touchstart.virtuallist", function ( event ) {
+						event.preventDefault();
+					});
+
+					_moveBottomTop( first_index, last_index, velocity, o.dbkey );
+
+					first_index -= velocity;
+					last_index -= velocity;
+					num_top_items += velocity;
+
+					/* Unset prevent touch event */
+					$( document ).unbind( "touchstart.virtuallist" );
+				}
+
+				if ( first_index < o.page_buf ) {
+					num_top_items = first_index;
+				}
+			}
+		},
+
+		recreate: function ( newArray ) {
+			var t = this,
+				o = this.options;
+
+			$( o.id ).empty();
+
+			TOTAL_ITEMS = newArray.length;
+			direction = NO_SCROLL;
+			first_index = 0;
+			last_index = o.row - 1;
+
+			t._pushData( ( o.template ), newArray );
+
+			if (o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			$( o.id ).virtuallistview();
+
+			t._reposition( o );
+
+			t.refresh( true );
+		},
+
+		_initList: function () {
+			var t = this,
+				o = this.options;
+
+			/* After AJAX loading success */
+			o.dbtable = t.element.data( "dbtable" );
+
+			TOTAL_ITEMS = $(window[o.dbtable]).size();
+
+			/* Make Gen list by template */
+			t._pushData( (o.template), window[o.dbtable]);
+
+			$( o.id ).parentsUntil( ".ui-page" ).parent().one( "pageshow", o, t._reposition);
+
+			/* Scrollview */
+			$( document ).bind( "scrollstop.virtuallist", t.options, t._scrollmove );
+
+			$( window ).bind( "resize.virtuallist", t._resize );
+
+			if ( o.childSelector == " ul" ) {
+				$( o.id + " ul" ).swipelist();
+			}
+
+			t.refresh( true );
+		},
+
+		create: function () {
+			var o = this.options;
+
+			/* external API for AJAX callback */
+			this._create( "create" );
+
+			this._reposition( o );
+		},
+
+		_create: function ( event ) {
+			var t = this,
+				o = this.options,
+				$el = this.element,
+				shortcutsContainer = $('<div class="ui-virtuallist"/>'),
+				shortcutsList = $('<ul></ul>'),
+				dividers = $el.find(':jqmData(role="virtuallistview" )'),
+				lastListItem = null,
+				shortcutscroll = this;
+
+			// create listview markup
+			t.element.addClass( function ( i, orig ) {
+				return orig + " ui-listview ui-virtual-list-container" + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" );
+			});
+
+			o.id = "#" + $el.attr( "id" );
+
+			$( o.id ).bind( "pagehide", function ( e ) {
+				$( o.id ).empty();
+			});
+
+			/* Scroll view */
+			if ( $( ".ui-scrollview-clip" ).size() > 0 ) {
+				o.scrollview = true;
+			} else {
+				o.scrollview = false;
+			}
+
+			/* Init list and page buf */
+			if ( $el.data( "row" ) ) {
+				o.row = $el.data( "row" );
+
+				if ( o.row < MINIMUM_ROW ) {
+					o.row = MINIMUM_ROW;
+				}
+
+				o.page_buf = parseInt( ( o.row / 2 ), 10 );
+			}
+
+			/* After DB Load complete, Init Vritual list */
+			if ( $( o.id ).hasClass( "vlLoadSuccess" ) ) {
+				$( o.id ).empty();
+
+				if ( $el.data( "template" ) ) {
+					o.template = $el.data( "template" );
+
+					/* to support swipe list, <li> or <ul> can be main node of virtual list. */
+					if ( $el.data( "swipelist" ) == true ) {
+						o.childSelector = " ul";
+					} else {
+						o.childSelector = " li";
+					}
+				}
+
+				/* Set data's unique key */
+				if ( $el.data( "dbkey" ) ) {
+					o.datakey = $el.data( "dbkey" );
+				}
+
+				first_index = 0;			//first id of <li> element.
+				last_index = o.row - 1;		//last id of <li> element.
+
+				t._initList();
+			}
+		},
+
+		destroy : function () {
+			var o = this.options;
+
+			$( document ).unbind( "scrollstop" );
+
+			$( window ).unbind( "resize.virtuallist" );
+
+			$( o.id ).empty();
+		},
+
+		_itemApply: function ( $list, item ) {
+			var $countli = item.find( ".ui-li-count" );
+
+			if ( $countli.length ) {
+				item.addClass( "ui-li-has-count" );
+			}
+
+			$countli.addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme ) + " ui-btn-corner-all" );
+
+			// TODO class has to be defined in markup
+			item.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ).end()
+				.find( "p, dl" ).addClass( "ui-li-desc" ).end()
+				.find( ">img:eq(0), .ui-link-inherit>img:eq(0)" ).addClass( "ui-li-thumb" ).each( function () {
+					item.addClass( $( this ).is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+				}).end()
+				.find( ".ui-li-aside" ).each(function () {
+					var $this = $( this );
+					$this.prependTo( $this.parent() ); //shift aside to front for css float
+				} );
+		},
+
+		_removeCorners: function ( li, which ) {
+			var top = "ui-corner-top ui-corner-tr ui-corner-tl",
+				bot = "ui-corner-bottom ui-corner-br ui-corner-bl";
+
+			li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) );
+
+			if ( which === "top" ) {
+				li.removeClass( top );
+			} else if ( which === "bottom" ) {
+				li.removeClass( bot );
+			} else {
+				li.removeClass( top + " " + bot );
+			}
+		},
+
+		_refreshCorners: function ( create ) {
+			var $li,
+				$visibleli,
+				$topli,
+				$bottomli;
+
+			if ( this.options.inset ) {
+				$li = this.element.children( "li" );
+				// at create time the li are not visible yet so we need to rely on .ui-screen-hidden
+				$visibleli = create ? $li.not( ".ui-screen-hidden" ) : $li.filter( ":visible" );
+
+				this._removeCorners( $li );
+
+				// Select the first visible li element
+				$topli = $visibleli.first()
+					.addClass( "ui-corner-top" );
+
+				$topli.add( $topli.find( ".ui-btn-inner" ) )
+					.find( ".ui-li-link-alt" )
+						.addClass( "ui-corner-tr" )
+					.end()
+					.find( ".ui-li-thumb" )
+						.not( ".ui-li-icon" )
+						.addClass( "ui-corner-tl" );
+
+				// Select the last visible li element
+				$bottomli = $visibleli.last()
+					.addClass( "ui-corner-bottom" );
+
+				$bottomli.add( $bottomli.find( ".ui-btn-inner" ) )
+					.find( ".ui-li-link-alt" )
+						.addClass( "ui-corner-br" )
+					.end()
+					.find( ".ui-li-thumb" )
+						.not( ".ui-li-icon" )
+						.addClass( "ui-corner-bl" );
+			}
+		},
+
+		refresh: function ( create ) {
+			this.parentPage = this.element.closest( ".ui-page" );
+			this._createSubPages();
+
+			var o = this.options,
+				$list = this.element,
+				self = this,
+				dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme,
+				listsplittheme = $list.jqmData( "splittheme" ),
+				listspliticon = $list.jqmData( "spliticon" ),
+				li = $list.children( "li" ),
+				counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1,
+				item,
+				itemClass,
+				temTheme,
+				a,
+				last,
+				splittheme,
+				countParent,
+				icon,
+				pos,
+				numli,
+				itemTheme;
+
+			if ( counter ) {
+				$list.find( ".ui-li-dec" ).remove();
+			}
+
+			for ( pos = 0, numli = li.length; pos < numli; pos++ ) {
+				item = li.eq( pos );
+				itemClass = "ui-li";
+
+				// If we're creating the element, we update it regardless
+				if ( create || !item.hasClass( "ui-li" ) ) {
+					itemTheme = item.jqmData( "theme" ) || o.theme;
+					a = item.children( "a" );
+
+					if ( a.length ) {
+						icon = item.jqmData( "icon" );
+
+						item.buttonMarkup({
+							wrapperEls: "div",
+							shadow: false,
+							corners: false,
+							iconpos: "right",
+							/* icon: a.length > 1 || icon === false ? false : icon || "arrow-r",*/
+							icon: false,	/* Remove unnecessary arrow icon */
+							theme: itemTheme
+						});
+
+						if ( ( icon != false ) && ( a.length == 1 ) ) {
+							item.addClass( "ui-li-has-arrow" );
+						}
+
+						a.first().addClass( "ui-link-inherit" );
+
+						if ( a.length > 1 ) {
+							itemClass += " ui-li-has-alt";
+
+							last = a.last();
+							splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme;
+
+							last.appendTo(item)
+								.attr( "title", last.getEncodedText() )
+								.addClass( "ui-li-link-alt" )
+								.empty()
+								.buttonMarkup({
+									shadow: false,
+									corners: false,
+									theme: itemTheme,
+									icon: false,
+									iconpos: false
+								})
+								.find( ".ui-btn-inner" )
+								.append(
+									$( "<span />" ).buttonMarkup({
+										shadow: true,
+										corners: true,
+										theme: splittheme,
+										iconpos: "notext",
+										icon: listspliticon || last.jqmData( "icon" ) || o.splitIcon
+									})
+								);
+						}
+					} else if ( item.jqmData( "role" ) === "list-divider" ) {
+
+						itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme;
+						item.attr( "role", "heading" );
+
+						//reset counter when a divider heading is encountered
+						if ( counter ) {
+							counter = 1;
+						}
+
+					} else {
+						itemClass += " ui-li-static ui-body-" + itemTheme;
+					}
+				}
+
+				if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) {
+					countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" );
+
+					countParent.addClass( "ui-li-jsnumbering" )
+						.prepend( "<span class='ui-li-dec'>" + (counter++) + ". </span>" );
+				}
+
+				item.add( item.children( ".ui-btn-inner" ) ).addClass( itemClass );
+
+				self._itemApply( $list, item );
+			}
+
+			this._refreshCorners( create );
+		},
+
+		//create a string for ID/subpage url creation
+		_idStringEscape: function ( str ) {
+			return str.replace(/\W/g , "-");
+		},
+
+		_createSubPages: function () {
+			var parentList = this.element,
+				parentPage = parentList.closest( ".ui-page" ),
+				parentUrl = parentPage.jqmData( "url" ),
+				parentId = parentUrl || parentPage[ 0 ][ $.expando ],
+				parentListId = parentList.attr( "id" ),
+				o = this.options,
+				dns = "data-" + $.mobile.ns,
+				self = this,
+				persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ),
+				hasSubPages,
+				newRemove;
+
+			if ( typeof listCountPerPage[ parentId ] === "undefined" ) {
+				listCountPerPage[ parentId ] = -1;
+			}
+
+			parentListId = parentListId || ++listCountPerPage[ parentId ];
+
+			$( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function ( i ) {
+				var self = this,
+					list = $( this ),
+					listId = list.attr( "id" ) || parentListId + "-" + i,
+					parent = list.parent(),
+					nodeEls,
+					title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text
+					id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId,
+					theme = list.jqmData( "theme" ) || o.theme,
+					countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme,
+					newPage,
+					anchor;
+
+				nodeEls = $( list.prevAll().toArray().reverse() );
+				nodeEls = nodeEls.length ? nodeEls : $( "<span>" + $.trim( parent.contents()[ 0 ].nodeValue ) + "</span>" );
+
+				//define hasSubPages for use in later removal
+				hasSubPages = true;
+
+				newPage = list.detach()
+							.wrap( "<div " + dns + "role='page' " +	dns + "url='" + id + "' " + dns + "theme='" + theme + "' " + dns + "count-theme='" + countTheme + "'><div " + dns + "role='content'></div></div>" )
+							.parent()
+								.before( "<div " + dns + "role='header' " + dns + "theme='" + o.headerTheme + "'><div class='ui-title'>" + title + "</div></div>" )
+								.after( persistentFooterID ? $( "<div " + dns + "role='footer' " + dns + "id='" + persistentFooterID + "'>" ) : "" )
+								.parent()
+								.appendTo( $.mobile.pageContainer );
+
+				newPage.page();
+
+				anchor = parent.find('a:first');
+
+				if ( !anchor.length ) {
+					anchor = $( "<a/>" ).html( nodeEls || title ).prependTo( parent.empty() );
+				}
+
+				anchor.attr( "href", "#" + id );
+
+			}).virtuallistview();
+
+			// on pagehide, remove any nested pages along with the parent page, as long as they aren't active
+			// and aren't embedded
+			if ( hasSubPages &&
+						parentPage.is( ":jqmData(external-page='true')" ) &&
+						parentPage.data( "page" ).options.domCache === false ) {
+
+				newRemove = function ( e, ui ) {
+					var nextPage = ui.nextPage, npURL;
+
+					if ( ui.nextPage ) {
+						npURL = nextPage.jqmData( "url" );
+						if ( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ) {
+							self.childPages().remove();
+							parentPage.remove();
+						}
+					}
+				};
+
+				// unbind the original page remove and replace with our specialized version
+				parentPage
+					.unbind( "pagehide.remove" )
+					.bind( "pagehide.remove", newRemove );
+			}
+		},
+
+		// TODO sort out a better way to track sub pages of the virtuallistview this is brittle
+		childPages: function () {
+			var parentUrl = this.parentPage.jqmData( "url" );
+
+			return $( ":jqmData(url^='" +  parentUrl + "&" + $.mobile.subPageUrlKey + "')" );
+		}
+	});
+
+	//auto self-init widgets
+	$( document ).bind( "pagecreate create", function ( e ) {
+		$( $.tizen.virtuallistview.prototype.options.initSelector, e.target ).virtuallistview();
+	});
+
+} ( jQuery ) );
+/*!
+ * Globalize
+ *
+ * http://github.com/jquery/globalize
+ *
+ * Copyright Software Freedom Conservancy, Inc.
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ */
+
+(function( window, undefined ) {
+
+var Globalize,
+	// private variables
+	regexHex,
+	regexInfinity,
+	regexParseFloat,
+	regexTrim,
+	// private JavaScript utility functions
+	arrayIndexOf,
+	endsWith,
+	extend,
+	isArray,
+	isFunction,
+	isObject,
+	startsWith,
+	trim,
+	truncate,
+	zeroPad,
+	// private Globalization utility functions
+	appendPreOrPostMatch,
+	expandFormat,
+	formatDate,
+	formatNumber,
+	getTokenRegExp,
+	getEra,
+	getEraYear,
+	parseExact,
+	parseNegativePattern;
+
+// Global variable (Globalize) or CommonJS module (globalize)
+Globalize = function( cultureSelector ) {
+	return new Globalize.prototype.init( cultureSelector );
+};
+
+if ( typeof require !== "undefined"
+	&& typeof exports !== "undefined"
+	&& typeof module !== "undefined" ) {
+	// Assume CommonJS
+	module.exports = Globalize;
+} else {
+	// Export as global variable
+	window.Globalize = Globalize;
+}
+
+Globalize.cultures = {};
+
+Globalize.prototype = {
+	constructor: Globalize,
+	init: function( cultureSelector ) {
+		this.cultures = Globalize.cultures;
+		this.cultureSelector = cultureSelector;
+
+		return this;
+	}
+};
+Globalize.prototype.init.prototype = Globalize.prototype;
+
+// 1.	 When defining a culture, all fields are required except the ones stated as optional.
+// 2.	 Each culture should have a ".calendars" object with at least one calendar named "standard"
+//		 which serves as the default calendar in use by that culture.
+// 3.	 Each culture should have a ".calendar" object which is the current calendar being used,
+//		 it may be dynamically changed at any time to one of the calendars in ".calendars".
+Globalize.cultures[ "default" ] = {
+	// A unique name for the culture in the form <language code>-<country/region code>
+	name: "en",
+	// the name of the culture in the english language
+	englishName: "English",
+	// the name of the culture in its own language
+	nativeName: "English",
+	// whether the culture uses right-to-left text
+	isRTL: false,
+	// "language" is used for so-called "specific" cultures.
+	// For example, the culture "es-CL" means "Spanish, in Chili".
+	// It represents the Spanish-speaking culture as it is in Chili,
+	// which might have different formatting rules or even translations
+	// than Spanish in Spain. A "neutral" culture is one that is not
+	// specific to a region. For example, the culture "es" is the generic
+	// Spanish culture, which may be a more generalized version of the language
+	// that may or may not be what a specific culture expects.
+	// For a specific culture like "es-CL", the "language" field refers to the
+	// neutral, generic culture information for the language it is using.
+	// This is not always a simple matter of the string before the dash.
+	// For example, the "zh-Hans" culture is netural (Simplified Chinese).
+	// And the "zh-SG" culture is Simplified Chinese in Singapore, whose lanugage
+	// field is "zh-CHS", not "zh".
+	// This field should be used to navigate from a specific culture to it's
+	// more general, neutral culture. If a culture is already as general as it
+	// can get, the language may refer to itself.
+	language: "en",
+	// numberFormat defines general number formatting rules, like the digits in
+	// each grouping, the group separator, and how negative numbers are displayed.
+	numberFormat: {
+		// [negativePattern]
+		// Note, numberFormat.pattern has no "positivePattern" unlike percent and currency,
+		// but is still defined as an array for consistency with them.
+		//   negativePattern: one of "(n)|-n|- n|n-|n -"
+		pattern: [ "-n" ],
+		// number of decimal places normally shown
+		decimals: 2,
+		// string that separates number groups, as in 1,000,000
+		",": ",",
+		// string that separates a number from the fractional portion, as in 1.99
+		".": ".",
+		// array of numbers indicating the size of each number group.
+		// TODO: more detailed description and example
+		groupSizes: [ 3 ],
+		// symbol used for positive numbers
+		"+": "+",
+		// symbol used for negative numbers
+		"-": "-",
+		// symbol used for NaN (Not-A-Number)
+		NaN: "NaN",
+		// symbol used for Negative Infinity
+		negativeInfinity: "-Infinity",
+		// symbol used for Positive Infinity
+		positiveInfinity: "Infinity",
+		percent: {
+			// [negativePattern, positivePattern]
+			//   negativePattern: one of "-n %|-n%|-%n|%-n|%n-|n-%|n%-|-% n|n %-|% n-|% -n|n- %"
+			//   positivePattern: one of "n %|n%|%n|% n"
+			pattern: [ "-n %", "n %" ],
+			// number of decimal places normally shown
+			decimals: 2,
+			// array of numbers indicating the size of each number group.
+			// TODO: more detailed description and example
+			groupSizes: [ 3 ],
+			// string that separates number groups, as in 1,000,000
+			",": ",",
+			// string that separates a number from the fractional portion, as in 1.99
+			".": ".",
+			// symbol used to represent a percentage
+			symbol: "%"
+		},
+		currency: {
+			// [negativePattern, positivePattern]
+			//   negativePattern: one of "($n)|-$n|$-n|$n-|(n$)|-n$|n-$|n$-|-n $|-$ n|n $-|$ n-|$ -n|n- $|($ n)|(n $)"
+			//   positivePattern: one of "$n|n$|$ n|n $"
+			pattern: [ "($n)", "$n" ],
+			// number of decimal places normally shown
+			decimals: 2,
+			// array of numbers indicating the size of each number group.
+			// TODO: more detailed description and example
+			groupSizes: [ 3 ],
+			// string that separates number groups, as in 1,000,000
+			",": ",",
+			// string that separates a number from the fractional portion, as in 1.99
+			".": ".",
+			// symbol used to represent currency
+			symbol: "$"
+		}
+	},
+	// calendars defines all the possible calendars used by this culture.
+	// There should be at least one defined with name "standard", and is the default
+	// calendar used by the culture.
+	// A calendar contains information about how dates are formatted, information about
+	// the calendar's eras, a standard set of the date formats,
+	// translations for day and month names, and if the calendar is not based on the Gregorian
+	// calendar, conversion functions to and from the Gregorian calendar.
+	calendars: {
+		standard: {
+			// name that identifies the type of calendar this is
+			name: "Gregorian_USEnglish",
+			// separator of parts of a date (e.g. "/" in 11/05/1955)
+			"/": "/",
+			// separator of parts of a time (e.g. ":" in 05:44 PM)
+			":": ":",
+			// the first day of the week (0 = Sunday, 1 = Monday, etc)
+			firstDay: 0,
+			days: {
+				// full day names
+				names: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
+				// abbreviated day names
+				namesAbbr: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
+				// shortest day names
+				namesShort: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ]
+			},
+			months: {
+				// full month names (13 months for lunar calendards -- 13th month should be "" if not lunar)
+				names: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "" ],
+				// abbreviated month names
+				namesAbbr: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "" ]
+			},
+			// AM and PM designators in one of these forms:
+			// The usual view, and the upper and lower case versions
+			//   [ standard, lowercase, uppercase ]
+			// The culture does not use AM or PM (likely all standard date formats use 24 hour time)
+			//   null
+			AM: [ "AM", "am", "AM" ],
+			PM: [ "PM", "pm", "PM" ],
+			eras: [
+				// eras in reverse chronological order.
+				// name: the name of the era in this culture (e.g. A.D., C.E.)
+				// start: when the era starts in ticks (gregorian, gmt), null if it is the earliest supported era.
+				// offset: offset in years from gregorian calendar
+				{
+					"name": "A.D.",
+					"start": null,
+					"offset": 0
+				}
+			],
+			// when a two digit year is given, it will never be parsed as a four digit
+			// year greater than this year (in the appropriate era for the culture)
+			// Set it as a full year (e.g. 2029) or use an offset format starting from
+			// the current year: "+19" would correspond to 2029 if the current year 2010.
+			twoDigitYearMax: 2029,
+			// set of predefined date and time patterns used by the culture
+			// these represent the format someone in this culture would expect
+			// to see given the portions of the date that are shown.
+			patterns: {
+				// short date pattern
+				d: "M/d/yyyy",
+				// long date pattern
+				D: "dddd, MMMM dd, yyyy",
+				// short time pattern
+				t: "h:mm tt",
+				// long time pattern
+				T: "h:mm:ss tt",
+				// long date, short time pattern
+				f: "dddd, MMMM dd, yyyy h:mm tt",
+				// long date, long time pattern
+				F: "dddd, MMMM dd, yyyy h:mm:ss tt",
+				// month/day pattern
+				M: "MMMM dd",
+				// month/year pattern
+				Y: "yyyy MMMM",
+				// S is a sortable format that does not vary by culture
+				S: "yyyy\u0027-\u0027MM\u0027-\u0027dd\u0027T\u0027HH\u0027:\u0027mm\u0027:\u0027ss"
+			}
+			// optional fields for each calendar:
+			/*
+			monthsGenitive:
+				Same as months but used when the day preceeds the month.
+				Omit if the culture has no genitive distinction in month names.
+				For an explaination of genitive months, see http://blogs.msdn.com/michkap/archive/2004/12/25/332259.aspx
+			convert:
+				Allows for the support of non-gregorian based calendars. This convert object is used to
+				to convert a date to and from a gregorian calendar date to handle parsing and formatting.
+				The two functions:
+					fromGregorian( date )
+						Given the date as a parameter, return an array with parts [ year, month, day ]
+						corresponding to the non-gregorian based year, month, and day for the calendar.
+					toGregorian( year, month, day )
+						Given the non-gregorian year, month, and day, return a new Date() object
+						set to the corresponding date in the gregorian calendar.
+			*/
+		}
+	},
+	// For localized strings
+	messages: {}
+};
+
+Globalize.cultures[ "default" ].calendar = Globalize.cultures[ "default" ].calendars.standard;
+
+Globalize.cultures[ "en" ] = Globalize.cultures[ "default" ];
+
+Globalize.cultureSelector = "en";
+
+//
+// private variables
+//
+
+regexHex = /^0x[a-f0-9]+$/i;
+regexInfinity = /^[+-]?infinity$/i;
+regexParseFloat = /^[+-]?\d*\.?\d*(e[+-]?\d+)?$/;
+regexTrim = /^\s+|\s+$/g;
+
+//
+// private JavaScript utility functions
+//
+
+arrayIndexOf = function( array, item ) {
+	if ( array.indexOf ) {
+		return array.indexOf( item );
+	}
+	for ( var i = 0, length = array.length; i < length; i++ ) {
+		if ( array[i] === item ) {
+			return i;
+		}
+	}
+	return -1;
+};
+
+endsWith = function( value, pattern ) {
+	return value.substr( value.length - pattern.length ) === pattern;
+};
+
+extend = function( deep ) {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !isFunction(target) ) {
+		target = {};
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( isObject(copy) || (copyIsArray = isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && isArray(src) ? src : [];
+
+					} else {
+						clone = src && isObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+isArray = Array.isArray || function( obj ) {
+	return Object.prototype.toString.call( obj ) === "[object Array]";
+};
+
+isFunction = function( obj ) {
+	return Object.prototype.toString.call( obj ) === "[object Function]";
+};
+
+isObject = function( obj ) {
+	return Object.prototype.toString.call( obj ) === "[object Object]";
+};
+
+startsWith = function( value, pattern ) {
+	return value.indexOf( pattern ) === 0;
+};
+
+trim = function( value ) {
+	return ( value + "" ).replace( regexTrim, "" );
+};
+
+truncate = function( value ) {
+	if ( isNaN( value ) ) {
+		return NaN;
+	}
+	return Math[ value < 0 ? "ceil" : "floor" ]( value );
+};
+
+zeroPad = function( str, count, left ) {
+	var l;
+	for ( l = str.length; l < count; l += 1 ) {
+		str = ( left ? ("0" + str) : (str + "0") );
+	}
+	return str;
+};
+
+//
+// private Globalization utility functions
+//
+
+appendPreOrPostMatch = function( preMatch, strings ) {
+	// appends pre- and post- token match strings while removing escaped characters.
+	// Returns a single quote count which is used to determine if the token occurs
+	// in a string literal.
+	var quoteCount = 0,
+		escaped = false;
+	for ( var i = 0, il = preMatch.length; i < il; i++ ) {
+		var c = preMatch.charAt( i );
+		switch ( c ) {
+			case "\'":
+				if ( escaped ) {
+					strings.push( "\'" );
+				}
+				else {
+					quoteCount++;
+				}
+				escaped = false;
+				break;
+			case "\\":
+				if ( escaped ) {
+					strings.push( "\\" );
+				}
+				escaped = !escaped;
+				break;
+			default:
+				strings.push( c );
+				escaped = false;
+				break;
+		}
+	}
+	return quoteCount;
+};
+
+expandFormat = function( cal, format ) {
+	// expands unspecified or single character date formats into the full pattern.
+	format = format || "F";
+	var pattern,
+		patterns = cal.patterns,
+		len = format.length;
+	if ( len === 1 ) {
+		pattern = patterns[ format ];
+		if ( !pattern ) {
+			throw "Invalid date format string \'" + format + "\'.";
+		}
+		format = pattern;
+	}
+	else if ( len === 2 && format.charAt(0) === "%" ) {
+		// %X escape format -- intended as a custom format string that is only one character, not a built-in format.
+		format = format.charAt( 1 );
+	}
+	return format;
+};
+
+formatDate = function( value, format, culture ) {
+	var cal = culture.calendar,
+		convert = cal.convert;
+
+	if ( !format || !format.length || format === "i" ) {
+		var ret;
+		if ( culture && culture.name.length ) {
+			if ( convert ) {
+				// non-gregorian calendar, so we cannot use built-in toLocaleString()
+				ret = formatDate( value, cal.patterns.F, culture );
+			}
+			else {
+				var eraDate = new Date( value.getTime() ),
+					era = getEra( value, cal.eras );
+				eraDate.setFullYear( getEraYear(value, cal, era) );
+				ret = eraDate.toLocaleString();
+			}
+		}
+		else {
+			ret = value.toString();
+		}
+		return ret;
+	}
+
+	var eras = cal.eras,
+		sortable = format === "s";
+	format = expandFormat( cal, format );
+
+	// Start with an empty string
+	ret = [];
+	var hour,
+		zeros = [ "0", "00", "000" ],
+		foundDay,
+		checkedDay,
+		dayPartRegExp = /([^d]|^)(d|dd)([^d]|$)/g,
+		quoteCount = 0,
+		tokenRegExp = getTokenRegExp(),
+		converted;
+
+	function padZeros( num, c ) {
+		var r, s = num + "";
+		if ( c > 1 && s.length < c ) {
+			r = ( zeros[c - 2] + s);
+			return r.substr( r.length - c, c );
+		}
+		else {
+			r = s;
+		}
+		return r;
+	}
+
+	function hasDay() {
+		if ( foundDay || checkedDay ) {
+			return foundDay;
+		}
+		foundDay = dayPartRegExp.test( format );
+		checkedDay = true;
+		return foundDay;
+	}
+
+	function getPart( date, part ) {
+		if ( converted ) {
+			return converted[ part ];
+		}
+		switch ( part ) {
+			case 0: return date.getFullYear();
+			case 1: return date.getMonth();
+			case 2: return date.getDate();
+		}
+	}
+
+	if ( !sortable && convert ) {
+		converted = convert.fromGregorian( value );
+	}
+
+	for ( ; ; ) {
+		// Save the current index
+		var index = tokenRegExp.lastIndex,
+			// Look for the next pattern
+			ar = tokenRegExp.exec( format );
+
+		// Append the text before the pattern (or the end of the string if not found)
+		var preMatch = format.slice( index, ar ? ar.index : format.length );
+		quoteCount += appendPreOrPostMatch( preMatch, ret );
+
+		if ( !ar ) {
+			break;
+		}
+
+		// do not replace any matches that occur inside a string literal.
+		if ( quoteCount % 2 ) {
+			ret.push( ar[0] );
+			continue;
+		}
+
+		var current = ar[ 0 ],
+			clength = current.length;
+
+		switch ( current ) {
+			case "ddd":
+				//Day of the week, as a three-letter abbreviation
+			case "dddd":
+				// Day of the week, using the full name
+				var names = ( clength === 3 ) ? cal.days.namesAbbr : cal.days.names;
+				ret.push( names[value.getDay()] );
+				break;
+			case "d":
+				// Day of month, without leading zero for single-digit days
+			case "dd":
+				// Day of month, with leading zero for single-digit days
+				foundDay = true;
+				ret.push(
+					padZeros( getPart(value, 2), clength )
+				);
+				break;
+			case "MMM":
+				// Month, as a three-letter abbreviation
+			case "MMMM":
+				// Month, using the full name
+				var part = getPart( value, 1 );
+				ret.push(
+					( cal.monthsGenitive && hasDay() )
+					?
+					cal.monthsGenitive[ clength === 3 ? "namesAbbr" : "names" ][ part ]
+					:
+					cal.months[ clength === 3 ? "namesAbbr" : "names" ][ part ]
+				);
+				break;
+			case "M":
+				// Month, as digits, with no leading zero for single-digit months
+			case "MM":
+				// Month, as digits, with leading zero for single-digit months
+				ret.push(
+					padZeros( getPart(value, 1) + 1, clength )
+				);
+				break;
+			case "y":
+				// Year, as two digits, but with no leading zero for years less than 10
+			case "yy":
+				// Year, as two digits, with leading zero for years less than 10
+			case "yyyy":
+				// Year represented by four full digits
+				part = converted ? converted[ 0 ] : getEraYear( value, cal, getEra(value, eras), sortable );
+				if ( clength < 4 ) {
+					part = part % 100;
+				}
+				ret.push(
+					padZeros( part, clength )
+				);
+				break;
+			case "h":
+				// Hours with no leading zero for single-digit hours, using 12-hour clock
+			case "hh":
+				// Hours with leading zero for single-digit hours, using 12-hour clock
+				hour = value.getHours() % 12;
+				if ( hour === 0 ) hour = 12;
+				ret.push(
+					padZeros( hour, clength )
+				);
+				break;
+			case "H":
+				// Hours with no leading zero for single-digit hours, using 24-hour clock
+			case "HH":
+				// Hours with leading zero for single-digit hours, using 24-hour clock
+				ret.push(
+					padZeros( value.getHours(), clength )
+				);
+				break;
+			case "m":
+				// Minutes with no leading zero for single-digit minutes
+			case "mm":
+				// Minutes with leading zero for single-digit minutes
+				ret.push(
+					padZeros( value.getMinutes(), clength )
+				);
+				break;
+			case "s":
+				// Seconds with no leading zero for single-digit seconds
+			case "ss":
+				// Seconds with leading zero for single-digit seconds
+				ret.push(
+					padZeros( value.getSeconds(), clength )
+				);
+				break;
+			case "t":
+				// One character am/pm indicator ("a" or "p")
+			case "tt":
+				// Multicharacter am/pm indicator
+				part = value.getHours() < 12 ? ( cal.AM ? cal.AM[0] : " " ) : ( cal.PM ? cal.PM[0] : " " );
+				ret.push( clength === 1 ? part.charAt(0) : part );
+				break;
+			case "f":
+				// Deciseconds
+			case "ff":
+				// Centiseconds
+			case "fff":
+				// Milliseconds
+				ret.push(
+					padZeros( value.getMilliseconds(), 3 ).substr( 0, clength )
+				);
+				break;
+			case "z":
+				// Time zone offset, no leading zero
+			case "zz":
+				// Time zone offset with leading zero
+				hour = value.getTimezoneOffset() / 60;
+				ret.push(
+					( hour <= 0 ? "+" : "-" ) + padZeros( Math.floor(Math.abs(hour)), clength )
+				);
+				break;
+			case "zzz":
+				// Time zone offset with leading zero
+				hour = value.getTimezoneOffset() / 60;
+				ret.push(
+					( hour <= 0 ? "+" : "-" ) + padZeros( Math.floor(Math.abs(hour)), 2 )
+					// Hard coded ":" separator, rather than using cal.TimeSeparator
+					// Repeated here for consistency, plus ":" was already assumed in date parsing.
+					+ ":" + padZeros( Math.abs(value.getTimezoneOffset() % 60), 2 )
+				);
+				break;
+			case "g":
+			case "gg":
+				if ( cal.eras ) {
+					ret.push(
+						cal.eras[ getEra(value, eras) ].name
+					);
+				}
+				break;
+		case "/":
+			ret.push( cal["/"] );
+			break;
+		default:
+			throw "Invalid date format pattern \'" + current + "\'.";
+			break;
+		}
+	}
+	return ret.join( "" );
+};
+
+// formatNumber
+(function() {
+	var expandNumber;
+
+	expandNumber = function( number, precision, formatInfo ) {
+		var groupSizes = formatInfo.groupSizes,
+			curSize = groupSizes[ 0 ],
+			curGroupIndex = 1,
+			factor = Math.pow( 10, precision ),
+			rounded = Math.round( number * factor ) / factor;
+
+		if ( !isFinite(rounded) ) {
+			rounded = number;
+		}
+		number = rounded;
+
+		var numberString = number+"",
+			right = "",
+			split = numberString.split( /e/i ),
+			exponent = split.length > 1 ? parseInt( split[1], 10 ) : 0;
+		numberString = split[ 0 ];
+		split = numberString.split( "." );
+		numberString = split[ 0 ];
+		right = split.length > 1 ? split[ 1 ] : "";
+
+		var l;
+		if ( exponent > 0 ) {
+			right = zeroPad( right, exponent, false );
+			numberString += right.slice( 0, exponent );
+			right = right.substr( exponent );
+		}
+		else if ( exponent < 0 ) {
+			exponent = -exponent;
+			numberString = zeroPad( numberString, exponent + 1 );
+			right = numberString.slice( -exponent, numberString.length ) + right;
+			numberString = numberString.slice( 0, -exponent );
+		}
+
+		if ( precision > 0 ) {
+			right = formatInfo[ "." ] +
+				( (right.length > precision) ? right.slice(0, precision) : zeroPad(right, precision) );
+		}
+		else {
+			right = "";
+		}
+
+		var stringIndex = numberString.length - 1,
+			sep = formatInfo[ "," ],
+			ret = "";
+
+		while ( stringIndex >= 0 ) {
+			if ( curSize === 0 || curSize > stringIndex ) {
+				return numberString.slice( 0, stringIndex + 1 ) + ( ret.length ? (sep + ret + right) : right );
+			}
+			ret = numberString.slice( stringIndex - curSize + 1, stringIndex + 1 ) + ( ret.length ? (sep + ret) : "" );
+
+			stringIndex -= curSize;
+
+			if ( curGroupIndex < groupSizes.length ) {
+				curSize = groupSizes[ curGroupIndex ];
+				curGroupIndex++;
+			}
+		}
+
+		return numberString.slice( 0, stringIndex + 1 ) + sep + ret + right;
+	};
+
+	formatNumber = function( value, format, culture ) {
+		if ( !isFinite(value) ) {
+			if ( value === Infinity ) {
+				return culture.numberFormat.positiveInfinity;
+			}
+			if ( value === -Infinity ) {
+				return culture.numberFormat.negativeInfinity;
+			}
+			return culture.numberFormat.NaN;
+		}
+		if ( !format || format === "i" ) {
+			return culture.name.length ? value.toLocaleString() : value.toString();
+		}
+		format = format || "D";
+
+		var nf = culture.numberFormat,
+			number = Math.abs( value ),
+			precision = -1,
+			pattern;
+		if ( format.length > 1 ) precision = parseInt( format.slice(1), 10 );
+
+		var current = format.charAt( 0 ).toUpperCase(),
+			formatInfo;
+
+		switch ( current ) {
+			case "D":
+				pattern = "n";
+				number = truncate( number );
+				if ( precision !== -1 ) {
+					number = zeroPad( "" + number, precision, true );
+				}
+				if ( value < 0 ) number = "-" + number;
+				break;
+			case "N":
+				formatInfo = nf;
+				// fall through
+			case "C":
+				formatInfo = formatInfo || nf.currency;
+				// fall through
+			case "P":
+				formatInfo = formatInfo || nf.percent;
+				pattern = value < 0 ? formatInfo.pattern[ 0 ] : ( formatInfo.pattern[1] || "n" );
+				if ( precision === -1 ) precision = formatInfo.decimals;
+				number = expandNumber( number * (current === "P" ? 100 : 1), precision, formatInfo );
+				break;
+			default:
+				throw "Bad number format specifier: " + current;
+		}
+
+		var patternParts = /n|\$|-|%/g,
+			ret = "";
+		for ( ; ; ) {
+			var index = patternParts.lastIndex,
+				ar = patternParts.exec( pattern );
+
+			ret += pattern.slice( index, ar ? ar.index : pattern.length );
+
+			if ( !ar ) {
+				break;
+			}
+
+			switch ( ar[0] ) {
+				case "n":
+					ret += number;
+					break;
+				case "$":
+					ret += nf.currency.symbol;
+					break;
+				case "-":
+					// don't make 0 negative
+					if ( /[1-9]/.test(number) ) {
+						ret += nf[ "-" ];
+					}
+					break;
+				case "%":
+					ret += nf.percent.symbol;
+					break;
+			}
+		}
+
+		return ret;
+	};
+
+}());
+
+getTokenRegExp = function() {
+	// regular expression for matching date and time tokens in format strings.
+	return /\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g;
+};
+
+getEra = function( date, eras ) {
+	if ( !eras ) return 0;
+	var start, ticks = date.getTime();
+	for ( var i = 0, l = eras.length; i < l; i++ ) {
+		start = eras[ i ].start;
+		if ( start === null || ticks >= start ) {
+			return i;
+		}
+	}
+	return 0;
+};
+
+getEraYear = function( date, cal, era, sortable ) {
+	var year = date.getFullYear();
+	if ( !sortable && cal.eras ) {
+		// convert normal gregorian year to era-shifted gregorian
+		// year by subtracting the era offset
+		year -= cal.eras[ era ].offset;
+	}
+	return year;
+};
+
+// parseExact
+(function() {
+	var expandYear,
+		getDayIndex,
+		getMonthIndex,
+		getParseRegExp,
+		outOfRange,
+		toUpper,
+		toUpperArray;
+
+	expandYear = function( cal, year ) {
+		// expands 2-digit year into 4 digits.
+		if ( year < 100 ) {
+			var now = new Date(),
+				era = getEra( now ),
+				curr = getEraYear( now, cal, era ),
+				twoDigitYearMax = cal.twoDigitYearMax;
+			twoDigitYearMax = typeof twoDigitYearMax === "string" ? new Date().getFullYear() % 100 + parseInt( twoDigitYearMax, 10 ) : twoDigitYearMax;
+			year += curr - ( curr % 100 );
+			if ( year > twoDigitYearMax ) {
+				year -= 100;
+			}
+		}
+		return year;
+	};
+
+	getDayIndex = function	( cal, value, abbr ) {
+		var ret,
+			days = cal.days,
+			upperDays = cal._upperDays;
+		if ( !upperDays ) {
+			cal._upperDays = upperDays = [
+				toUpperArray( days.names ),
+				toUpperArray( days.namesAbbr ),
+				toUpperArray( days.namesShort )
+			];
+		}
+		value = toUpper( value );
+		if ( abbr ) {
+			ret = arrayIndexOf( upperDays[1], value );
+			if ( ret === -1 ) {
+				ret = arrayIndexOf( upperDays[2], value );
+			}
+		}
+		else {
+			ret = arrayIndexOf( upperDays[0], value );
+		}
+		return ret;
+	};
+
+	getMonthIndex = function( cal, value, abbr ) {
+		var months = cal.months,
+			monthsGen = cal.monthsGenitive || cal.months,
+			upperMonths = cal._upperMonths,
+			upperMonthsGen = cal._upperMonthsGen;
+		if ( !upperMonths ) {
+			cal._upperMonths = upperMonths = [
+				toUpperArray( months.names ),
+				toUpperArray( months.namesAbbr )
+			];
+			cal._upperMonthsGen = upperMonthsGen = [
+				toUpperArray( monthsGen.names ),
+				toUpperArray( monthsGen.namesAbbr )
+			];
+		}
+		value = toUpper( value );
+		var i = arrayIndexOf( abbr ? upperMonths[1] : upperMonths[0], value );
+		if ( i < 0 ) {
+			i = arrayIndexOf( abbr ? upperMonthsGen[1] : upperMonthsGen[0], value );
+		}
+		return i;
+	};
+
+	getParseRegExp = function( cal, format ) {
+		// converts a format string into a regular expression with groups that
+		// can be used to extract date fields from a date string.
+		// check for a cached parse regex.
+		var re = cal._parseRegExp;
+		if ( !re ) {
+			cal._parseRegExp = re = {};
+		}
+		else {
+			var reFormat = re[ format ];
+			if ( reFormat ) {
+				return reFormat;
+			}
+		}
+
+		// expand single digit formats, then escape regular expression characters.
+		var expFormat = expandFormat( cal, format ).replace( /([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g, "\\\\$1" ),
+			regexp = [ "^" ],
+			groups = [],
+			index = 0,
+			quoteCount = 0,
+			tokenRegExp = getTokenRegExp(),
+			match;
+
+		// iterate through each date token found.
+		while ( (match = tokenRegExp.exec(expFormat)) !== null ) {
+			var preMatch = expFormat.slice( index, match.index );
+			index = tokenRegExp.lastIndex;
+
+			// don't replace any matches that occur inside a string literal.
+			quoteCount += appendPreOrPostMatch( preMatch, regexp );
+			if ( quoteCount % 2 ) {
+				regexp.push( match[0] );
+				continue;
+			}
+
+			// add a regex group for the token.
+			var m = match[ 0 ],
+				len = m.length,
+				add;
+			switch ( m ) {
+				case "dddd": case "ddd":
+				case "MMMM": case "MMM":
+				case "gg": case "g":
+					add = "(\\D+)";
+					break;
+				case "tt": case "t":
+					add = "(\\D*)";
+					break;
+				case "yyyy":
+				case "fff":
+				case "ff":
+				case "f":
+					add = "(\\d{" + len + "})";
+					break;
+				case "dd": case "d":
+				case "MM": case "M":
+				case "yy": case "y":
+				case "HH": case "H":
+				case "hh": case "h":
+				case "mm": case "m":
+				case "ss": case "s":
+					add = "(\\d\\d?)";
+					break;
+				case "zzz":
+					add = "([+-]?\\d\\d?:\\d{2})";
+					break;
+				case "zz": case "z":
+					add = "([+-]?\\d\\d?)";
+					break;
+				case "/":
+					add = "(\\" + cal[ "/" ] + ")";
+					break;
+				default:
+					throw "Invalid date format pattern \'" + m + "\'.";
+					break;
+			}
+			if ( add ) {
+				regexp.push( add );
+			}
+			groups.push( match[0] );
+		}
+		appendPreOrPostMatch( expFormat.slice(index), regexp );
+		regexp.push( "$" );
+
+		// allow whitespace to differ when matching formats.
+		var regexpStr = regexp.join( "" ).replace( /\s+/g, "\\s+" ),
+			parseRegExp = { "regExp": regexpStr, "groups": groups };
+
+		// cache the regex for this format.
+		return re[ format ] = parseRegExp;
+	};
+
+	outOfRange = function( value, low, high ) {
+		return value < low || value > high;
+	};
+
+	toUpper = function( value ) {
+		// "he-IL" has non-breaking space in weekday names.
+		return value.split( "\u00A0" ).join( " " ).toUpperCase();
+	};
+
+	toUpperArray = function( arr ) {
+		var results = [];
+		for ( var i = 0, l = arr.length; i < l; i++ ) {
+			results[ i ] = toUpper( arr[i] );
+		}
+		return results;
+	};
+
+	parseExact = function( value, format, culture ) {
+		// try to parse the date string by matching against the format string
+		// while using the specified culture for date field names.
+		value = trim( value );
+		var cal = culture.calendar,
+			// convert date formats into regular expressions with groupings.
+			// use the regexp to determine the input format and extract the date fields.
+			parseInfo = getParseRegExp( cal, format ),
+			match = new RegExp( parseInfo.regExp ).exec( value );
+		if ( match === null ) {
+			return null;
+		}
+		// found a date format that matches the input.
+		var groups = parseInfo.groups,
+			era = null, year = null, month = null, date = null, weekDay = null,
+			hour = 0, hourOffset, min = 0, sec = 0, msec = 0, tzMinOffset = null,
+			pmHour = false;
+		// iterate the format groups to extract and set the date fields.
+		for ( var j = 0, jl = groups.length; j < jl; j++ ) {
+			var matchGroup = match[ j + 1 ];
+			if ( matchGroup ) {
+				var current = groups[ j ],
+					clength = current.length,
+					matchInt = parseInt( matchGroup, 10 );
+				switch ( current ) {
+					case "dd": case "d":
+						// Day of month.
+						date = matchInt;
+						// check that date is generally in valid range, also checking overflow below.
+						if ( outOfRange(date, 1, 31) ) return null;
+						break;
+					case "MMM": case "MMMM":
+						month = getMonthIndex( cal, matchGroup, clength === 3 );
+						if ( outOfRange(month, 0, 11) ) return null;
+						break;
+					case "M": case "MM":
+						// Month.
+						month = matchInt - 1;
+						if ( outOfRange(month, 0, 11) ) return null;
+						break;
+					case "y": case "yy":
+					case "yyyy":
+						year = clength < 4 ? expandYear( cal, matchInt ) : matchInt;
+						if ( outOfRange(year, 0, 9999) ) return null;
+						break;
+					case "h": case "hh":
+						// Hours (12-hour clock).
+						hour = matchInt;
+						if ( hour === 12 ) hour = 0;
+						if ( outOfRange(hour, 0, 11) ) return null;
+						break;
+					case "H": case "HH":
+						// Hours (24-hour clock).
+						hour = matchInt;
+						if ( outOfRange(hour, 0, 23) ) return null;
+						break;
+					case "m": case "mm":
+						// Minutes.
+						min = matchInt;
+						if ( outOfRange(min, 0, 59) ) return null;
+						break;
+					case "s": case "ss":
+						// Seconds.
+						sec = matchInt;
+						if ( outOfRange(sec, 0, 59) ) return null;
+						break;
+					case "tt": case "t":
+						// AM/PM designator.
+						// see if it is standard, upper, or lower case PM. If not, ensure it is at least one of
+						// the AM tokens. If not, fail the parse for this format.
+						pmHour = cal.PM && ( matchGroup === cal.PM[0] || matchGroup === cal.PM[1] || matchGroup === cal.PM[2] );
+						if (
+							!pmHour && (
+								!cal.AM || ( matchGroup !== cal.AM[0] && matchGroup !== cal.AM[1] && matchGroup !== cal.AM[2] )
+							)
+						) return null;
+						break;
+					case "f":
+						// Deciseconds.
+					case "ff":
+						// Centiseconds.
+					case "fff":
+						// Milliseconds.
+						msec = matchInt * Math.pow( 10, 3 - clength );
+						if ( outOfRange(msec, 0, 999) ) return null;
+						break;
+					case "ddd":
+						// Day of week.
+					case "dddd":
+						// Day of week.
+						weekDay = getDayIndex( cal, matchGroup, clength === 3 );
+						if ( outOfRange(weekDay, 0, 6) ) return null;
+						break;
+					case "zzz":
+						// Time zone offset in +/- hours:min.
+						var offsets = matchGroup.split( /:/ );
+						if ( offsets.length !== 2 ) return null;
+						hourOffset = parseInt( offsets[0], 10 );
+						if ( outOfRange(hourOffset, -12, 13) ) return null;
+						var minOffset = parseInt( offsets[1], 10 );
+						if ( outOfRange(minOffset, 0, 59) ) return null;
+						tzMinOffset = ( hourOffset * 60 ) + ( startsWith(matchGroup, "-") ? -minOffset : minOffset );
+						break;
+					case "z": case "zz":
+						// Time zone offset in +/- hours.
+						hourOffset = matchInt;
+						if ( outOfRange(hourOffset, -12, 13) ) return null;
+						tzMinOffset = hourOffset * 60;
+						break;
+					case "g": case "gg":
+						var eraName = matchGroup;
+						if ( !eraName || !cal.eras ) return null;
+						eraName = trim( eraName.toLowerCase() );
+						for ( var i = 0, l = cal.eras.length; i < l; i++ ) {
+							if ( eraName === cal.eras[i].name.toLowerCase() ) {
+								era = i;
+								break;
+							}
+						}
+						// could not find an era with that name
+						if ( era === null ) return null;
+						break;
+				}
+			}
+		}
+		var result = new Date(), defaultYear, convert = cal.convert;
+		defaultYear = convert ? convert.fromGregorian( result )[ 0 ] : result.getFullYear();
+		if ( year === null ) {
+			year = defaultYear;
+		}
+		else if ( cal.eras ) {
+			// year must be shifted to normal gregorian year
+			// but not if year was not specified, its already normal gregorian
+			// per the main if clause above.
+			year += cal.eras[( era || 0 )].offset;
+		}
+		// set default day and month to 1 and January, so if unspecified, these are the defaults
+		// instead of the current day/month.
+		if ( month === null ) {
+			month = 0;
+		}
+		if ( date === null ) {
+			date = 1;
+		}
+		// now have year, month, and date, but in the culture's calendar.
+		// convert to gregorian if necessary
+		if ( convert ) {
+			result = convert.toGregorian( year, month, date );
+			// conversion failed, must be an invalid match
+			if ( result === null ) return null;
+		}
+		else {
+			// have to set year, month and date together to avoid overflow based on current date.
+			result.setFullYear( year, month, date );
+			// check to see if date overflowed for specified month (only checked 1-31 above).
+			if ( result.getDate() !== date ) return null;
+			// invalid day of week.
+			if ( weekDay !== null && result.getDay() !== weekDay ) {
+				return null;
+			}
+		}
+		// if pm designator token was found make sure the hours fit the 24-hour clock.
+		if ( pmHour && hour < 12 ) {
+			hour += 12;
+		}
+		result.setHours( hour, min, sec, msec );
+		if ( tzMinOffset !== null ) {
+			// adjust timezone to utc before applying local offset.
+			var adjustedMin = result.getMinutes() - ( tzMinOffset + result.getTimezoneOffset() );
+			// Safari limits hours and minutes to the range of -127 to 127.	 We need to use setHours
+			// to ensure both these fields will not exceed this range.	adjustedMin will range
+			// somewhere between -1440 and 1500, so we only need to split this into hours.
+			result.setHours( result.getHours() + parseInt(adjustedMin / 60, 10), adjustedMin % 60 );
+		}
+		return result;
+	};
+}());
+
+parseNegativePattern = function( value, nf, negativePattern ) {
+	var neg = nf[ "-" ],
+		pos = nf[ "+" ],
+		ret;
+	switch ( negativePattern ) {
+		case "n -":
+			neg = " " + neg;
+			pos = " " + pos;
+			// fall through
+		case "n-":
+			if ( endsWith(value, neg) ) {
+				ret = [ "-", value.substr(0, value.length - neg.length) ];
+			}
+			else if ( endsWith(value, pos) ) {
+				ret = [ "+", value.substr(0, value.length - pos.length) ];
+			}
+			break;
+		case "- n":
+			neg += " ";
+			pos += " ";
+			// fall through
+		case "-n":
+			if ( startsWith(value, neg) ) {
+				ret = [ "-", value.substr(neg.length) ];
+			}
+			else if ( startsWith(value, pos) ) {
+				ret = [ "+", value.substr(pos.length) ];
+			}
+			break;
+		case "(n)":
+			if ( startsWith(value, "(") && endsWith(value, ")") ) {
+				ret = [ "-", value.substr(1, value.length - 2) ];
+			}
+			break;
+	}
+	return ret || [ "", value ];
+};
+
+//
+// public instance functions
+//
+
+Globalize.prototype.findClosestCulture = function( cultureSelector ) {
+	return Globalize.findClosestCulture.call( this, cultureSelector );
+};
+
+Globalize.prototype.format = function( value, format, cultureSelector ) {
+	return Globalize.format.call( this, value, format, cultureSelector );
+};
+
+Globalize.prototype.localize = function( key, cultureSelector ) {
+	return Globalize.localize.call( this, key, cultureSelector );
+};
+
+Globalize.prototype.parseInt = function( value, radix, cultureSelector ) {
+	return Globalize.parseInt.call( this, value, radix, cultureSelector );
+};
+
+Globalize.prototype.parseFloat = function( value, radix, cultureSelector ) {
+	return Globalize.parseFloat.call( this, value, radix, cultureSelector );
+};
+
+Globalize.prototype.culture = function( cultureSelector ) {
+	return Globalize.culture.call( this, cultureSelector );
+};
+
+//
+// public singleton functions
+//
+
+Globalize.addCultureInfo = function( cultureName, baseCultureName, info ) {
+
+	var base = {},
+		isNew = false;
+
+	if ( typeof cultureName !== "string" ) {
+		// cultureName argument is optional string. If not specified, assume info is first
+		// and only argument. Specified info deep-extends current culture.
+		info = cultureName;
+		cultureName = this.culture().name;
+		base = this.cultures[ cultureName ];
+	} else if ( typeof baseCultureName !== "string" ) {
+		// baseCultureName argument is optional string. If not specified, assume info is second
+		// argument. Specified info deep-extends specified culture.
+		// If specified culture does not exist, create by deep-extending default
+		info = baseCultureName;
+		isNew = ( this.cultures[ cultureName ] == null );
+		base = this.cultures[ cultureName ] || this.cultures[ "default" ];
+	} else {
+		// cultureName and baseCultureName specified. Assume a new culture is being created
+		// by deep-extending an specified base culture
+		isNew = true;
+		base = this.cultures[ baseCultureName ];
+	}
+
+	this.cultures[ cultureName ] = extend(true, {},
+		base,
+		info
+	);
+	// Make the standard calendar the current culture if it's a new culture
+	if ( isNew ) {
+		this.cultures[ cultureName ].calendar = this.cultures[ cultureName ].calendars.standard;
+	}
+};
+
+Globalize.findClosestCulture = function( name ) {
+	var match;
+	if ( !name ) {
+		return this.findClosestCulture( this.cultureSelector ) || this.cultures[ "default" ];
+	}
+	if ( typeof name === "string" ) {
+		name = name.split( "," );
+	}
+	if ( isArray(name) ) {
+		var lang,
+			cultures = this.cultures,
+			list = name,
+			i, l = list.length,
+			prioritized = [];
+		for ( i = 0; i < l; i++ ) {
+			name = trim( list[i] );
+			var pri, parts = name.split( ";" );
+			lang = trim( parts[0] );
+			if ( parts.length === 1 ) {
+				pri = 1;
+			}
+			else {
+				name = trim( parts[1] );
+				if ( name.indexOf("q=") === 0 ) {
+					name = name.substr( 2 );
+					pri = parseFloat( name );
+					pri = isNaN( pri ) ? 0 : pri;
+				}
+				else {
+					pri = 1;
+				}
+			}
+			prioritized.push({ lang: lang, pri: pri });
+		}
+		prioritized.sort(function( a, b ) {
+			return a.pri < b.pri ? 1 : -1;
+		});
+
+		// exact match
+		for ( i = 0; i < l; i++ ) {
+			lang = prioritized[ i ].lang;
+			match = cultures[ lang ];
+			if ( match ) {
+				return match;
+			}
+		}
+
+		// neutral language match
+		for ( i = 0; i < l; i++ ) {
+			lang = prioritized[ i ].lang;
+			do {
+				var index = lang.lastIndexOf( "-" );
+				if ( index === -1 ) {
+					break;
+				}
+				// strip off the last part. e.g. en-US => en
+				lang = lang.substr( 0, index );
+				match = cultures[ lang ];
+				if ( match ) {
+					return match;
+				}
+			}
+			while ( 1 );
+		}
+
+		// last resort: match first culture using that language
+		for ( i = 0; i < l; i++ ) {
+			lang = prioritized[ i ].lang;
+			for ( var cultureKey in cultures ) {
+				var culture = cultures[ cultureKey ];
+				if ( culture.language == lang ) {
+					return culture;
+				}
+			}
+		}
+	}
+	else if ( typeof name === "object" ) {
+		return name;
+	}
+	return match || null;
+};
+
+Globalize.format = function( value, format, cultureSelector ) {
+	culture = this.findClosestCulture( cultureSelector );
+	if ( value instanceof Date ) {
+		value = formatDate( value, format, culture );
+	}
+	else if ( typeof value === "number" ) {
+		value = formatNumber( value, format, culture );
+	}
+	return value;
+};
+
+Globalize.localize = function( key, cultureSelector ) {
+	return this.findClosestCulture( cultureSelector ).messages[ key ] ||
+		this.cultures[ "default" ].messages[ key ];
+};
+
+Globalize.parseDate = function( value, formats, culture ) {
+	culture = this.findClosestCulture( culture );
+
+	var date, prop, patterns;
+	if ( formats ) {
+		if ( typeof formats === "string" ) {
+			formats = [ formats ];
+		}
+		if ( formats.length ) {
+			for ( var i = 0, l = formats.length; i < l; i++ ) {
+				var format = formats[ i ];
+				if ( format ) {
+					date = parseExact( value, format, culture );
+					if ( date ) {
+						break;
+					}
+				}
+			}
+		}
+	} else {
+		patterns = culture.calendar.patterns;
+		for ( prop in patterns ) {
+			date = parseExact( value, patterns[prop], culture );
+			if ( date ) {
+				break;
+			}
+		}
+	}
+
+	return date || null;
+};
+
+Globalize.parseInt = function( value, radix, cultureSelector ) {
+	return truncate( Globalize.parseFloat(value, radix, cultureSelector) );
+};
+
+Globalize.parseFloat = function( value, radix, cultureSelector ) {
+	// radix argument is optional
+	if ( typeof radix !== "number" ) {
+		cultureSelector = radix;
+		radix = 10;
+	}
+
+	var culture = this.findClosestCulture( cultureSelector );
+	var ret = NaN,
+		nf = culture.numberFormat;
+
+	if ( value.indexOf(culture.numberFormat.currency.symbol) > -1 ) {
+		// remove currency symbol
+		value = value.replace( culture.numberFormat.currency.symbol, "" );
+		// replace decimal seperator
+		value = value.replace( culture.numberFormat.currency["."], culture.numberFormat["."] );
+	}
+
+	// trim leading and trailing whitespace
+	value = trim( value );
+
+	// allow infinity or hexidecimal
+	if ( regexInfinity.test(value) ) {
+		ret = parseFloat( value );
+	}
+	else if ( !radix && regexHex.test(value) ) {
+		ret = parseInt( value, 16 );
+	}
+	else {
+
+		// determine sign and number
+		var signInfo = parseNegativePattern( value, nf, nf.pattern[0] ),
+			sign = signInfo[ 0 ],
+			num = signInfo[ 1 ];
+
+		// #44 - try parsing as "(n)"
+		if ( sign === "" && nf.pattern[0] !== "(n)" ) {
+			signInfo = parseNegativePattern( value, nf, "(n)" );
+			sign = signInfo[ 0 ];
+			num = signInfo[ 1 ];
+		}
+
+		// try parsing as "-n"
+		if ( sign === "" && nf.pattern[0] !== "-n" ) {
+			signInfo = parseNegativePattern( value, nf, "-n" );
+			sign = signInfo[ 0 ];
+			num = signInfo[ 1 ];
+		}
+
+		sign = sign || "+";
+
+		// determine exponent and number
+		var exponent,
+			intAndFraction,
+			exponentPos = num.indexOf( "e" );
+		if ( exponentPos < 0 ) exponentPos = num.indexOf( "E" );
+		if ( exponentPos < 0 ) {
+			intAndFraction = num;
+			exponent = null;
+		}
+		else {
+			intAndFraction = num.substr( 0, exponentPos );
+			exponent = num.substr( exponentPos + 1 );
+		}
+		// determine decimal position
+		var integer,
+			fraction,
+			decSep = nf[ "." ],
+			decimalPos = intAndFraction.indexOf( decSep );
+		if ( decimalPos < 0 ) {
+			integer = intAndFraction;
+			fraction = null;
+		}
+		else {
+			integer = intAndFraction.substr( 0, decimalPos );
+			fraction = intAndFraction.substr( decimalPos + decSep.length );
+		}
+		// handle groups (e.g. 1,000,000)
+		var groupSep = nf[ "," ];
+		integer = integer.split( groupSep ).join( "" );
+		var altGroupSep = groupSep.replace( /\u00A0/g, " " );
+		if ( groupSep !== altGroupSep ) {
+			integer = integer.split( altGroupSep ).join( "" );
+		}
+		// build a natively parsable number string
+		var p = sign + integer;
+		if ( fraction !== null ) {
+			p += "." + fraction;
+		}
+		if ( exponent !== null ) {
+			// exponent itself may have a number patternd
+			var expSignInfo = parseNegativePattern( exponent, nf, "-n" );
+			p += "e" + ( expSignInfo[0] || "+" ) + expSignInfo[ 1 ];
+		}
+		if ( regexParseFloat.test(p) ) {
+			ret = parseFloat( p );
+		}
+	}
+	return ret;
+};
+
+Globalize.culture = function( cultureSelector ) {
+	// setter
+	if ( typeof cultureSelector !== "undefined" ) {
+		this.cultureSelector = cultureSelector;
+	}
+	// getter
+	return this.findClosestCulture( cultureSelector ) || this.culture[ "default" ];
+};
+
+}( this ));
+/**
+ * loader.js : Loader for web-ui-fw
+ * Refactored from bootstrap.js
+ *
+ * By Youmin Ha <youmin.ha@samsung.com>
+ *
+ */
+
+( function ($, Globalize, window, undefined) {
+
+	window.S = {
+		libFileName : "tizen-web-ui-fw(.min)?.js",
+
+		frameworkData : {
+			rootDir: '/usr/lib/tizen-web-ui-fw',
+			version: '0.1',
+			theme: "default",
+			viewportScale: false,
+		},
+
+		util : {
+			loadScriptSync : function ( scriptPath, successCB, errorCB ) {
+				$.ajax( {
+					url: scriptPath,
+					dataType: 'script',
+					async: false,
+					success: successCB,
+					error: function ( jqXHR, textStatus, errorThrown ) {
+						if ( errorCB ) {
+							errorCB( jqXHR, textStatus, errorThrown );
+						} else {
+							var ignoreStatusList = [ 404 ];  // 404: not found
+							if ( -1 == $.inArray( jqXHR.status, ignoreStatusList ) ) {
+								window.alert( 'Error while loading ' + scriptPath + '\n' + jqXHR.status + ':' + jqXHR.statusText );
+							} else {
+								console.log( 'Error while loading ' + scriptPath + '\n' + jqXHR.status + ':' + jqXHR.statusText );
+							}
+						}
+					}
+				} );
+			},
+			getScaleFactor: function ( ) {
+				var factor = window.scale,
+					width = 0,
+					defaultWidth = 720;
+
+				if ( !factor ) {
+					width = screen.width < screen.height ? screen.width : screen.height;
+					factor = width / defaultWidth;
+					if ( factor > 1 ) {
+						// NOTE: some targets(e.g iPad) need to set scale equal or less than 1.0
+						factor = 1;
+					}
+				}
+				console.log( "ScaleFactor: " + factor );
+				return factor;
+			},
+			isMobileBrowser: function ( ) {
+				var mobileIdx = window.navigator.appVersion.indexOf("Mobile"),
+					isMobile = -1 < mobileIdx;
+				return isMobile;
+			}
+		},
+
+		css : {
+			cacheBust: ( document.location.href.match( /debug=true/ ) ) ?
+					'?cacheBust=' + ( new Date( ) ).getTime( ) :
+					'',
+			addElementToHead : function ( elem ) {
+				var head = document.getElementsByTagName( 'head' )[0];
+				head.appendChild( elem );
+			},
+			load: function ( path ) {
+				this.addElementToHead( this.makeLink( path + this.cacheBust ) );
+			},
+			makeLink : function ( href ) {
+				var customstylesheetLink = document.createElement( 'link' );
+				customstylesheetLink.setAttribute( 'rel', 'stylesheet' );
+				customstylesheetLink.setAttribute( 'href', href );
+				return customstylesheetLink;
+			}
+		},
+
+		getParams: function ( ) {
+			/* Get data-* params from <script> tag, and set S.frameworkData.* values
+			 * Returns true if proper <script> tag is found, or false if not.
+			 */
+			// Find current <script> tag element
+			var scriptElems = document.getElementsByTagName( 'script' ),
+				val = null,
+				foundScriptTag = false,
+				idx,
+				elem,
+				src,
+				tokens,
+				version_idx;
+			for ( idx in scriptElems ) {
+				elem = scriptElems[idx];
+				src = elem.src ? elem.getAttribute( 'src' ) : undefined;
+				if (src && src.match( this.libFileName )) {
+					// Set framework data, only when they are given.
+					tokens = src.split(/[\/\\]/);
+					version_idx = -3;
+					this.frameworkData.rootDir = elem.getAttribute( 'data-framework-root' )
+						|| tokens.slice( 0, tokens.length + version_idx ).join( '/' )
+						|| this.frameworkData.rootDir;
+					this.frameworkData.version = elem.getAttribute( 'data-framework-version' )
+						|| tokens[ tokens.length + version_idx ]
+						|| this.frameworkData.version;
+					this.frameworkData.theme = elem.getAttribute( 'data-framework-theme' )
+						|| this.frameworkData.theme;
+					this.frameworkData.viewportScale = "true" === elem.getAttribute( 'data-framework-viewport-scale' ) ? true : this.frameworkData.viewportScale;
+					foundScriptTag = true;
+					break;
+				}
+			}
+			return foundScriptTag;
+		},
+
+		loadTheme: function ( ) {
+			var themePath = [
+					this.frameworkData.rootDir,
+					this.frameworkData.version,
+					'themes',
+					this.frameworkData.theme
+				].join( '/' ),
+				cssPath = [themePath, 'tizen-web-ui-fw-theme.css'].join( '/' ),
+				jsPath = [themePath, 'theme.js'].join( '/' );
+
+			this.css.load( cssPath );
+			this.util.loadScriptSync( jsPath );
+		},
+
+		/** Load Globalize culture file, and set default culture.
+		 *  @param[in]  language  Language code. ex) en-US, en, ko-KR, ko
+		 *                        If language is not given, read language from html 'lang' attribute, or from system setting.
+		 */
+		loadGlobalizeCulture: function ( language ) {
+			function getGlobalizeCultureFile( lang ) {
+				return ['globalize.culture.', lang, '.js'].join( '' );
+			}
+			function getGlobalizeCulturePath( self, file ) {
+				return [
+					self.frameworkData.rootDir,
+					self.frameworkData.version,
+					'js',
+					'cultures',
+					file,
+				].join( '/' );
+			}
+
+			// Get lang, and change country code to uppercase chars.
+			var self = this,
+				lang = language
+					|| $( 'html' ).attr( 'lang' )
+					|| window.navigator.language.split( '.' )[0]	/* Webkit, Safari + workaround for Tizen */
+					|| window.navigator.userLanguage	/* IE */
+					|| 'en',
+				countryCode = null,
+				countryCodeIdx = lang.lastIndexOf('-'),
+				ignoreCodes = ['Cyrl', 'Latn', 'Mong'],	// Not country code!
+				globalizeCultureFile,
+				globalizeCulturePath,
+				neutralLangIndex;
+
+			if ( countryCodeIdx != -1 ) {	// Found country code!
+				countryCode = lang.substr( countryCodeIdx + 1 );
+				if ( ignoreCodes.join( '-' ).indexOf( countryCode ) < 0 ) { // countryCode is not found from ignoreCodes
+					// Make countryCode to uppercase
+					lang = [ lang.substr( 0, countryCodeIdx ), countryCode.toUpperCase( ) ].join( '-' );
+				}
+			}
+
+			globalizeCultureFile = getGlobalizeCultureFile( lang );
+			globalizeCulturePath = getGlobalizeCulturePath( self, globalizeCultureFile );
+			neutralLangIndex = lang.lastIndexOf( '-' );
+
+			// Run culture script
+			console.log( 'Run globalize culture: ' + globalizeCulturePath );
+			this.util.loadScriptSync(
+				globalizeCulturePath,
+				null,
+				function ( jqXHR, textStatus, errorThrown ) {	// Failed to load!
+					if ( jqXHR.status == 404 ) {
+						// If culture file is not found, run neutral language culture. 
+						// (e.g. en-US --> en)
+						if ( neutralLangIndex != -1 ) {
+							var neutralLang = lang.substr( 0, neutralLangIndex ),
+								neutralCultureFile = getGlobalizeCultureFile( neutralLang ),
+								neutralCulturePath = getGlobalizeCulturePath( self, neutralCultureFile );
+							console.log( 'Run globalize culture of neutral lang: ' + neutralCulturePath );
+							self.util.loadScriptSync( neutralCulturePath );
+						}
+					} else {
+						window.alert( 'Error while loading ' + globalizeCulturePath + '\n' + jqXHR.status + ':' + jqXHR.statusText );
+					}
+				}
+			);
+			return lang;
+		},
+		setGlobalize: function ( ) {
+			var lang = this.loadGlobalizeCulture( );
+
+			// Set culture
+			// NOTE: It is not needed to set with neutral lang. 
+			//       Globalize automatically deals with it.
+			Globalize.culture( lang );
+		},
+
+		/** Set viewport meta tag for mobile devices.
+		 *
+		 * @param[in]	viewportWidth	Viewport width. 'device-dpi' is also allowed.
+		 * @param[in]	useAutoScale	If true, calculate & use scale factor. otherwise, scale factor is 1.
+		 * @param[in]	useDeviceDpi	If true, add 'target-densityDpi=device-dpi' to viewport meta content.
+		 */
+		setViewport: function ( viewportWidth, useAutoScale, useDeviceDpi ) {
+			var meta,
+				scale = 1,
+				head;
+			// Do nothing if viewport setting code is already in the code.
+			$( "meta" ).each( function ( ) {
+				if ( $( this ).attr( "name" ) === "viewport" ) {
+					console.log( "User set viewport... framework viewport will not be applied." );
+					meta = this;
+					return;
+				}
+			});
+
+			// Set meta tag
+			meta = document.createElement( "meta" );
+			if ( meta ) {
+				scale = useAutoScale ? this.util.getScaleFactor( ) : scale;
+				meta.name = "viewport";
+				meta.content = "width=" + viewportWidth + ", initial-scale=" + scale + ", maximum-scale=" + scale + ", user-scalable=0";
+				if ( useDeviceDpi ) {
+					meta.content += ", target-densityDpi=device-dpi";
+				}
+				console.log( meta.content );
+				head = document.getElementsByTagName( 'head' ).item( 0 );
+				head.insertBefore( meta, head.firstChild );
+			}
+		},
+
+		/**	Read body's font-size, scale it, and reset it.
+		 *  param[in]	desired font-size / base font-size.
+		 */
+		scaleBaseFontSize: function ( themeDefaultFontSize, ratio ) {
+			var scaledFontSize = Math.round( themeDefaultFontSize * ratio );
+			$( '.ui-mobile' ).css( { 'font-size': scaledFontSize + "px" } );
+			$( '.ui-mobile').children( 'body' ).css( { 'font-size': scaledFontSize + "px" } );
+		},
+
+		setScaling: function ( ) {
+			var baseWidth = 720,		// NOTE: need to be changed to get the value from theme.
+				standardWidth = 360,
+				themeDefaultFontSize = parseInt( $( 'body' ).css( 'font-size' ), 10 );
+			$( 'body' ).attr( 'data-tizen-theme-default-font-size', themeDefaultFontSize );
+
+			if ( this.frameworkData.viewportScale ) {
+				// Use viewport scaling with base font-size
+				// NOTE: No font-size setting is needed.
+				this.setViewport( baseWidth, true, true );
+			} else {
+				// Fixed viewport scale(=1.0) with scaled font size
+				this.setViewport( "device-dpi", false, undefined );
+				this.scaleBaseFontSize( themeDefaultFontSize, parseFloat( standardWidth / baseWidth ) );
+			}
+		}
+	};
+} ( jQuery, window.Globalize, window ) );
+
+
+// Loader's job list
+( function ( S, $, undefined ) {
+	S.getParams( );
+	S.loadTheme( );
+	S.setGlobalize( );
+
+	// Turn off JQM's auto initialization option.
+	// NOTE: This job must be done before domready.
+	$.mobile.autoInitializePage = false;
+
+	$(document).ready( function ( ) {
+		S.setScaling( );
+		$.mobile.initializePage( );
+	});
+} ( window.S, jQuery ) );
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Edit Field_clear.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Edit Field_clear.png
new file mode 100644
index 0000000..ac2d45a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Edit Field_clear.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_receive.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_receive.png
new file mode 100644
index 0000000..487636f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_receive.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_send.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_send.png
new file mode 100644
index 0000000..bc30b93
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_MessageBubble_BG_send.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_multimedia.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_multimedia.png
new file mode 100644
index 0000000..a59046f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_multimedia.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_picture.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_picture.png
new file mode 100644
index 0000000..8123ba6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_picture.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_text.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_text.png
new file mode 100644
index 0000000..0272309
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_text.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_unnamed.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_unnamed.png
new file mode 100644
index 0000000..2114d24
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Nocontents_unnamed.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt.png
new file mode 100644
index 0000000..35ccb75
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_dim.png
new file mode 100644
index 0000000..bd3a9b6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_press.png
new file mode 100644
index 0000000..f7d2779
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Option_header_bt_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn.png
new file mode 100644
index 0000000..38b318f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_h.png
new file mode 100644
index 0000000..37f2240
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press.png
new file mode 100644
index 0000000..bc40970
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press_h.png
new file mode 100644
index 0000000..23d4584
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Title_btn_press_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Video_play.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Video_play.png
new file mode 100644
index 0000000..01c534d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Video_play.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Volumepopup_title_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Volumepopup_title_bg.png
new file mode 100644
index 0000000..9b708b4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_Volumepopup_title_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_normal.png
new file mode 100644
index 0000000..4caee0b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_01.png
new file mode 100644
index 0000000..4cad8da
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_02.png
new file mode 100644
index 0000000..36d4290
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_03.png
new file mode 100644
index 0000000..2dba733
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_alarm_repeat_button_press_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand _press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand _press.png
new file mode 100644
index 0000000..399ab64
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand _press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand.png
new file mode 100644
index 0000000..399ab64
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expand.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expanddim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expanddim.png
new file mode 100644
index 0000000..bf96241
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_arrow_expanddim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_normal.png
new file mode 100644
index 0000000..23b80f0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_press.png
new file mode 100644
index 0000000..9408a25
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_btn_circle_bg_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_dim.png
new file mode 100644
index 0000000..9ca5a44
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal.png
new file mode 100644
index 0000000..9290a24
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal_press.png
new file mode 100644
index 0000000..f429735
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_01_normal_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_dim.png
new file mode 100644
index 0000000..df381ba
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_normal.png
new file mode 100644
index 0000000..1709d98
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_press.png
new file mode 100644
index 0000000..f429735
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_04_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_dim.png
new file mode 100644
index 0000000..4ed088e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_normal.png
new file mode 100644
index 0000000..28a4382
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_press.png
new file mode 100644
index 0000000..2984427
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_05_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_dim.png
new file mode 100644
index 0000000..0df5593
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_normal.png
new file mode 100644
index 0000000..c8c5884
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_press.png
new file mode 100644
index 0000000..aea3bcc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_06_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call.png
new file mode 100644
index 0000000..9c13b04
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call_press.png
new file mode 100644
index 0000000..9c13b04
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_call_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel.png
new file mode 100644
index 0000000..f8eaf80
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel_press.png
new file mode 100644
index 0000000..f8eaf80
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_cancel_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit.png
new file mode 100644
index 0000000..a7aabe9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_dim.png
new file mode 100644
index 0000000..43b7c24
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_press.png
new file mode 100644
index 0000000..306c745
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_edit_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed.png
new file mode 100644
index 0000000..b421ad1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed_press.png
new file mode 100644
index 0000000..b421ad1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_closed_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened.png
new file mode 100644
index 0000000..9d89e65
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened_press.png
new file mode 100644
index 0000000..9d89e65
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_expand_opened_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_off.png
new file mode 100644
index 0000000..d9c0f89
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_on.png
new file mode 100644
index 0000000..6f5fd0a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_fullscreen_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed.png
new file mode 100644
index 0000000..acca071
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed_press.png
new file mode 100644
index 0000000..acca071
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_closed_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened.png
new file mode 100644
index 0000000..cd36ac1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened_press.png
new file mode 100644
index 0000000..cd36ac1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_expand_opened_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus.png
new file mode 100644
index 0000000..f9a376f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus_press.png
new file mode 100644
index 0000000..ee9aedd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_minus_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus.png
new file mode 100644
index 0000000..1ee0149
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus_press.png
new file mode 100644
index 0000000..1ee0149
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_icon_plus_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info.png
new file mode 100644
index 0000000..4a6e104
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info_press.png
new file mode 100644
index 0000000..4a6e104
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_info_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_normal.png
new file mode 100644
index 0000000..eadabad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_press.png
new file mode 100644
index 0000000..eadabad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_minus_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_off.png
new file mode 100644
index 0000000..3587a8f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_on.png
new file mode 100644
index 0000000..db96e36
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_normal.png
new file mode 100644
index 0000000..724d1a8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_press.png
new file mode 100644
index 0000000..724d1a8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_plus_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_dim.png
new file mode 100644
index 0000000..9ca5a44
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_normal.png
new file mode 100644
index 0000000..7b486af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_press.png
new file mode 100644
index 0000000..f429735
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_popup_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal1.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal1.png
new file mode 100644
index 0000000..8511481
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal1.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal2.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal2.png
new file mode 100644
index 0000000..8ace6b3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_normal2.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press1.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press1.png
new file mode 100644
index 0000000..4ba1c87
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press1.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press2.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press2.png
new file mode 100644
index 0000000..957c127
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_radio_press2.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename.png
new file mode 100644
index 0000000..39c5de5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename_press.png
new file mode 100644
index 0000000..39c5de5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_rename_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal.png
new file mode 100644
index 0000000..973b0ea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left.png
new file mode 100644
index 0000000..5740523
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left_press.png
new file mode 100644
index 0000000..c1a99fa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_left_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_press.png
new file mode 100644
index 0000000..973b0ea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_reveal_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send.png
new file mode 100644
index 0000000..c3bf732
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send_press.png
new file mode 100644
index 0000000..c3bf732
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_send_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep.png
new file mode 100644
index 0000000..638a16b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_delete.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_delete.png
new file mode 100644
index 0000000..87d7185
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_delete.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_dim.png
new file mode 100644
index 0000000..c53e775
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_press.png
new file mode 100644
index 0000000..451bf38
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_sweep_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning.png
new file mode 100644
index 0000000..c4789db
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning_press.png
new file mode 100644
index 0000000..98a1265
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_button_warning_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_caller ID_masking_BG.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_caller ID_masking_BG.png
new file mode 100644
index 0000000..169b5a8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_caller ID_masking_BG.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg.png
new file mode 100644
index 0000000..06f38ca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg_press.png
new file mode 100644
index 0000000..2c2599b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_bg_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_checking.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_checking.png
new file mode 100644
index 0000000..eaf68c4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_check_checking.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left.png
new file mode 100644
index 0000000..684153d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_dim.png
new file mode 100644
index 0000000..003c491
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_press.png
new file mode 100644
index 0000000..91a80e5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_left_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right.png
new file mode 100644
index 0000000..d24b631
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_dim.png
new file mode 100644
index 0000000..84c8a07
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_press.png
new file mode 100644
index 0000000..de5d76d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_btn_right_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_focus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_focus.png
new file mode 100644
index 0000000..f6afdd7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_focus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palett.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palett.png
new file mode 100644
index 0000000..2130190
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palett.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palette_focus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palette_focus.png
new file mode 100644
index 0000000..2614ed0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_color_picker_palette_focus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_popup_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_popup_bg.png
new file mode 100644
index 0000000..b8f0b9a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_popup_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_rollover_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_rollover_bg.png
new file mode 100644
index 0000000..a2b108c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_fast_scroll_rollover_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_field_btn_Clear.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_field_btn_Clear.png
new file mode 100644
index 0000000..c4f2b35
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_field_btn_Clear.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_index list_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_index list_bg.png
new file mode 100644
index 0000000..6f6aa04
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_index list_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_input_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_input_bg.png
new file mode 100644
index 0000000..d5c11f5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_input_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_group_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_group_bg.png
new file mode 100644
index 0000000..c023e50
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_group_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_img_check.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_img_check.png
new file mode 100644
index 0000000..c954b08
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_list_img_check.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_001.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_001.png
new file mode 100644
index 0000000..ecd4f24
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_001.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_002.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_002.png
new file mode 100644
index 0000000..fc2ae05
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_002.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_1.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_1.png
new file mode 100644
index 0000000..fddb025
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_1.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_10.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_10.png
new file mode 100644
index 0000000..5faf411
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_10.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_2.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_2.png
new file mode 100644
index 0000000..c522c5f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_2.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_3.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_3.png
new file mode 100644
index 0000000..4a0f89b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_3.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_4.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_4.png
new file mode 100644
index 0000000..f8a8de9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_4.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_5.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_5.png
new file mode 100644
index 0000000..887b31a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_5.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_6.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_6.png
new file mode 100644
index 0000000..ae94045
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_6.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_7.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_7.png
new file mode 100644
index 0000000..b6fee01
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_7.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_8.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_8.png
new file mode 100644
index 0000000..d1c1158
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_8.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_9.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_9.png
new file mode 100644
index 0000000..c1629d6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_mainmenu_page_bar_9.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_photo_masking.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_photo_masking.png
new file mode 100644
index 0000000..e3f2a1d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_photo_masking.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left.png
new file mode 100644
index 0000000..205ecac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left_press.png
new file mode 100644
index 0000000..205ecac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_left_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right.png
new file mode 100644
index 0000000..1461a0c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right_press.png
new file mode 100644
index 0000000..1461a0c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_arrow_right_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_normal.png
new file mode 100644
index 0000000..215887b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_press.png
new file mode 100644
index 0000000..a32a884
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_btn_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_panel_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_panel_bg.png
new file mode 100644
index 0000000..e274bca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_picker_panel_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bg.png
new file mode 100644
index 0000000..e15e423
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bottom_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bottom_bg.png
new file mode 100644
index 0000000..273e7ce
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bottom_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_bg.png
new file mode 100644
index 0000000..6425919
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_bottom.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_bottom.png
new file mode 100644
index 0000000..432bfac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_bottom.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_top.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_top.png
new file mode 100644
index 0000000..cc2bec6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_bubble_tail_top.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_title_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_title_bg.png
new file mode 100644
index 0000000..c25d08e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_popup_title_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_reorder_group_list_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_reorder_group_list_bg.png
new file mode 100644
index 0000000..b551f88
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_reorder_group_list_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar.png
new file mode 100644
index 0000000..86930ea
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_02.png
new file mode 100644
index 0000000..1585d22
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler.png
new file mode 100644
index 0000000..52ffbef
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler_hor.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler_hor.png
new file mode 100644
index 0000000..76a84a9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_scroll_bar_handler_hor.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_icon.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_icon.png
new file mode 100644
index 0000000..086c91d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_icon.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_input_field_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_input_field_bg.png
new file mode 100644
index 0000000..1aedfd2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_search_input_field_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness01.png
new file mode 100644
index 0000000..fef2550
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness02.png
new file mode 100644
index 0000000..842e8be
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_brightness02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume01.png
new file mode 100644
index 0000000..35aca93
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume02.png
new file mode 100644
index 0000000..bbd50e1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_btn_volume02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle.png
new file mode 100644
index 0000000..6047d2d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_dim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_dim.png
new file mode 100644
index 0000000..829f99d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_dim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_press.png
new file mode 100644
index 0000000..e3ebf5e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_handle_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_popup_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_popup_bg.png
new file mode 100644
index 0000000..0aad395
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_slider_popup_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler.png
new file mode 100644
index 0000000..7abc6ef
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler_hor.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler_hor.png
new file mode 100644
index 0000000..6ae0864
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_splitscreen_handler_hor.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_sweep_list_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_sweep_list_bg.png
new file mode 100644
index 0000000..875c68e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_sweep_list_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_number_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_number_bg.png
new file mode 100644
index 0000000..29aa7f6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_number_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_tail.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_tail.png
new file mode 100644
index 0000000..f219f83
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_timepicker_tail.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back.png
new file mode 100644
index 0000000..780e24e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal.png
new file mode 100644
index 0000000..cb7ca0b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal_h.png
new file mode 100644
index 0000000..539f21d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_normal_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press.png
new file mode 100644
index 0000000..7032b70
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press_h.png
new file mode 100644
index 0000000..8c47f13
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_Back_btn_press_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_normal.png
new file mode 100644
index 0000000..cbb817d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_01.png
new file mode 100644
index 0000000..9384134
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_02.png
new file mode 100644
index 0000000..efc6605
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_03.png
new file mode 100644
index 0000000..404d7b7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Seg_press_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal.png
new file mode 100644
index 0000000..2adac70
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal_h.png
new file mode 100644
index 0000000..5d763bb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_normal_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01.png
new file mode 100644
index 0000000..b4c44b9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01_h.png
new file mode 100644
index 0000000..87f07e9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_01_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02.png
new file mode 100644
index 0000000..0f4e3d5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02_h.png
new file mode 100644
index 0000000..9037624
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_02_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03.png
new file mode 100644
index 0000000..7b577d8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03_h.png
new file mode 100644
index 0000000..e3456fb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_Title_Seg_press_03_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_optiontray.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_optiontray.png
new file mode 100644
index 0000000..cf918c8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_optiontray.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_normal.png
new file mode 100644
index 0000000..f1e3144
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_center.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_center.png
new file mode 100644
index 0000000..062cde0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_center.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_left.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_left.png
new file mode 100644
index 0000000..2eed728
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_left.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_right.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_right.png
new file mode 100644
index 0000000..98a28ed
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_body_press_right.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal.png
new file mode 100644
index 0000000..8babbff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal_h.png
new file mode 100644
index 0000000..4b20ed9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_normal_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01.png
new file mode 100644
index 0000000..845b19f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01_h.png
new file mode 100644
index 0000000..ab30b27
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_01_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02.png
new file mode 100644
index 0000000..5bc86d0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02_h.png
new file mode 100644
index 0000000..cd84b06
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_02_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03.png
new file mode 100644
index 0000000..bd0f1bd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03_h.png
new file mode 100644
index 0000000..7d80637
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_sge_press_03_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_normal.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_normal.png
new file mode 100644
index 0000000..ae793bc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_normal.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_01.png
new file mode 100644
index 0000000..0bbfe26
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_02.png
new file mode 100644
index 0000000..30e9804
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_03.png
new file mode 100644
index 0000000..38cb3d7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_btn_toolbar_sge_press_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg.png
new file mode 100644
index 0000000..a98c595
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg_h.png
new file mode 100644
index 0000000..137372f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_tabbar_bg_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg.png
new file mode 100644
index 0000000..d21ae34
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg_h.png
new file mode 100644
index 0000000..d76a79f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_bg_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line.png
new file mode 100644
index 0000000..3d06505
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line_h.png
new file mode 100644
index 0000000..ec94db9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_toolbar_line_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow.png
new file mode 100644
index 0000000..f5fffc8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow_h.png
new file mode 100644
index 0000000..0d6ed9e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_arrow_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_bg.png
new file mode 100644
index 0000000..187516e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_control_top_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_Status.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_Status.png
new file mode 100644
index 0000000..2b8df41
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_Status.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_off.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_off.png
new file mode 100644
index 0000000..3a9fcb4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_off.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_on.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_on.png
new file mode 100644
index 0000000..1d100a9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_icon_favorite_on.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bar.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bar.png
new file mode 100644
index 0000000..e531572
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bar.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bg.png
new file mode 100644
index 0000000..c814106
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_list_progress_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_more.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_more.png
new file mode 100644
index 0000000..463f3e6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_more.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_notification_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_notification_bg.png
new file mode 100644
index 0000000..c837a6e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_notification_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_01.png
new file mode 100644
index 0000000..481de4b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_02.png
new file mode 100644
index 0000000..3df3d0b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_progress_pending_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_tabbar_focus.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_tabbar_focus.png
new file mode 100644
index 0000000..06552b2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_tabbar_focus.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg.png
new file mode 100644
index 0000000..c837a6e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg_h.png
new file mode 100644
index 0000000..553902e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_bg_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg.png
new file mode 100644
index 0000000..3afcd25
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg_h.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg_h.png
new file mode 100644
index 0000000..2e12780
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_title_tabbar_bg_h.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_toolbar_press.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_toolbar_press.png
new file mode 100644
index 0000000..98698f3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/00_winset_toolbar_press.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon.png
new file mode 100644
index 0000000..1909685
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Mute.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Mute.png
new file mode 100644
index 0000000..bc99150
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Mute.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Vibrat.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Vibrat.png
new file mode 100644
index 0000000..d40a47e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/Volume/00_volume_icon_Vibrat.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/ajax-loader.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/ajax-loader.png
new file mode 100644
index 0000000..811a2cd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/ajax-loader.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_3Dview.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_3Dview.png
new file mode 100644
index 0000000..9769b25
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_3Dview.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_DM.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_DM.png
new file mode 100644
index 0000000..f27e616
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_DM.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Externalstorage.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Externalstorage.png
new file mode 100644
index 0000000..247fa73
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Externalstorage.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_MemoryCard.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_MemoryCard.png
new file mode 100644
index 0000000..3f10810
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_MemoryCard.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Play.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Play.png
new file mode 100644
index 0000000..4a0505e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_Play.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_TTS.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_TTS.png
new file mode 100644
index 0000000..666c821
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_TTS.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_account_sign-up.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_account_sign-up.png
new file mode 100644
index 0000000..2288758
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_account_sign-up.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_accounts.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_accounts.png
new file mode 100644
index 0000000..768d8db
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_accounts.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-bookmarks.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-bookmarks.png
new file mode 100644
index 0000000..bc2e48b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-bookmarks.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-calendar.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-calendar.png
new file mode 100644
index 0000000..20eae31
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add-to-calendar.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_tag.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_tag.png
new file mode 100644
index 0000000..cf631ac
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_tag.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_to_contact.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_to_contact.png
new file mode 100644
index 0000000..65d47e4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_add_to_contact.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_alarm.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_alarm.png
new file mode 100644
index 0000000..50997d5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_alarm.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_albums.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_albums.png
new file mode 100644
index 0000000..03f8404
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_albums.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_area.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_area.png
new file mode 100644
index 0000000..8b3889b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_area.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_artist.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_artist.png
new file mode 100644
index 0000000..c7b10a9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_artist.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_attach.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_attach.png
new file mode 100644
index 0000000..4ab53f2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_attach.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_back.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_back.png
new file mode 100644
index 0000000..64dbf1b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_back.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_backward.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_backward.png
new file mode 100644
index 0000000..066f51c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_backward.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bluetooth_preview.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bluetooth_preview.png
new file mode 100644
index 0000000..99946bb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bluetooth_preview.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bookmarks.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bookmarks.png
new file mode 100644
index 0000000..586e1f3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_bookmarks.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_brightness.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_brightness.png
new file mode 100644
index 0000000..953dc47
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_brightness.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_calendar.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_calendar.png
new file mode 100644
index 0000000..30cea7c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_calendar.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_call.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_call.png
new file mode 100644
index 0000000..b8b7806
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_call.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_camera.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_camera.png
new file mode 100644
index 0000000..234a611
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_camera.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_category.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_category.png
new file mode 100644
index 0000000..829b21d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_category.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_change_group.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_change_group.png
new file mode 100644
index 0000000..9d1e569
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_change_group.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_chat.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_chat.png
new file mode 100644
index 0000000..50d1943
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_chat.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_check.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_check.png
new file mode 100644
index 0000000..5be28b7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_check.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_close.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_close.png
new file mode 100644
index 0000000..91b04e5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_close.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_compose.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_compose.png
new file mode 100644
index 0000000..20b71f7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_compose.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_composer.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_composer.png
new file mode 100644
index 0000000..71a9192
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_composer.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_contacts.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_contacts.png
new file mode 100644
index 0000000..a376989
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_contacts.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_copy.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_copy.png
new file mode 100644
index 0000000..13c40bb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_copy.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create.png
new file mode 100644
index 0000000..0dc1144
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create_folder.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create_folder.png
new file mode 100644
index 0000000..d74811f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_create_folder.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_delete.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_delete.png
new file mode 100644
index 0000000..faaa0d3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_delete.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_dialer.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_dialer.png
new file mode 100644
index 0000000..1ad19c7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_dialer.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_edit.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_edit.png
new file mode 100644
index 0000000..4ddc598
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_edit.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_editor.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_editor.png
new file mode 100644
index 0000000..924818f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_editor.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_eng_eng_result.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_eng_eng_result.png
new file mode 100644
index 0000000..466584c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_eng_eng_result.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_exchangs_register.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_exchangs_register.png
new file mode 100644
index 0000000..58c6e27
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_exchangs_register.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_favorite.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_favorite.png
new file mode 100644
index 0000000..aa13cf9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_favorite.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_features.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_features.png
new file mode 100644
index 0000000..e05d165
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_features.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_forward.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_forward.png
new file mode 100644
index 0000000..a1fca43
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_forward.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_genre.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_genre.png
new file mode 100644
index 0000000..bb6336c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_genre.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_groups.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_groups.png
new file mode 100644
index 0000000..e793512
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_groups.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_help.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_help.png
new file mode 100644
index 0000000..7345a02
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_help.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_home.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_home.png
new file mode 100644
index 0000000..93e3fad
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_home.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_info.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_info.png
new file mode 100644
index 0000000..0320ad3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_info.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_length.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_length.png
new file mode 100644
index 0000000..b23f708
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_length.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_list_by.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_list_by.png
new file mode 100644
index 0000000..0c17352
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_list_by.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_logs.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_logs.png
new file mode 100644
index 0000000..384341b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_logs.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_map.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_map.png
new file mode 100644
index 0000000..7300286
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_map.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_memolist.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_memolist.png
new file mode 100644
index 0000000..8d92234
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_memolist.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_mention.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_mention.png
new file mode 100644
index 0000000..31774da
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_mention.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_menu.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_menu.png
new file mode 100644
index 0000000..b5a9a8d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_menu.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_more.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_more.png
new file mode 100644
index 0000000..651c8e1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_more.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_move.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_move.png
new file mode 100644
index 0000000..fdc8c8a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_move.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview.png
new file mode 100644
index 0000000..2d731eb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_02.png
new file mode 100644
index 0000000..32ff645
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_03.png
new file mode 100644
index 0000000..8d74949
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_04.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_04.png
new file mode 100644
index 0000000..66bc543
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_04.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_05.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_05.png
new file mode 100644
index 0000000..f17bba0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_05.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_06.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_06.png
new file mode 100644
index 0000000..dce660a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_06.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_07.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_07.png
new file mode 100644
index 0000000..427f171
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_07.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_08.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_08.png
new file mode 100644
index 0000000..8c4467c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_08.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_09.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_09.png
new file mode 100644
index 0000000..5a7719f
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_multiview_09.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_music_albums.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_music_albums.png
new file mode 100644
index 0000000..ad20f50
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_music_albums.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_pause.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_pause.png
new file mode 100644
index 0000000..4483640
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_pause.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_phone.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_phone.png
new file mode 100644
index 0000000..74e9ec6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_phone.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_playlists.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_playlists.png
new file mode 100644
index 0000000..44eabbf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_playlists.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_receive.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_receive.png
new file mode 100644
index 0000000..06e7946
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_receive.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_reply.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_reply.png
new file mode 100644
index 0000000..4bdadbd
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_reply.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save.png
new file mode 100644
index 0000000..f8a9278
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save_to_calender.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save_to_calender.png
new file mode 100644
index 0000000..c604f31
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_save_to_calender.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_scrap.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_scrap.png
new file mode 100644
index 0000000..b46bd8b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_scrap.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_search.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_search.png
new file mode 100644
index 0000000..ff46fa3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_search.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_send.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_send.png
new file mode 100644
index 0000000..7855940
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_send.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_set_as.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_set_as.png
new file mode 100644
index 0000000..b519baf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_set_as.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_settings.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_settings.png
new file mode 100644
index 0000000..bbea504
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_settings.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_setup_wizard_previous.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_setup_wizard_previous.png
new file mode 100644
index 0000000..2185437
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_setup_wizard_previous.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_share.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_share.png
new file mode 100644
index 0000000..c1a20b5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_share.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_songs.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_songs.png
new file mode 100644
index 0000000..ddf797e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_songs.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_stop_watch.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_stop_watch.png
new file mode 100644
index 0000000..c176aa2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_stop_watch.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_store.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_store.png
new file mode 100644
index 0000000..54c32f5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_store.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_start_sync.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_start_sync.png
new file mode 100644
index 0000000..e91d2e4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_start_sync.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_01.png
new file mode 100644
index 0000000..5121229
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_02.png
new file mode 100644
index 0000000..138bed9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_03.png
new file mode 100644
index 0000000..fcc1917
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_stop_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_view_result.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_view_result.png
new file mode 100644
index 0000000..107f009
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_synchronise_view_result.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_tag.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_tag.png
new file mode 100644
index 0000000..f942628
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_tag.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_temp.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_temp.png
new file mode 100644
index 0000000..0ae4445
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_temp.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timeline.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timeline.png
new file mode 100644
index 0000000..f456014
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timeline.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timer.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timer.png
new file mode 100644
index 0000000..2464103
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_timer.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_today.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_today.png
new file mode 100644
index 0000000..c200446
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_today.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_top.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_top.png
new file mode 100644
index 0000000..f7e63fa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_top.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_trim.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_trim.png
new file mode 100644
index 0000000..b46bd8b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_trim.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_unread_message.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_unread_message.png
new file mode 100644
index 0000000..bda2bee
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_unread_message.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_update.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_update.png
new file mode 100644
index 0000000..524b7ca
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_update.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_upload_export.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_upload_export.png
new file mode 100644
index 0000000..c381158
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_upload_export.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_volume.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_volume.png
new file mode 100644
index 0000000..1b676dc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_volume.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_weight.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_weight.png
new file mode 100644
index 0000000..514d155
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_weight.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_world_clock.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_world_clock.png
new file mode 100644
index 0000000..e9b7669
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_world_clock.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_year.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_year.png
new file mode 100644
index 0000000..a4e14d5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/controlbar/01_controlbar_icon_year.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-black.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-black.png
new file mode 100644
index 0000000..1ecfd26
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-black.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-white.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-white.png
new file mode 100644
index 0000000..0c70831
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-18-white.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-black.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-black.png
new file mode 100644
index 0000000..4c72adf
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-black.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-white.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-white.png
new file mode 100644
index 0000000..84ea9fb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/icons-36-white.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_001.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_001.png
new file mode 100644
index 0000000..cf3d69c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_001.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_002.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_002.png
new file mode 100644
index 0000000..e49b277
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_002.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_01.png
new file mode 100644
index 0000000..901dac3
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_02.png
new file mode 100644
index 0000000..b81cbf8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_03.png
new file mode 100644
index 0000000..f62e65b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_04.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_04.png
new file mode 100644
index 0000000..86be281
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_04.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_05.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_05.png
new file mode 100644
index 0000000..9255391
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_05.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_06.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_06.png
new file mode 100644
index 0000000..1635f8a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_06.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_07.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_07.png
new file mode 100644
index 0000000..cf91725
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_07.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_08.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_08.png
new file mode 100644
index 0000000..df1adb7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_08.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_09.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_09.png
new file mode 100644
index 0000000..1264428
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_09.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_10.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_10.png
new file mode 100644
index 0000000..e0a87f5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/page_indicator/00_mainmenu_page_bar_10.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_bottom.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_bottom.png
new file mode 100644
index 0000000..f8101af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_bottom.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_top.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_top.png
new file mode 100644
index 0000000..8f35070
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_top.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_ver.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_ver.png
new file mode 100644
index 0000000..21b1351
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_arrow_ver.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_bubble_bg_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_bubble_bg_01.png
new file mode 100644
index 0000000..61d6b7b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_bubble_bg_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_title_bg_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_title_bg_01.png
new file mode 100644
index 0000000..dcfbc9c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/popup/00_popup_title_bg_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_01.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_01.png
new file mode 100644
index 0000000..8124a7b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_01.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_02.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_02.png
new file mode 100644
index 0000000..c4428f7
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_02.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_03.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_03.png
new file mode 100644
index 0000000..33458d5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_03.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_04.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_04.png
new file mode 100644
index 0000000..b3f8ef6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_04.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_05.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_05.png
new file mode 100644
index 0000000..cb53465
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_05.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_06.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_06.png
new file mode 100644
index 0000000..1fc9501
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_06.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_07.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_07.png
new file mode 100644
index 0000000..1174beb
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_07.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_08.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_08.png
new file mode 100644
index 0000000..9386d3a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_08.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_09.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_09.png
new file mode 100644
index 0000000..19c608c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_09.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_10.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_10.png
new file mode 100644
index 0000000..72334f2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_10.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_11.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_11.png
new file mode 100644
index 0000000..77ac2f2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_11.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_12.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_12.png
new file mode 100644
index 0000000..466c052
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_12.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_13.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_13.png
new file mode 100644
index 0000000..d6047fc
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_13.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_14.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_14.png
new file mode 100644
index 0000000..ee0cee5
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_14.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_15.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_15.png
new file mode 100644
index 0000000..9733288
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_15.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_16.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_16.png
new file mode 100644
index 0000000..fb6b7c6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_16.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_17.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_17.png
new file mode 100644
index 0000000..4ff8db8
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_17.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_18.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_18.png
new file mode 100644
index 0000000..d1fde2d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_18.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_19.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_19.png
new file mode 100644
index 0000000..c2bb19b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_19.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_20.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_20.png
new file mode 100644
index 0000000..50d9e81
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_20.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_21.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_21.png
new file mode 100644
index 0000000..c65fe5c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_21.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_22.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_22.png
new file mode 100644
index 0000000..b7b4443
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_22.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_23.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_23.png
new file mode 100644
index 0000000..f102b8b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_23.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_24.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_24.png
new file mode 100644
index 0000000..a47ff9b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_24.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_25.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_25.png
new file mode 100644
index 0000000..b306a07
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_25.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_26.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_26.png
new file mode 100644
index 0000000..21af3ff
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_26.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_27.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_27.png
new file mode 100644
index 0000000..398d438
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_27.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_28.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_28.png
new file mode 100644
index 0000000..e0721fa
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_28.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_29.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_29.png
new file mode 100644
index 0000000..4fcda20
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_29.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_30.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_30.png
new file mode 100644
index 0000000..1c5064b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/00_winset_list_process_30.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_01_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_01_32x32.png
new file mode 100644
index 0000000..556fd00
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_01_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_02_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_02_32x32.png
new file mode 100644
index 0000000..e3f6661
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_02_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_03_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_03_32x32.png
new file mode 100644
index 0000000..aabd74d
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_03_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_04_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_04_32x32.png
new file mode 100644
index 0000000..6752381
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_04_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_05_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_05_32x32.png
new file mode 100644
index 0000000..026bf39
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_05_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_06_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_06_32x32.png
new file mode 100644
index 0000000..76ad804
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_06_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_07_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_07_32x32.png
new file mode 100644
index 0000000..3ff8e86
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_07_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_08_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_08_32x32.png
new file mode 100644
index 0000000..35964af
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_08_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_09_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_09_32x32.png
new file mode 100644
index 0000000..acc0e33
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_09_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_10_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_10_32x32.png
new file mode 100644
index 0000000..732ab34
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_10_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_11_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_11_32x32.png
new file mode 100644
index 0000000..5bb451a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_11_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_12_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_12_32x32.png
new file mode 100644
index 0000000..d411a19
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_12_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_13_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_13_32x32.png
new file mode 100644
index 0000000..4df5086
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_13_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_14_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_14_32x32.png
new file mode 100644
index 0000000..eda2bb4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_14_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_15_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_15_32x32.png
new file mode 100644
index 0000000..5a1225e
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_15_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_16_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_16_32x32.png
new file mode 100644
index 0000000..3fb7f2b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_16_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_17_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_17_32x32.png
new file mode 100644
index 0000000..d40c3a4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_17_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_18_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_18_32x32.png
new file mode 100644
index 0000000..b6f87c0
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_18_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_19_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_19_32x32.png
new file mode 100644
index 0000000..e06e91c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_19_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_20_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_20_32x32.png
new file mode 100644
index 0000000..b7fea9c
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_20_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_21_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_21_32x32.png
new file mode 100644
index 0000000..9b953a6
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_21_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_22_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_22_32x32.png
new file mode 100644
index 0000000..e4da281
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_22_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_23_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_23_32x32.png
new file mode 100644
index 0000000..a63c879
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_23_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_24_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_24_32x32.png
new file mode 100644
index 0000000..d3c8964
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_24_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_25_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_25_32x32.png
new file mode 100644
index 0000000..480b0b4
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_25_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_26_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_26_32x32.png
new file mode 100644
index 0000000..73a1a83
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_26_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_27_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_27_32x32.png
new file mode 100644
index 0000000..c06818a
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_27_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_28_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_28_32x32.png
new file mode 100644
index 0000000..015dda9
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_28_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_29_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_29_32x32.png
new file mode 100644
index 0000000..01d8f98
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_29_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_30_32x32.png b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_30_32x32.png
new file mode 100644
index 0000000..8633efe
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/images/process/Process_32x32/00_winset_list_process_30_32x32.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/theme.js b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/theme.js
new file mode 100644
index 0000000..763989b
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/theme.js
@@ -0,0 +1,22 @@
+(function( $, undefined ) {
+//$.mobile.page.prototype.options.backBtnTheme	= "s";
+
+// Clear default theme for child elements
+$.mobile.page.prototype.options.headerTheme		= "s";
+$.mobile.page.prototype.options.footerTheme		= "s";
+//$.mobile.page.prototype.options.contentTheme	= "s";
+
+// clear listview
+$.mobile.listview.prototype.options.theme = "s";
+$.mobile.listview.prototype.options.countTheme = "s";
+$.mobile.listview.prototype.options.headerTheme = "s";
+$.mobile.listview.prototype.options.dividerTheme = "s";
+$.mobile.listview.prototype.options.splitTheme = "s";
+
+//clear button theme
+$.mobile.button.prototype.options.theme = "s";
+
+// Default theme swatch
+$.mobile.page.prototype.options.theme = "s";
+
+})(jQuery);
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/tizen-web-ui-fw-theme.css b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/tizen-web-ui-fw-theme.css
new file mode 100644
index 0000000..18f3916
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/project/tizen-web-ui-fw/0.1/themes/tizen-gray/tizen-web-ui-fw-theme.css
@@ -0,0 +1,12866 @@
+/*!
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* Swatches */
+/* S
+-----------------------------------------------------------------------------------------------------------*/
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar
+***************************************************************************/
+.ui-bar-s {
+  border: none;
+  background: #1f1f1f;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: bold;
+  font-size: 1rem;
+  /*	
+	.ui-link {
+		color: #7cc4e7; 
+		font-weight: bold;
+		&:hover { color: #2489CE; }
+		&:active { color: #2489CE; }
+		&:visited {	color: #2489CE; }
+	}
+	*/
+}
+.ui-bar-s .ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-bar-s .ui-btn.ui-btn-back.ui-btn-down-s .ui-btn-inner {
+  background: #0a8cd2;
+}
+.ui-bar-s .ui-btn.ui-btn-back, .ui-bar-s .ui-btn.ui-btn-footer-right {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  width: 4rem;
+  height: 3.1666666666666665rem;
+  top: 0rem;
+  border-style: none;
+  border-width: 0px;
+  background: #1f1f1f;
+}
+.ui-bar-s .ui-btn.ui-btn-back .ui-btn-inner, .ui-bar-s .ui-btn.ui-btn-footer-right .ui-btn-inner {
+  padding: 0;
+  width: 2.888888888888889rem;
+  height: 2.0555555555555554rem;
+  top: 0.5555555555555556rem;
+  left: 0.5555555555555556rem;
+  background: #353535;
+  border-color: black;
+  border-width: 0.05555555555555555rem;
+  border-style: groove;
+}
+.ui-bar-s .ui-btn.ui-btn-back {
+  right: 0rem;
+}
+.ui-bar-s .ui-btn.ui-btn-footer-right.ui-btn-down-s .ui-btn-inner {
+  background: #0a8cd2;
+}
+.ui-bar-s .ui-btn.ui-btn-footer-right .ui-btn-inner .ui-btn-text {
+  line-height: 2.0555555555555554rem;
+}
+.ui-bar-s .ui-field-contain {
+  margin-left: auto;
+  margin-right: auto;
+  height: 2.0555555555555554rem;
+  font-size: 0.7777777777777777rem;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup {
+  position: absolute;
+  display: inline;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup label {
+  border-color: #2b2b2b;
+  border-style: solid;
+  border-left-width: 1px;
+  border-right-width: 1px;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio {
+  height: 2.0555555555555554rem;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-btn {
+  width: 100%;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-btn-inner .ui-btn-text {
+  text-align: center;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-radio-off {
+  background: #434343;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-radio-off .ui-btn-text {
+  color: #767676;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-radio-on {
+  background: #f9f9f9;
+}
+.ui-bar-s .ui-field-contain .ui-extended-controlgroup .ui-radio .ui-radio-on .ui-btn-text {
+  color: #000000;
+}
+.ui-bar-s .ui-field-contain .ui-title-extended-controlgroup {
+  top: 0.1388888888888889rem;
+}
+.ui-bar-s .ui-field-contain .ui-footer-extended-controlgroup {
+  top: 0.4444444444444444rem;
+}
+.ui-bar-s .ui-field-contain .ui-footer-extended-controlgroup .ui-btn-inner {
+  line-height: 2.0555555555555554rem;
+  padding: 0rem;
+}
+.ui-bar-s .ui-title-normal-3btn {
+  position: absolute;
+  right: 4.277777777777778rem;
+  display: block;
+}
+.ui-bar-s .ui-title-extended-controlgroup-4btn {
+  width: 18.944444444444443rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-4btn .ui-radio {
+  width: 4.722222222222222rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-3btn {
+  width: 12rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-3btn .ui-radio {
+  width: 3.972222222222222rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-2btn {
+  width: 9.11111111111111rem;
+}
+.ui-bar-s .ui-title-extended-controlgroup-2btn .ui-radio {
+  width: 4.527777777777778rem;
+}
+.ui-header.ui-bar-s {
+  position: fixed;
+  top: 0px;
+  background: #6c6c6c;
+}
+.ui-header.ui-bar-s .ui-title {
+  color: #f9f9f9;
+  top: 0px;
+  min-height: 1rem;
+  text-align: center;
+  font-size: 1rem;
+  display: block;
+  margin: 0.7777777777777777rem 3.75rem 0.7777777777777777rem 3.75rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  outline: 0 !important;
+}
+.ui-header.ui-bar-s .ui-btn {
+  font-size: 0.7777777777777777rem;
+  height: 2.0555555555555554rem;
+  width: 3.444444444444444rem;
+}
+.ui-header.ui-bar-s > .ui-btn {
+  top: 0.3333333333333333rem;
+  margin-top: 0px;
+  font-size: 0.7777777777777777rem;
+  height: 2.0555555555555554rem;
+  background: #848484;
+  color: #f9f9f9;
+  border-style: solid;
+  border-color: #4c4c4c;
+  border-width: 1px;
+}
+.ui-header.ui-bar-s > .ui-btn .ui-btn-inner {
+  width: 3rem;
+}
+.ui-header.ui-bar-s > .ui-btn.ui-btn-down-s {
+  background: #0a8cd2;
+  color: #f9f9f9;
+}
+.ui-header.ui-bar-s.ui-title-extended-height {
+  height: 3.7777777777777777rem;
+}
+.ui-header.ui-bar-s.ui-title-extended-height a {
+  top: 1.3888888888888888rem;
+}
+.ui-header.ui-bar-s.ui-title-extended-height .ui-title {
+  font-size: 0.7777777777777777rem;
+  top: 0rem;
+  padding-top: 0.3055555555555555rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+}
+.ui-header.ui-bar-s.ui-title-extended-height .ui-title-extended-segment-style {
+  left: 0rem;
+  margin-top: 0rem;
+  top: 0.05555555555555555rem;
+}
+.ui-header.ui-bar-s.ui-title-controlbar-height, .ui-footer.ui-bar-s {
+  height: 3.1666666666666665rem;
+}
+.ui-footer.ui-bar-s.ui-footer-fixed {
+  background: #1f1f1f;
+  height: 3.1666666666666665rem;
+}
+.ui-footer.ui-bar-s.ui-footer-fixed .ui-title {
+  font-size: 0.8888888888888888rem;
+}
+.ui-footer.ui-bar-s .ui-title-extended-controlgroup-4btn {
+  margin-top: 0rem;
+}
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar
+***************************************************************************/
+/***************************************************************************
+                    Content Top calculate
+***************************************************************************/
+.ui-title-content-normal-height, .ui-title-content-option-header-collapsed-1line-height {
+  position: relative;
+  top: 2.7777777777777777rem;
+}
+.ui-title-content-extended-height {
+  position: relative;
+  top: 3.7777777777777777rem;
+}
+.ui-title-content-option-header-expanded-1line-height {
+  position: relative;
+  top: 5.416666666666666rem;
+}
+.ui-title-content-search {
+  position: relative;
+  top: 5.722222222222222rem;
+}
+.ui-title-content-optionheader-search {
+  position: relative;
+  top: 6.083333333333333rem;
+}
+.ui-title-content-controlbar-height {
+  position: relative;
+  top: 3.194444444444444rem;
+}
+/***************************************************************************
+                    Content Top calculate
+***************************************************************************/
+.ui-body-s {
+  border: 1px solid #2a2a2a;
+  background: #000000;
+  color: #f9f9f9;
+  font-weight: normal;
+  font-family: Helvetica, Arial, sans-serif;
+}
+.ui-body-s .ui-link-inherit {
+  color: #fff;
+}
+.ui-body-s .ui-link {
+  /* ui-body-link */
+
+  color: #2489CE;
+  font-weight: bold;
+}
+.ui-body-s .ui-link:hover {
+  color: #2489CE;
+}
+.ui-body-s .ui-link:active {
+  color: #2489CE;
+}
+.ui-body-s .ui-link:visited {
+  color: #2489CE;
+}
+.ui-btn-up-s {
+  background: #3b3b3b;
+  font-weight: bold;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.ui-btn-up-s a.ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-btn-up-s:hover {
+  color: #f9f9f9;
+}
+.ui-btn-hover-s {
+  background: #454545;
+  font-weight: bold;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.ui-btn-hover-s a.ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-btn-hover-s:hover {
+  color: #f9f9f9;
+}
+.ui-btn-down-s {
+  background: #008cd2;
+  font-weight: bold;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.ui-btn-down-s a.ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-btn-down-s:hover {
+  color: #f9f9f9;
+}
+.ui-btn-up-s, .ui-btn-hover-s, .ui-btn-down-s {
+  font-family: Helvetica, Arial, sans-serif;
+  text-decoration: none;
+}
+.ui-listview {
+  border-top-color: #444444;
+  /* listview: fonts for li with a link */
+
+  /* listview divider */
+
+  /* NOTE: this divider has no swatch tag! */
+
+  /* subitem */
+
+}
+.ui-listview > .ui-li {
+  border-bottom-color: #444444;
+}
+.ui-listview  > .ui-li-static {
+  background-color: #000000;
+}
+.ui-listview li.ui-btn-up-s, .ui-listview li.ui-btn-hover-s {
+  background-color: #000000;
+  color: #f9f9f9;
+}
+.ui-listview li.ui-btn-down-s {
+  background-color: #008cd2;
+  color: #f9f9f9;
+}
+.ui-listview li.ui-btn-up-s > .ui-li > .ui-btn-text > a.ui-link-inherit, .ui-listview li.ui-btn-hover-s > .ui-li > .ui-btn-text > a.ui-link-inherit, .ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+  color: #f9f9f9;
+}
+.ui-listview li.ui-li-divider {
+  background: #424242;
+  color: #a4a4a4;
+}
+.ui-listview .ui-li-sub {
+  color: #666666;
+}
+.ui-listview .ui-li-sub-setting {
+  color: #2a6d8c;
+}
+.ui-listview > .ui-li-expanded {
+  background-color: #1f1f1f;
+}
+.ui-listview > .ui-li-expanded .ui-li-expanded {
+  background-color: #2e2e2e;
+}
+.ui-listview .ui-li-static.ui-li-bubble-left {
+  background-color: #ddce7a;
+  -moz-box-shadow: 2px 3px 3px #4d3a17;
+  -webkit-box-shadow: 2px 3px 3px #4d3a17;
+  box-shadow: 2px 3px 3px #4d3a17;
+  color: #000000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-right {
+  background-color: #ddce7a;
+  -moz-box-shadow: 2px 3px 3px #4d3a17;
+  -webkit-box-shadow: 2px 3px 3px #4d3a17;
+  box-shadow: 2px 3px 3px #4d3a17;
+  color: #606060;
+}
+.ui-listview .ui-li-static.ui-li-bubble-sos {
+  color: #d30000;
+}
+.ui-listview .ui-li-static.ui-li-bubble-date {
+  background-color: #424242;
+  color: #39a6d7;
+}
+.ui-listview span.ui-li-bubble-time {
+  color: #39a6d7;
+}
+/* Structure */
+/* links within "buttons" 
+-----------------------------------------------------------------------------------------------------------*/
+a.ui-link-inherit {
+  text-decoration: none !important;
+}
+/* Active class used as the "on" state across all themes
+-----------------------------------------------------------------------------------------------------------*/
+/* button default color for active state */
+.ui-btn-active {
+  /* global-active */
+
+  color: #f9f9f9;
+  cursor: pointer;
+  text-decoration: none;
+  background: #008cd2;
+  outline: none;
+}
+.ui-btn-active a.ui-link-inherit {
+  color: #f9f9f9;
+}
+/* button inner top highlight
+-----------------------------------------------------------------------------------------------------------*/
+/*************************************************************************** 
+                    ControlBar
+***************************************************************************/
+.ui-controlbar-s, .ui-controlbar-left, .ui-controlbar-right {
+  border: 1px solid #2a2a2a;
+  background: #1f1f1f;
+  color: #f9f9f9;
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: bold;
+  font-size: 1rem;
+}
+.ui-controlbar-s .ui-link-inherit,
+.ui-controlbar-left .ui-link-inherit,
+.ui-controlbar-right .ui-link-inherit,
+.ui-controlbar-s .ui-link,
+.ui-controlbar-left .ui-link,
+.ui-controlbar-right .ui-link {
+  color: #f9f9f9;
+  font-weight: bold;
+}
+.ui-controlbar-s .ui-link-inherit:hover,
+.ui-controlbar-left .ui-link-inherit:hover,
+.ui-controlbar-right .ui-link-inherit:hover,
+.ui-controlbar-s .ui-link:hover,
+.ui-controlbar-left .ui-link:hover,
+.ui-controlbar-right .ui-link:hover {
+  color: #f9f9f9;
+}
+.ui-controlbar-s .ui-link-inherit:active,
+.ui-controlbar-left .ui-link-inherit:active,
+.ui-controlbar-right .ui-link-inherit:active,
+.ui-controlbar-s .ui-link:active,
+.ui-controlbar-left .ui-link:active,
+.ui-controlbar-right .ui-link:active {
+  color: #f9f9f9;
+}
+.ui-controlbar-s .ui-link-inherit:visited,
+.ui-controlbar-left .ui-link-inherit:visited,
+.ui-controlbar-right .ui-link-inherit:visited,
+.ui-controlbar-s .ui-link:visited,
+.ui-controlbar-left .ui-link:visited,
+.ui-controlbar-right .ui-link:visited {
+  color: #f9f9f9;
+}
+.ui-controlbar-s .ui-btn-text,
+.ui-controlbar-left .ui-btn-text,
+.ui-controlbar-right .ui-btn-text,
+.ui-controlbar-s .ui-btn,
+.ui-controlbar-left .ui-btn,
+.ui-controlbar-right .ui-btn {
+  color: #f9f9f9;
+  font-weight: bold;
+  text-decoration: none;
+}
+.ui-controlbar-s .ui-btn-down-s,
+.ui-controlbar-left .ui-btn-down-s,
+.ui-controlbar-right .ui-btn-down-s,
+.ui-controlbar-s .ui-btn-active,
+.ui-controlbar-left .ui-btn-active,
+.ui-controlbar-right .ui-btn-active {
+  color: #f9f9f9;
+}
+.ui-controlbar-s.ui-navbar {
+  position: absolute;
+  height: 3.1666666666666665rem;
+  /* temporary value */
+
+  width: 100%;
+  left: 0px;
+  border-top: none;
+  border-bottom: none;
+  z-index: 50;
+}
+.ui-controlbar-s.ui-navbar li .ui-btn, .ui-controlbar-s.ui-navbar .ui-navbar-toggle .ui-btn {
+  font-size: 0.7222222222222222rem;
+}
+.ui-controlbar-s.ui-navbar .ui-btn .ui-btn-inner,
+.ui-controlbar-s.ui-navbar .ui-btn-icon-top .ui-btn-inner,
+.ui-controlbar-s.ui-navbar .ui-btn-hover-s .ui-btn-inner,
+.ui-controlbar-s.ui-navbar .ui-btn-active .ui-btn-inner,
+.ui-controlbar-s.ui-navbar .ui-btn-up-s .ui-btn-inner {
+  padding-top: 2.194444444444444rem;
+}
+.ui-controlbar-s.ui-navbar .ui-btn .ui-icon {
+  left: 50%;
+  top: 0.3333333333333333rem;
+  margin-left: -1.3em;
+  width: 1.5555555555555554rem;
+  height: 1.5555555555555554rem;
+}
+.ui-controlbar-s.ui-navbar .ui-btn .ui-btn-text {
+  padding-left: 0px;
+}
+.ui-controlbar-s.ui-navbar .ui-btn.ui-ctrlbar-icononly {
+  padding-top: 0.5555555555555556rem;
+}
+.ui-controlbar-s.ui-navbar .ui-btn-inner {
+  z-index: 200;
+}
+.ui-controlbar-s.ui-navbar .ui-btn-inner.ui-navbar-textonly {
+  font-size: 0.7777777777777777rem;
+  padding-top: 1.222222222222222rem;
+  padding-bottom: 1.25rem;
+}
+.ui-tabbar-s .ui-btn {
+  background: #1f1f1f;
+}
+.ui-tabbar-s .ui-btn-active, .ui-tabbar-s .ui-btn-show-style {
+  background: #4c4c4c;
+  border-left-style: solid;
+  border-right-style: solid;
+  border-left-color: #2a2a2a;
+  border-right-color: #2a2a2a;
+  border-left-width: 1px;
+  border-right-width: 1px;
+}
+.ui-tabbar-s .ui-btn-animation {
+  background: #4c4c4c;
+  border-left-style: solid;
+  border-right-style: solid;
+  border-left-color: #2a2a2a;
+  border-right-color: #2a2a2a;
+  border-left-width: 1px;
+  border-right-width: 1px;
+  position: absolute;
+  top: 0px;
+  height: 3.4166666666666665rem;
+  z-index: 100;
+}
+.ui-tabbar-s .ui-btn-hide-style {
+  background: #1f1f1f;
+  border: none;
+}
+.ui-toolbar-s .ui-btn, .ui-toolbar-s .ui-btn-up-s {
+  background: #1f1f1f;
+  border-left-width: 1px;
+  border-right-width: 1px;
+  border-color: #2a2a2a;
+  border-style: solid;
+}
+.ui-toolbar-s .ui-btn-down-s {
+  background: #4c4c4c;
+}
+.ui-header .ui-navbar.ui-tabbar-s a, .ui-header .ui-navbar.ui-toolbar-s a {
+  width: 100%;
+  height: 100%;
+}
+.ui-controlbar-left.ui-navbar, .ui-controlbar-right.ui-navbar {
+  position: fixed;
+  z-index: 50;
+}
+.ui-controlbar-left.ui-navbar li .ui-btn,
+.ui-controlbar-right.ui-navbar li .ui-btn,
+.ui-controlbar-left.ui-navbar .ui-navbar-toggle .ui-btn,
+.ui-controlbar-right.ui-navbar .ui-navbar-toggle .ui-btn {
+  font-size: 0.5555555555555556rem;
+}
+.ui-controlbar-left.ui-navbar .ui-btn, .ui-controlbar-right.ui-navbar .ui-btn {
+  width: 100%;
+  margin: 0px 0em;
+  background: #1f1f1f;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-down-s,
+.ui-controlbar-right.ui-navbar .ui-btn-down-s,
+.ui-controlbar-left.ui-navbar .ui-btn-active,
+.ui-controlbar-right.ui-navbar .ui-btn-active {
+  color: #f9f9f9;
+}
+.ui-controlbar-left.ui-navbar li .ui-btn,
+.ui-controlbar-right.ui-navbar li .ui-btn,
+.ui-controlbar-left.ui-navbar .ui-navbar-toggle .ui-btn,
+.ui-controlbar-right.ui-navbar .ui-navbar-toggle .ui-btn {
+  font-size: 0.5555555555555556rem;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-inner, .ui-controlbar-right.ui-navbar .ui-btn-inner {
+  z-index: 200;
+  padding-top: 3.5rem;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-inner .ui-icon, .ui-controlbar-right.ui-navbar .ui-btn-inner .ui-icon {
+  left: 23%;
+  top: 0.9722222222222222rem;
+  width: 1.9444444444444444rem;
+  height: 1.9444444444444444rem;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left, .ui-controlbar-right.ui-navbar .ui-btn-inner .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 0px;
+}
+.ui-controlbar-left.ui-navbar .ui-btn-animation, .ui-controlbar-right.ui-navbar .ui-btn-animation {
+  position: fixed;
+  background: #1f1f1f;
+  border-bottom-style: solid;
+  border-top-style: solid;
+  border-bottom-color: #2a2a2a;
+  border-top-color: #2a2a2a;
+  border-bottom-width: 1px;
+  border-top-width: 1px;
+  z-index: 100;
+}
+.ui-controlbar-left {
+  left: 0px;
+  float: left;
+}
+.ui-controlbar-right {
+  right: 0px;
+  float: right;
+}
+.ui-btn-ani-endposition {
+  -webkit-transition-property: left;
+  -webkit-transition: all 0.3s ease-in-out;
+}
+.ui-btn-ani-verticalendposition {
+  -webkit-transition-property: top;
+  -webkit-transition: all 0.3s ease-in-out;
+}
+/*************************************************************************** 
+                    ControlBar
+***************************************************************************/
+/* corner rounding classes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-corner-tl {
+  -moz-border-radius-topleft: 0.6em;
+  -webkit-border-top-left-radius: 0.6em;
+  border-top-left-radius: 0.6em;
+}
+.ui-corner-tr {
+  -moz-border-radius-topright: 0.6em;
+  -webkit-border-top-right-radius: 0.6em;
+  border-top-right-radius: 0.6em;
+}
+.ui-corner-bl {
+  -moz-border-radius-bottomleft: 0.6em;
+  -webkit-border-bottom-left-radius: 0.6em;
+  border-bottom-left-radius: 0.6em;
+}
+.ui-corner-br {
+  -moz-border-radius-bottomright: 0.6em;
+  -webkit-border-bottom-right-radius: 0.6em;
+  border-bottom-right-radius: 0.6em;
+}
+.ui-corner-top {
+  -moz-border-radius-topleft: 0.6em;
+  -webkit-border-top-left-radius: 0.6em;
+  border-top-left-radius: 0.6em;
+  -moz-border-radius-topright: 0.6em;
+  -webkit-border-top-right-radius: 0.6em;
+  border-top-right-radius: 0.6em;
+}
+.ui-corner-bottom {
+  -moz-border-radius-bottomleft: 0.6em;
+  -webkit-border-bottom-left-radius: 0.6em;
+  border-bottom-left-radius: 0.6em;
+  -moz-border-radius-bottomright: 0.6em;
+  -webkit-border-bottom-right-radius: 0.6em;
+  border-bottom-right-radius: 0.6em;
+}
+.ui-corner-right {
+  -moz-border-radius-topright: 0.6em;
+  -webkit-border-top-right-radius: 0.6em;
+  border-top-right-radius: 0.6em;
+  -moz-border-radius-bottomright: 0.6em;
+  -webkit-border-bottom-right-radius: 0.6em;
+  border-bottom-right-radius: 0.6em;
+}
+.ui-corner-left {
+  -moz-border-radius-topleft: 0.6em;
+  -webkit-border-top-left-radius: 0.6em;
+  border-top-left-radius: 0.6em;
+  -moz-border-radius-bottomleft: 0.6em;
+  -webkit-border-bottom-left-radius: 0.6em;
+  border-bottom-left-radius: 0.6em;
+}
+.ui-corner-none {
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  bordert-radius: 0;
+}
+/* Interaction cues
+-----------------------------------------------------------------------------------------------------------*/
+.ui-disabled {
+  opacity: .3;
+}
+.ui-disabled, .ui-disabled a {
+  cursor: default;
+}
+/* Icons
+-----------------------------------------------------------------------------------------------------------*/
+.ui-icon {
+  /* global-icon */
+
+  background-image: url(images/icons-18-white.png);
+  background-repeat: no-repeat;
+}
+.ui-image-search {
+  background-image: url(images/00_search_icon.png);
+  background-repeat: no-repeat;
+  -moz-background-size: 1.1666666666666665rem 1.1666666666666665rem;
+  -o-background-size: 1.1666666666666665rem 1.1666666666666665rem;
+  -webkit-background-size: 1.1666666666666665rem 1.1666666666666665rem;
+  background-size: 1.1666666666666665rem 1.1666666666666665rem;
+}
+.ui-icon-deleteSearch {
+  background-image: url(images/00_field_btn_Clear.png);
+  background-repeat: no-repeat;
+  -moz-background-size: 1.0555555555555556rem 1.0555555555555556rem;
+  -o-background-size: 1.0555555555555556rem 1.0555555555555556rem;
+  -webkit-background-size: 1.0555555555555556rem 1.0555555555555556rem;
+  background-size: 1.0555555555555556rem 1.0555555555555556rem;
+}
+/* Alt icon color
+-----------------------------------------------------------------------------------------------------------*/
+.ui-icon-alt {
+  background: #fff;
+  background: rgba(255, 255, 255, 0.3);
+  background-image: url(images/icons-18-black.png);
+  background-repeat: no-repeat;
+}
+/* HD/"retina" sprite
+-----------------------------------------------------------------------------------------------------------*/
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
+       only screen and (min--moz-device-pixel-ratio: 1.5),
+       only screen and (min-resolution: 240dpi) {
+  .ui-icon-plus,
+  .ui-icon-minus,
+  .ui-icon-delete,
+  .ui-icon-arrow-r,
+  .ui-icon-arrow-l,
+  .ui-icon-arrow-u,
+  .ui-icon-arrow-d,
+  .ui-icon-check,
+  .ui-icon-gear,
+  .ui-icon-refresh,
+  .ui-icon-forward,
+  .ui-icon-back,
+  .ui-icon-grid,
+  .ui-icon-star,
+  .ui-icon-alert,
+  .ui-icon-info,
+  .ui-icon-home,
+  .ui-icon-search,
+  .ui-icon-searchfield:after,
+  .ui-icon-checkbox-off,
+  .ui-icon-checkbox-on,
+  .ui-icon-radio-off,
+  .ui-icon-radio-on {
+    background-image: url(images/icons-36-white.png);
+    -moz-background-size: 776px 18px;
+    -o-background-size: 776px 18px;
+    -webkit-background-size: 776px 18px;
+    background-size: 776px 18px;
+  }
+  .ui-icon-alt {
+    background-image: url(images/icons-36-black.png);
+  }
+}
+/* plus minus */
+.ui-icon-plus {
+  background-position: 0 50%;
+}
+.ui-icon-minus {
+  /*background-position: 	-36px 50%;*/
+  /* wongi_1018: Same name make problem. Later, origianl icons will be removed.  */
+
+}
+/* arrows */
+.ui-icon-arrow-r {
+  background-position: -108px 50%;
+}
+.ui-icon-arrow-l {
+  background-position: -144px 50%;
+}
+.ui-icon-arrow-u {
+  background-position: -180px 50%;
+}
+.ui-icon-arrow-d {
+  background-position: -216px 50%;
+}
+/* misc */
+.ui-icon-check {
+  background-position: -252px 50%;
+}
+.ui-icon-gear {
+  background-position: -288px 50%;
+}
+.ui-icon-refresh {
+  background-position: -324px 50%;
+}
+.ui-icon-forward {
+  background-position: -360px 50%;
+}
+.ui-icon-back {
+  background-position: -396px 50%;
+}
+.ui-icon-grid {
+  background-position: -432px 50%;
+}
+.ui-icon-star {
+  background-position: -468px 50%;
+}
+.ui-icon-alert {
+  background-position: -504px 50%;
+}
+.ui-icon-info {
+  background-position: -540px 50%;
+}
+.ui-icon-home {
+  background-position: -576px 50%;
+}
+/* checks,radios */
+.ui-checkbox .ui-icon {
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+}
+.ui-icon-radio-off {
+  background-color: transparent;
+}
+.ui-checkbox-on .ui-icon, .ui-radio-on .ui-icon {
+  /*Do not need bg color for icons..
+	background-color: #4596ce;*/
+  /* NOTE: this hex should match the active state color. It's repeated here for cascade */
+
+}
+/* loading icon */
+.ui-icon-loading {
+  background-image: url(images/ajax-loader.png);
+  width: 40px;
+  height: 40px;
+  -moz-border-radius: 20px;
+  -webkit-border-radius: 20px;
+  bordert-radius: 20px;
+}
+/* Add ctrl bar *//* TIZEN Default Footer */
+.ui-icon-ctrlbar-account_sign-up,
+.ui-icon-ctrlbar-accounts,
+.ui-icon-ctrlbar-add-to-bookmarks,
+.ui-icon-ctrlbar-add-to-calendar,
+.ui-icon-ctrlbar-alarm,
+.ui-icon-ctrlbar-albums,
+.ui-icon-ctrlbar-area,
+.ui-icon-ctrlbar-artist,
+.ui-icon-ctrlbar-attach,
+.ui-icon-ctrlbar-back,
+.ui-icon-ctrlbar-backward,
+.ui-icon-ctrlbar-bluetooth_preview,
+.ui-icon-ctrlbar-bookmarks,
+.ui-icon-ctrlbar-brightness,
+.ui-icon-ctrlbar-calendar,
+.ui-icon-ctrlbar-call,
+.ui-icon-ctrlbar-camera,
+.ui-icon-ctrlbar-category,
+.ui-icon-ctrlbar-change_group,
+.ui-icon-ctrlbar-chat,
+.ui-icon-ctrlbar-check,
+.ui-icon-ctrlbar-compose,
+.ui-icon-ctrlbar-composer,
+.ui-icon-ctrlbar-contacts,
+.ui-icon-ctrlbar-copy,
+.ui-icon-ctrlbar-create,
+.ui-icon-ctrlbar-create_folder,
+.ui-icon-ctrlbar-delete,
+.ui-icon-ctrlbar-dialer,
+.ui-icon-ctrlbar-DM,
+.ui-icon-ctrlbar-edit,
+.ui-icon-ctrlbar-editor,
+.ui-icon-ctrlbar-eng_eng_result,
+.ui-icon-ctrlbar-exchangs_register,
+.ui-icon-ctrlbar-Externalstorage,
+.ui-icon-ctrlbar-favorite,
+.ui-icon-ctrlbar-features,
+.ui-icon-ctrlbar-forward,
+.ui-icon-ctrlbar-genre,
+.ui-icon-ctrlbar-help,
+.ui-icon-ctrlbar-home,
+.ui-icon-ctrlbar-info,
+.ui-icon-ctrlbar-length,
+.ui-icon-ctrlbar-list_by,
+.ui-icon-ctrlbar-logs,
+.ui-icon-ctrlbar-map,
+.ui-icon-ctrlbar-memolist,
+.ui-icon-ctrlbar-MemoryCard,
+.ui-icon-ctrlbar-mention,
+.ui-icon-ctrlbar-menu,
+.ui-icon-ctrlbar-more,
+.ui-icon-ctrlbar-move,
+.ui-icon-ctrlbar-multiview,
+.ui-icon-ctrlbar-multiview_02,
+.ui-icon-ctrlbar-multiview_03,
+.ui-icon-ctrlbar-multiview_04,
+.ui-icon-ctrlbar-multiview_05,
+.ui-icon-ctrlbar-multiview_06,
+.ui-icon-ctrlbar-multiview_07,
+.ui-icon-ctrlbar-multiview_08,
+.ui-icon-ctrlbar-multiview_09,
+.ui-icon-ctrlbar-music_albums,
+.ui-icon-ctrlbar-pause,
+.ui-icon-ctrlbar-phone,
+.ui-icon-ctrlbar-Play,
+.ui-icon-ctrlbar-playlists,
+.ui-icon-ctrlbar-receive,
+.ui-icon-ctrlbar-reply,
+.ui-icon-ctrlbar-save,
+.ui-icon-ctrlbar-save_to_calender,
+.ui-icon-ctrlbar-scrap,
+.ui-icon-ctrlbar-search,
+.ui-icon-ctrlbar-send,
+.ui-icon-ctrlbar-set_as,
+.ui-icon-ctrlbar-settings,
+.ui-icon-ctrlbar-setup_wizard_previous,
+.ui-icon-ctrlbar-share,
+.ui-icon-ctrlbar-songs,
+.ui-icon-ctrlbar-stop_watch,
+.ui-icon-ctrlbar-store,
+.ui-icon-ctrlbar-synchronise_start_sync,
+.ui-icon-ctrlbar-synchronise_stop_01,
+.ui-icon-ctrlbar-synchronise_stop_02,
+.ui-icon-ctrlbar-synchronise_stop_03,
+.ui-icon-ctrlbar-view_result,
+.ui-icon-ctrlbar-tag,
+.ui-icon-ctrlbar-temp,
+.ui-icon-ctrlbar-timeline,
+.ui-icon-ctrlbar-timer,
+.ui-icon-ctrlbar-today,
+.ui-icon-ctrlbar-top,
+.ui-icon-ctrlbar-trim,
+.ui-icon-ctrlbar-TTS,
+.ui-icon-ctrlbar-update,
+.ui-icon-ctrlbar-upload_export,
+.ui-icon-ctrlbar-volume,
+.ui-icon-ctrlbar-world_clock,
+.ui-icon-ctrlbar-year,
+.ui-icon-ctrlbar-add_tag,
+.ui-icon-ctrlbar-add_to_contact,
+.ui-icon-ctrlbar-close,
+.ui-icon-ctrlbar-groups,
+.ui-icon-ctrlbar-year,
+.ui-icon-ctrlbar-unread_message,
+.ui-icon-ctrlbar-weight.ui-icon-ctrlbar-3Dview {
+  background-color: transparent;
+  -moz-border-radius: 0px;
+  -webkit-border-radius: 0px;
+  border-radius: 0px;
+  background-size: 100% 100%;
+  -moz-box-shadow: 0px 0px 0 rgba(255, 255, 255, 0.4);
+  -webkit-box-shadow: 0px 0px 0 rgba(255, 255, 255, 0.4);
+  box-shadow: 0px 0px 0 rgba(255, 255, 255, 0.4);
+}
+.ui-icon-ctrlbar-account_sign-up {
+  background-image: url(images/controlbar/01_controlbar_icon_account_sign-up.png);
+}
+.ui-icon-ctrlbar-accounts {
+  background-image: url(images/controlbar/01_controlbar_icon_accounts.png);
+}
+.ui-icon-ctrlbar-add-to-bookmarks {
+  background-image: url(images/controlbar/01_controlbar_icon_add-to-bookmarks.png);
+}
+.ui-icon-ctrlbar-add-to-calendar {
+  background-image: url(images/controlbar/01_controlbar_icon_add-to-calendar.png);
+}
+.ui-icon-ctrlbar-alarm {
+  background-image: url(images/controlbar/01_controlbar_icon_alarm.png);
+}
+.ui-icon-ctrlbar-albums {
+  background-image: url(images/controlbar/01_controlbar_icon_albums.png);
+}
+.ui-icon-ctrlbar-area {
+  background-image: url(images/controlbar/01_controlbar_icon_area.png);
+}
+.ui-icon-ctrlbar-artist {
+  background-image: url(images/controlbar/01_controlbar_icon_artist.png);
+}
+.ui-icon-ctrlbar-attach {
+  background-image: url(images/controlbar/01_controlbar_icon_attach.png);
+}
+.ui-icon-ctrlbar-back {
+  background-image: url(images/controlbar/01_controlbar_icon_back.png);
+}
+.ui-icon-ctrlbar-backward {
+  background-image: url(images/controlbar/01_controlbar_icon_backward.png);
+}
+.ui-icon-ctrlbar-bluetooth_preview {
+  background-image: url(images/controlbar/01_controlbar_icon_bluetooth_preview.png);
+}
+.ui-icon-ctrlbar-bookmarks {
+  background-image: url(images/controlbar/01_controlbar_icon_bookmarks.png);
+}
+.ui-icon-ctrlbar-brightness {
+  background-image: url(images/controlbar/01_controlbar_icon_brightness.png);
+}
+.ui-icon-ctrlbar-calendar {
+  background-image: url(images/controlbar/01_controlbar_icon_calendar.png);
+}
+.ui-icon-ctrlbar-call {
+  background-image: url(images/controlbar/01_controlbar_icon_call.png);
+}
+.ui-icon-ctrlbar-camera {
+  background-image: url(images/controlbar/01_controlbar_icon_camera.png);
+}
+.ui-icon-ctrlbar-category {
+  background-image: url(images/controlbar/01_controlbar_icon_category.png);
+}
+.ui-icon-ctrlbar-change_group {
+  background-image: url(images/controlbar/01_controlbar_icon_change_group.png);
+}
+.ui-icon-ctrlbar-chat {
+  background-image: url(images/controlbar/01_controlbar_icon_chat.png);
+}
+.ui-icon-ctrlbar-check {
+  background-image: url(images/controlbar/01_controlbar_icon_check.png);
+}
+.ui-icon-ctrlbar-compose {
+  background-image: url(images/controlbar/01_controlbar_icon_compose.png);
+}
+.ui-icon-ctrlbar-composer {
+  background-image: url(images/controlbar/01_controlbar_icon_composer.png);
+}
+.ui-icon-ctrlbar-contacts {
+  background-image: url(images/controlbar/01_controlbar_icon_contacts.png);
+}
+.ui-icon-ctrlbar-copy {
+  background-image: url(images/controlbar/01_controlbar_icon_copy.png);
+}
+.ui-icon-ctrlbar-create {
+  background-image: url(images/controlbar/01_controlbar_icon_create.png);
+}
+.ui-icon-ctrlbar-create_folder {
+  background-image: url(images/controlbar/01_controlbar_icon_create_folder.png);
+}
+.ui-icon-ctrlbar-delete {
+  background-image: url(images/controlbar/01_controlbar_icon_delete.png);
+}
+.ui-icon-ctrlbar-dialer {
+  background-image: url(images/controlbar/01_controlbar_icon_dialer.png);
+}
+.ui-icon-ctrlbar-DM {
+  background-image: url(images/controlbar/01_controlbar_icon_DM.png);
+}
+.ui-icon-ctrlbar-edit {
+  background-image: url(images/controlbar/01_controlbar_icon_edit.png);
+}
+.ui-icon-ctrlbar-editor {
+  background-image: url(images/controlbar/01_controlbar_icon_editor.png);
+}
+.ui-icon-ctrlbar-eng_eng_result {
+  background-image: url(images/controlbar/01_controlbar_icon_eng_eng_result.png);
+}
+.ui-icon-ctrlbar-exchangs_register {
+  background-image: url(images/controlbar/01_controlbar_icon_exchangs_register.png);
+}
+.ui-icon-ctrlbar-Externalstorage {
+  background-image: url(images/controlbar/01_controlbar_icon_Externalstorage.png);
+}
+.ui-icon-ctrlbar-favorite {
+  background-image: url(images/controlbar/01_controlbar_icon_favorite.png);
+}
+.ui-icon-ctrlbar-features {
+  background-image: url(images/controlbar/01_controlbar_icon_features.png);
+}
+.ui-icon-ctrlbar-forward {
+  background-image: url(images/controlbar/01_controlbar_icon_forward.png);
+}
+.ui-icon-ctrlbar-genre {
+  background-image: url(images/controlbar/01_controlbar_icon_genre.png);
+}
+.ui-icon-ctrlbar-help {
+  background-image: url(images/controlbar/01_controlbar_icon_help.png);
+}
+.ui-icon-ctrlbar-home {
+  background-image: url(images/controlbar/01_controlbar_icon_home.png);
+}
+.ui-icon-ctrlbar-info {
+  background-image: url(images/controlbar/01_controlbar_icon_info.png);
+}
+.ui-icon-ctrlbar-length {
+  background-image: url(images/controlbar/01_controlbar_icon_length.png);
+}
+.ui-icon-ctrlbar-list_by {
+  background-image: url(images/controlbar/01_controlbar_icon_list_by.png);
+}
+.ui-icon-ctrlbar-logs {
+  background-image: url(images/controlbar/01_controlbar_icon_logs.png);
+}
+.ui-icon-ctrlbar-map {
+  background-image: url(images/controlbar/01_controlbar_icon_map.png);
+}
+.ui-icon-ctrlbar-memolist {
+  background-image: url(images/controlbar/01_controlbar_icon_memolist.png);
+}
+.ui-icon-ctrlbar-MemoryCard {
+  background-image: url(images/controlbar/01_controlbar_icon_MemoryCard.png);
+}
+.ui-icon-ctrlbar-mention {
+  background-image: url(images/controlbar/01_controlbar_icon_mention.png);
+}
+.ui-icon-ctrlbar-menu {
+  background-image: url(images/controlbar/01_controlbar_icon_menu.png);
+}
+.ui-icon-ctrlbar-more {
+  background-image: url(images/controlbar/01_controlbar_icon_more.png);
+}
+.ui-icon-ctrlbar-move {
+  background-image: url(images/controlbar/01_controlbar_icon_move.png);
+}
+.ui-icon-ctrlbar-multiview {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview.png);
+}
+.ui-icon-ctrlbar-multiview_02 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_02.png);
+}
+.ui-icon-ctrlbar-multiview_03 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_03.png);
+}
+.ui-icon-ctrlbar-multiview_04 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_04.png);
+}
+.ui-icon-ctrlbar-multiview_05 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_05.png);
+}
+.ui-icon-ctrlbar-multiview_06 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_06.png);
+}
+.ui-icon-ctrlbar-multiview_07 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_07.png);
+}
+.ui-icon-ctrlbar-multiview_08 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_08.png);
+}
+.ui-icon-ctrlbar-multiview_09 {
+  background-image: url(images/controlbar/01_controlbar_icon_multiview_09.png);
+}
+.ui-icon-ctrlbar-music_albums {
+  background-image: url(images/controlbar/01_controlbar_icon_music_albums.png);
+}
+.ui-icon-ctrlbar-pause {
+  background-image: url(images/controlbar/01_controlbar_icon_pause.png);
+}
+.ui-icon-ctrlbar-phone {
+  background-image: url(images/controlbar/01_controlbar_icon_phone.png);
+}
+.ui-icon-ctrlbar-Play {
+  background-image: url(images/controlbar/01_controlbar_icon_Play.png);
+}
+.ui-icon-ctrlbar-playlists {
+  background-image: url(images/controlbar/01_controlbar_icon_playlists.png);
+}
+.ui-icon-ctrlbar-receive {
+  background-image: url(images/controlbar/01_controlbar_icon_receive.png);
+}
+.ui-icon-ctrlbar-reply {
+  background-image: url(images/controlbar/01_controlbar_icon_reply.png);
+}
+.ui-icon-ctrlbar-save {
+  background-image: url(images/controlbar/01_controlbar_icon_save.png);
+}
+.ui-icon-ctrlbar-save_to_calender {
+  background-image: url(images/controlbar/01_controlbar_icon_save_to_calender.png);
+}
+.ui-icon-ctrlbar-scrap {
+  background-image: url(images/controlbar/01_controlbar_icon_scrap.png);
+}
+.ui-icon-ctrlbar-search {
+  background-image: url(images/controlbar/01_controlbar_icon_search.png);
+}
+.ui-icon-ctrlbar-send {
+  background-image: url(images/controlbar/01_controlbar_icon_send.png);
+}
+.ui-icon-ctrlbar-set_as {
+  background-image: url(images/controlbar/01_controlbar_icon_set_as.png);
+}
+.ui-icon-ctrlbar-settings {
+  background-image: url(images/controlbar/01_controlbar_icon_settings.png);
+}
+.ui-icon-ctrlbar-setup_wizard_previous {
+  background-image: url(images/controlbar/01_controlbar_icon_setup_wizard_previous.png);
+}
+.ui-icon-ctrlbar-share {
+  background-image: url(images/controlbar/01_controlbar_icon_share.png);
+}
+.ui-icon-ctrlbar-songs {
+  background-image: url(images/controlbar/01_controlbar_icon_songs.png);
+}
+.ui-icon-ctrlbar-stop_watch {
+  background-image: url(images/controlbar/01_controlbar_icon_stop_watch.png);
+}
+.ui-icon-ctrlbar-store {
+  background-image: url(images/controlbar/01_controlbar_icon_store.png);
+}
+.ui-icon-ctrlbar-synchronise_start_sync {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_start_sync.png);
+}
+.ui-icon-ctrlbar-synchronise_stop_01 {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_stop_01.png);
+}
+.ui-icon-ctrlbar-synchronise_stop_02 {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_stop_02.png);
+}
+.ui-icon-ctrlbar-synchronise_stop_03 {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_stop_03.png);
+}
+.ui-icon-ctrlbar-synchronise_view_result {
+  background-image: url(images/controlbar/01_controlbar_icon_synchronise_view_result.png);
+}
+.ui-icon-ctrlbar-tag {
+  background-image: url(images/controlbar/01_controlbar_icon_tag.png);
+}
+.ui-icon-ctrlbar-temp {
+  background-image: url(images/controlbar/01_controlbar_icon_temp.png);
+}
+.ui-icon-ctrlbar-timeline {
+  background-image: url(images/controlbar/01_controlbar_icon_timeline.png);
+}
+.ui-icon-ctrlbar-timer {
+  background-image: url(images/controlbar/01_controlbar_icon_timer.png);
+}
+.ui-icon-ctrlbar-today {
+  background-image: url(images/controlbar/01_controlbar_icon_today.png);
+}
+.ui-icon-ctrlbar-top {
+  background-image: url(images/controlbar/01_controlbar_icon_top.png);
+}
+.ui-icon-ctrlbar-trim {
+  background-image: url(images/controlbar/01_controlbar_icon_trim.png);
+}
+.ui-icon-ctrlbar-TTS {
+  background-image: url(images/controlbar/01_controlbar_icon_TTS.png);
+}
+.ui-icon-ctrlbar-update {
+  background-image: url(images/controlbar/01_controlbar_icon_update.png);
+}
+.ui-icon-ctrlbar-upload_export {
+  background-image: url(images/controlbar/01_controlbar_icon_upload_export.png);
+}
+.ui-icon-ctrlbar-volume {
+  background-image: url(images/controlbar/01_controlbar_icon_volume.png);
+}
+.ui-icon-ctrlbar-world_clock {
+  background-image: url(images/controlbar/01_controlbar_icon_world_clock.png);
+}
+.ui-icon-ctrlbar-year {
+  background-image: url(images/controlbar/01_controlbar_icon_year.png);
+}
+.ui-icon-ctrlbar-add_tag {
+  background-image: url(images/controlbar/01_controlbar_icon_add_tag.png);
+}
+.ui-icon-ctrlbar-add_to_contact {
+  background-image: url(images/controlbar/01_controlbar_icon_add_to_contact.png);
+}
+.ui-icon-ctrlbar-close {
+  background-image: url(images/controlbar/01_controlbar_icon_close.png);
+}
+.ui-icon-ctrlbar-groups {
+  background-image: url(images/controlbar/01_controlbar_icon_groups.png);
+}
+.ui-icon-ctrlbar-unread_message {
+  background-image: url(images/controlbar/01_controlbar_icon_unread_message.png);
+}
+.ui-icon-ctrlbar-weight {
+  background-image: url(images/controlbar/01_controlbar_icon_weight.png);
+}
+.ui-icon-ctrlbar-3Dview {
+  background-image: url(images/controlbar/01_controlbar_icon_3Dview.png);
+}
+/* ---------------------------------------------- */
+/* Button corner classes
+-----------------------------------------------------------------------------------------------------------*/
+.ui-btn-corner-tl {
+  -moz-border-radius-topleft: 1em;
+  -webkit-border-top-left-radius: 1em;
+  border-top-left-radius: 1em;
+}
+.ui-btn-corner-tr {
+  -moz-border-radius-topright: 1em;
+  -webkit-border-top-right-radius: 1em;
+  border-top-right-radius: 1em;
+}
+.ui-btn-corner-bl {
+  -moz-border-radius-bottomleft: 1em;
+  -webkit-border-bottom-left-radius: 1em;
+  border-bottom-left-radius: 1em;
+}
+.ui-btn-corner-br {
+  -moz-border-radius-bottomright: 1em;
+  -webkit-border-bottom-right-radius: 1em;
+  border-bottom-right-radius: 1em;
+}
+.ui-btn-corner-top {
+  -moz-border-radius-topleft: 1em;
+  -webkit-border-top-left-radius: 1em;
+  border-top-left-radius: 1em;
+  -moz-border-radius-topright: 1em;
+  -webkit-border-top-right-radius: 1em;
+  border-top-right-radius: 1em;
+}
+.ui-btn-corner-bottom {
+  -moz-border-radius-bottomleft: 1em;
+  -webkit-border-bottom-left-radius: 1em;
+  border-bottom-left-radius: 1em;
+  -moz-border-radius-bottomright: 1em;
+  -webkit-border-bottom-right-radius: 1em;
+  border-bottom-right-radius: 1em;
+}
+.ui-btn-corner-right {
+  -moz-border-radius-topright: 1em;
+  -webkit-border-top-right-radius: 1em;
+  border-top-right-radius: 1em;
+  -moz-border-radius-bottomright: 1em;
+  -webkit-border-bottom-right-radius: 1em;
+  border-bottom-right-radius: 1em;
+}
+.ui-btn-corner-left {
+  -moz-border-radius-topleft: 1em;
+  -webkit-border-top-left-radius: 1em;
+  border-top-left-radius: 1em;
+  -moz-border-radius-bottomleft: 1em;
+  -webkit-border-bottom-left-radius: 1em;
+  border-bottom-left-radius: 1em;
+}
+.ui-btn-corner-all {
+  -moz-border-radius: 0.2em;
+  -webkit-border-radius: 0.2em;
+  bordert-radius: 0.2em;
+}
+/* radius clip workaround for cleaning up corner trapping */
+.ui-corner-tl,
+.ui-corner-tr,
+.ui-corner-bl,
+.ui-corner-br,
+.ui-corner-top,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-left,
+.ui-corner-all,
+.ui-btn-corner-tl,
+.ui-btn-corner-tr,
+.ui-btn-corner-bl,
+.ui-btn-corner-br,
+.ui-btn-corner-top,
+.ui-btn-corner-bottom,
+.ui-btn-corner-right,
+.ui-btn-corner-left,
+.ui-btn-corner-all {
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+}
+/* Overlay / modal
+-----------------------------------------------------------------------------------------------------------*/
+.ui-overlay {
+  background: #666;
+  opacity: .5;
+  filter: alpha(opacity=50);
+  position: absolute;
+  width: 100%;
+  height: 100%;
+}
+/* Focus state - set here for specificity
+-----------------------------------------------------------------------------------------------------------*/
+.ui-focus {
+  /* global-active-background-color */
+
+  outline-color: #008cd2;
+}
+/* unset box shadow in browsers that don't do it right
+-----------------------------------------------------------------------------------------------------------*/
+.ui-mobile-nosupport-boxshadow * {
+  -moz-box-shadow: none !important;
+  -webkit-box-shadow: none !important;
+  box-shadow: none !important;
+}
+/* ...and bring back focus */
+.ui-mobile-nosupport-boxshadow .ui-focus {
+  outline-width: 2px;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+/*** less definitions ***/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/************************/
+/* some unsets - more probably needed */
+.ui-mobile, .ui-mobile body {
+  height: 100%;
+  font-size: 36px;
+}
+.ui-mobile fieldset, .ui-page {
+  padding: 0;
+  margin: 0;
+}
+.ui-mobile a img, .ui-mobile fieldset {
+  border: 0;
+}
+/* responsive page widths */
+.ui-mobile-viewport {
+  margin: 0;
+  overflow-x: hidden;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+/* "page" containers - full-screen views, one should always be in view post-pageload */
+.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page {
+  top: 0;
+  left: 0;
+  width: 100%;
+  min-height: 100%;
+  position: absolute;
+  display: none;
+  border: 0;
+}
+.ui-mobile .ui-page-active {
+  display: block;
+  overflow: visible;
+}
+/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */
+.ui-page {
+  outline: none;
+}
+/*orientations from js are available */
+@media screen and (orientation: portrait) {
+  .ui-mobile, .ui-mobile .ui-page {
+    min-height: 420px;
+    background: black;
+  }
+}
+@media screen and (orientation: landscape) {
+  .ui-mobile, .ui-mobile .ui-page {
+    min-height: 300px;
+    background: black;
+  }
+}
+/* native overflow scrolling */
+.ui-page.ui-mobile-touch-overflow, .ui-mobile-touch-overflow.ui-native-fixed .ui-content {
+  overflow: auto;
+  height: 100%;
+  -webkit-overflow-scrolling: touch;
+  -moz-overflow-scrolling: touch;
+  -o-overflow-scrolling: touch;
+  -ms-overflow-scrolling: touch;
+  overflow-scrolling: touch;
+}
+.ui-page.ui-mobile-touch-overflow, .ui-page.ui-mobile-touch-overflow * {
+  /* some level of transform keeps elements from blinking out of visibility on iOS */
+
+  -webkit-transform: rotatey(0);
+}
+.ui-page.ui-mobile-pre-transition {
+  display: block;
+}
+/* loading screen */
+.ui-loading .ui-mobile-viewport {
+  overflow: hidden !important;
+}
+.ui-loading .ui-loader {
+  display: block;
+}
+.ui-loading .ui-page {
+  overflow: hidden;
+}
+.ui-loader {
+  display: none;
+  position: absolute;
+  opacity: .85;
+  z-index: 100;
+  left: 50%;
+  width: 200px;
+  margin-left: -130px;
+  margin-top: -35px;
+  padding: 10px 30px;
+}
+.ui-loader h1 {
+  font-size: 0.8888888888888888rem;
+  text-align: center;
+}
+.ui-loader .ui-icon {
+  position: static;
+  display: block;
+  opacity: .9;
+  margin: 0 auto;
+  width: 35px;
+  height: 35px;
+  background-color: transparent;
+}
+/*fouc*/
+.ui-mobile-rendering > * {
+  visibility: hidden;
+}
+/*headers, content panels*/
+.ui-bar, .ui-body {
+  position: relative;
+  padding: .4em 15px;
+  overflow: hidden;
+  display: block;
+  clear: both;
+}
+.ui-bar {
+  font-size: 16px;
+  margin: 0;
+}
+.ui-bar h1,
+.ui-bar h2,
+.ui-bar h3,
+.ui-bar h4,
+.ui-bar h5,
+.ui-bar h6 {
+  margin: 0;
+  padding: 0;
+  font-size: 16px;
+  display: inline-block;
+}
+.ui-header, .ui-footer {
+  display: block;
+}
+.ui-page .ui-header, .ui-page .ui-footer {
+  position: fixed;
+  /*position: relative;*/
+  z-index: 1000;
+}
+/* Option header reposition : Jinhyuk */
+.ui-header .ui-btn-left {
+  position: absolute;
+  left: 10px;
+  top: .4em;
+}
+.ui-header .ui-btn-right {
+  position: absolute;
+  right: 10px;
+  top: .4em;
+}
+.ui-header .ui-title, .ui-footer .ui-title {
+  min-height: 1.1em;
+  text-align: center;
+  font-size: 16px;
+  display: block;
+  margin: .6em 90px .8em;
+  padding: 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  outline: 0 !important;
+}
+/*content area*/
+.ui-content {
+  border-width: 0;
+  overflow: visible;
+  overflow-x: hidden;
+  padding: 15px;
+}
+.ui-page-fullscreen .ui-content {
+  padding: 0;
+}
+/* native fixed headers and footers */
+.ui-mobile-touch-overflow.ui-page.ui-native-fixed, .ui-mobile-touch-overflow.ui-page.ui-native-fullscreen {
+  overflow: visible;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-header, .ui-mobile-touch-overflow.ui-native-fixed .ui-footer {
+  position: fixed;
+  left: 0;
+  right: 0;
+  top: 0;
+  z-index: 200;
+}
+.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer {
+  top: auto;
+  bottom: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content {
+  padding-top: 2.5em;
+  padding-bottom: 3em;
+  top: 0;
+  bottom: 0;
+  height: auto;
+  position: absolute;
+}
+.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content {
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header, .ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer {
+  opacity: .9;
+}
+.ui-native-bars-hidden {
+  display: none;
+}
+/* icons sizing */
+.ui-icon {
+  width: 18px;
+  height: 18px;
+}
+/* fullscreen class on ui-content div */
+.ui-fullscreen img {
+  max-width: 100%;
+}
+/* non-js content hiding */
+.ui-nojs {
+  position: absolute;
+  left: -9999px;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.spin  {
+	-webkit-transform: rotate(360deg);
+	-webkit-animation-name: spin;
+	-webkit-animation-duration: 1s;
+	-webkit-animation-iteration-count:  infinite;
+	-webkit-animation-timing-function: linear;
+}
+@-webkit-keyframes spin {
+	from {-webkit-transform: rotate(0deg);}
+  	to {-webkit-transform: rotate(360deg);}
+}
+
+/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/
+Built by David Kaneda and maintained by Jonathan Stark.
+*/
+.in, .out {
+	-webkit-animation-timing-function: ease-in-out;
+	-webkit-animation-duration: 350ms;
+}
+
+
+.slide.out {
+	-webkit-transform: translateX(-100%);
+	-webkit-animation-name: slideouttoleft;
+}
+
+.slide.in {
+	-webkit-transform: translateX(0);
+	-webkit-animation-name: slideinfromright;
+}
+
+.slide.out.reverse {
+	-webkit-transform: translateX(100%);
+	-webkit-animation-name: slideouttoright;
+}
+
+.slide.in.reverse {
+	-webkit-transform: translateX(0);
+	-webkit-animation-name: slideinfromleft;
+}
+
+.slideup.out {
+	-webkit-animation-name: dontmove;
+	z-index: 0;
+}
+
+.slideup.in {
+	-webkit-transform: translateY(0);
+	-webkit-animation-name: slideinfrombottom;
+	z-index: 10;
+}
+
+.slideup.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.slideup.out.reverse {
+	-webkit-transform: translateY(100%);
+	z-index: 10;
+	-webkit-animation-name: slideouttobottom;
+}
+
+.slidedown.out {
+	-webkit-animation-name: dontmove;
+	z-index: 0;
+}
+
+.slidedown.in {
+	-webkit-transform: translateY(0);
+	-webkit-animation-name: slideinfromtop;
+	z-index: 10;
+}
+
+.slidedown.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.slidedown.out.reverse {
+	-webkit-transform: translateY(-100%);
+	z-index: 10;
+	-webkit-animation-name: slideouttotop;
+}
+
+@-webkit-keyframes slideinfromright {
+    from { -webkit-transform: translateX(100%); }
+    to { -webkit-transform: translateX(0); }
+}
+
+@-webkit-keyframes slideinfromleft {
+    from { -webkit-transform: translateX(-100%); }
+    to { -webkit-transform: translateX(0); }
+}
+
+@-webkit-keyframes slideouttoleft {
+    from { -webkit-transform: translateX(0); }
+    to { -webkit-transform: translateX(-100%); }
+}
+
+@-webkit-keyframes slideouttoright {
+    from { -webkit-transform: translateX(0); }
+    to { -webkit-transform: translateX(100%); }
+}
+
+@-webkit-keyframes slideinfromtop {
+    from { -webkit-transform: translateY(-100%); }
+    to { -webkit-transform: translateY(0); }
+}
+
+@-webkit-keyframes slideinfrombottom {
+    from { -webkit-transform: translateY(100%); }
+    to { -webkit-transform: translateY(0); }
+}
+
+@-webkit-keyframes slideouttobottom {
+    from { -webkit-transform: translateY(0); }
+    to { -webkit-transform: translateY(100%); }
+}
+
+@-webkit-keyframes slideouttotop {
+    from { -webkit-transform: translateY(0); }
+    to { -webkit-transform: translateY(-100%); }
+}
+@-webkit-keyframes fadein {
+    from { opacity: 0; }
+    to { opacity: 1; }
+}
+
+@-webkit-keyframes fadeout {
+    from { opacity: 1; }
+    to { opacity: 0; }
+}
+
+.fade.out {
+	z-index: 0;
+	-webkit-animation-name: fadeout;
+}
+
+.fade.in {
+	opacity: 1;
+	z-index: 10;
+	-webkit-animation-name: fadein;
+}
+
+/* The properties in this rule are only necessary for the 'flip' transition.
+ * We need specify the perspective to create a projection matrix. This will add
+ * some depth as the element flips. The depth number represents the distance of
+ * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate
+ * value.
+ */
+.viewport-flip {
+	-webkit-perspective: 1000;
+	position: absolute;
+}
+
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+}
+
+.flip {
+	-webkit-animation-duration: .65s;
+	-webkit-backface-visibility:hidden;
+	-webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+}
+
+.flip.out {
+	-webkit-transform: rotateY(-180deg) scale(.8);
+	-webkit-animation-name: flipouttoleft;
+}
+
+.flip.in {
+	-webkit-transform: rotateY(0) scale(1);
+	-webkit-animation-name: flipinfromleft;
+}
+
+/* Shake it all about */
+
+.flip.out.reverse {
+	-webkit-transform: rotateY(180deg) scale(.8);
+	-webkit-animation-name: flipouttoright;
+}
+
+.flip.in.reverse {
+	-webkit-transform: rotateY(0) scale(1);
+	-webkit-animation-name: flipinfromright;
+}
+
+@-webkit-keyframes flipinfromright {
+    from { -webkit-transform: rotateY(-180deg) scale(.8); }
+    to { -webkit-transform: rotateY(0) scale(1); }
+}
+
+@-webkit-keyframes flipinfromleft {
+    from { -webkit-transform: rotateY(180deg) scale(.8); }
+    to { -webkit-transform: rotateY(0) scale(1); }
+}
+
+@-webkit-keyframes flipouttoleft {
+    from { -webkit-transform: rotateY(0) scale(1); }
+    to { -webkit-transform: rotateY(-180deg) scale(.8); }
+}
+
+@-webkit-keyframes flipouttoright {
+    from { -webkit-transform: rotateY(0) scale(1); }
+    to { -webkit-transform: rotateY(180deg) scale(.8); }
+}
+
+
+/* Hackish, but reliable. */
+
+@-webkit-keyframes dontmove {
+    from { opacity: 1; }
+    to { opacity: 1; }
+}
+
+.pop {
+	-webkit-transform-origin: 50% 50%;
+}
+
+.pop.in {
+	-webkit-transform: scale(1);
+    opacity: 1;
+	-webkit-animation-name: popin;
+	z-index: 10;
+}
+
+.pop.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.pop.out.reverse {
+	-webkit-transform: scale(.2);
+	opacity: 0;
+	-webkit-animation-name: popout;
+	z-index: 10;
+}
+
+@-webkit-keyframes popin {
+    from {
+        -webkit-transform: scale(.2);
+        opacity: 0;
+    }
+    to {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes popout {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(.2);
+        opacity: 0;
+    }
+}/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* content configurations. */
+.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; }
+.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;}
+
+/* grid solo: 100 - single item fallback */
+.ui-grid-solo .ui-block-a { width: 100%; float: none; }
+
+/* grid a: 50/50 */
+.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; }
+.ui-grid-a .ui-block-a { clear: left; }
+
+/* grid b: 33/33/33 */
+.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; }
+.ui-grid-b .ui-block-a { clear: left; }
+
+/* grid c: 25/25/25/25 */
+.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; }
+.ui-grid-c .ui-block-a { clear: left; }
+
+/* grid d: 20/20/20/20/20 */
+.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; }
+.ui-grid-d .ui-block-a { clear: left; }
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/* fixed page header & footer configuration */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-header,
+.ui-footer,
+.ui-page-fullscreen .ui-header,
+.ui-page-fullscreen .ui-footer {
+  position: absolute;
+  overflow: hidden;
+  width: 100%;
+  border-left-width: 0;
+  border-right-width: 0;
+}
+.ui-header-fixed, .ui-footer-fixed {
+  z-index: 1000;
+  -webkit-transform: translatez(0);
+  /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */
+
+}
+.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline {
+  display: none;
+}
+.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer {
+  opacity: .9;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.ui-navbar { overflow: hidden;  }
+.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;}
+.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; }
+.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; }
+.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; }
+.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; }
+.ui-navbar li .ui-btn {  margin-right: -1px; }
+.ui-navbar li .ui-btn:last-child { margin-right: 0; }
+.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn,
+.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; }
+.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; }
+.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; }
+/*expanded page styles*/
+.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; }
+.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px;  }
+.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; }
+.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; }
+.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; }
+.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; }
+.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; }
+.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; }
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* Button colors are defined in config.less
+
+/* Edit button size */
+.ui-btn {
+  display: block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  /*margin: .5em 5px;*/
+  padding: 0;
+  vertical-align: middle;
+}
+/* wongi_1018 : For button align. */
+.ui-btn:focus, .ui-btn:active {
+  outline: none;
+}
+.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn {
+  display: inline-block;
+  font-size: 0.3611111111111111rem;
+  margin: 0;
+}
+.ui-btn-inline {
+  display: inline-block;
+}
+.ui-btn-inner {
+  padding: 0.6em 0.6944444444444444rem;
+  display: block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  zoom: 1;
+}
+.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner {
+  padding: 0.7em 0.2222222222222222rem 0.7em;
+}
+/* wongi_1024 : Button text middle align */
+.ui-header .ui-btn-inner.ui-btn-icon-only, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner.ui-btn-icon-only {
+  padding: 0.4em 0.2222222222222222rem 0.5em;
+}
+/* wongi_1024 : Button text middle align */
+.ui-btn-icon-notext {
+  width: 0.6666666666666666rem;
+  height: 0.6666666666666666rem;
+}
+.ui-btn-icon-notext .ui-btn-inner {
+  padding: 0.05555555555555555rem 0.027777777777777776rem 0.05555555555555555rem 0.08333333333333333rem;
+}
+.ui-btn-icon-notext .ui-btn-text {
+  position: absolute;
+  left: -27.75rem;
+}
+.ui-btn-icon-left .ui-btn-inner {
+  padding-left: 0.9166666666666666rem;
+}
+.ui-header .ui-btn-icon-left .ui-btn-inner, .ui-footer .ui-btn-icon-left .ui-btn-inner, .ui-bar .ui-btn-icon-left .ui-btn-inner {
+  padding-left: 0.75rem;
+}
+.ui-btn-icon-right .ui-btn-inner {
+  padding-right: 0.9166666666666666rem;
+}
+.ui-header .ui-btn-icon-right .ui-btn-inner, .ui-footer .ui-btn-icon-right .ui-btn-inner, .ui-bar .ui-btn-icon-right .ui-btn-inner {
+  padding-right: 0.75rem;
+}
+.ui-btn-icon-top .ui-btn-inner {
+  padding-top: 0.9166666666666666rem;
+}
+.ui-header .ui-btn-icon-top .ui-btn-inner, .ui-footer .ui-btn-icon-top .ui-btn-inner, .ui-bar .ui-btn-icon-top .ui-btn-inner {
+  padding-top: 0.75rem;
+}
+.ui-btn-icon-bottom .ui-btn-inner {
+  padding-bottom: 0.9166666666666666rem;
+}
+.ui-header .ui-btn-icon-bottom .ui-btn-inner, .ui-footer .ui-btn-icon-bottom .ui-btn-inner, .ui-bar .ui-btn-icon-bottom .ui-btn-inner {
+  padding-bottom: 0.75rem;
+}
+/*btn icon positioning*/
+.ui-btn-icon-notext .ui-icon {
+  display: block;
+}
+.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon, .ui-btn-icon-circle .ui-icon {
+  position: absolute;
+  /*top: 50%; margin-top: -9px;*/
+}
+/* wongi_1018 : do not use. No more use 18px default icons. */
+.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon {
+  position: absolute;
+  left: 50%;
+  margin-left: -9px;
+}
+.ui-btn-icon-left .ui-icon {
+  left: /*10px;*/ 0rem;
+}
+/* wongi_1018 : with 64px icon, left 10 -> 0 for good looking. */
+.ui-btn-icon-circle .ui-icon {
+  left: 0rem;
+}
+/* wongi_1018 : for circle icon center positioning. */
+.ui-btn-icon-right .ui-icon {
+  right: 0.2777777777777778rem;
+}
+.ui-btn-icon-top .ui-icon {
+  top: 0.2777777777777778rem;
+}
+.ui-btn-icon-bottom .ui-icon {
+  bottom: 0.2777777777777778rem;
+}
+.ui-header .ui-btn-icon-left .ui-icon, .ui-footer .ui-btn-icon-left .ui-icon, .ui-bar .ui-btn-icon-left .ui-icon {
+  left: 0.6666666666666666rem;
+}
+/* SLP Default Footer : Jinhyuk */
+.ui-header .ui-btn-icon-right .ui-icon, .ui-footer .ui-btn-icon-right .ui-icon, .ui-bar .ui-btn-icon-right .ui-icon {
+  right: 0.1111111111111111rem;
+}
+.ui-header .ui-btn-icon-top .ui-icon, .ui-footer .ui-btn-icon-top .ui-icon, .ui-bar .ui-btn-icon-top .ui-icon {
+  top: 0.1111111111111111rem;
+}
+.ui-header .ui-btn-icon-bottom .ui-icon, .ui-footer .ui-btn-icon-bottom .ui-icon, .ui-bar .ui-btn-icon-bottom .ui-icon {
+  bottom: 0.1111111111111111rem;
+}
+/*hiding native button,inputs */
+.ui-btn-hidden {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  -webkit-appearance: button;
+  opacity: .1;
+  cursor: pointer;
+  background: transparent;
+  font-size: 0.027777777777777776rem;
+  border: none;
+  line-height: 27.75rem;
+}
+.ui-btn-text {
+  /*padding-left : 80px;*/
+  margin-left: auto;
+  margin-right: auto;
+}
+.ui-li .ui-btn.ui-btn-icon_only {
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+}
+.ui-li .ui-btn .ui-btn-inner.ui-btn-hastxt {
+  padding: 0.2em 0.5em;
+}
+/* wongi_1017 : Icons */
+/* icons sizing */
+.ui-btn .ui-icon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+.ui-btn.ui-btn-edit .ui-icon {
+  width: 2.0555555555555554rem;
+  height: 2.0555555555555554rem;
+}
+/* Padding for Icon with text */
+.ui-btn .ui-btn-text.ui-btn-text-padding-left {
+  padding-left: 0.8888888888888888rem;
+}
+.ui-btn .ui-btn-text.ui-btn-text-padding-right {
+  padding-right: 1.3333333333333333rem;
+}
+.tizen-icon-common {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+}
+.ui-icon-bg {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_btn_circle_bg_normal.png);
+  z-index: 0;
+}
+.ui-icon-reveal {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_reveal.png);
+}
+.ui-icon-reveal-left {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_reveal_left.png);
+}
+.ui-icon-closed {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_expand_closed.png);
+}
+.ui-icon-opened {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_expand_opened.png);
+}
+.ui-icon-info {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_info.png);
+}
+.ui-icon-rename {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_rename.png);
+}
+.ui-icon-call {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_call.png);
+}
+.ui-icon-warning {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_warning.png);
+}
+.ui-icon-plus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_plus_normal.png);
+}
+.ui-icon-minus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_minus_normal.png);
+}
+.ui-icon-cancel {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_cancel.png);
+}
+.ui-icon-send {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_send.png);
+}
+.ui-icon-favorite {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_winset_icon_favorite_on.png);
+}
+.ui-icon-editexpand {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_expand.png);
+  top: -1.0277777777777777rem;
+}
+.ui-icon-editminus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_minus.png);
+  top: -1.0277777777777777rem;
+}
+.ui-icon-editplus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_plus.png);
+  top: -1.0277777777777777rem;
+}
+/* Header back btn : Jinjyuk */
+.ui-btn-up-s .ui-icon-header-back-btn {
+  width: 1.5555555555555554rem;
+  height: 1.5555555555555554rem;
+  left: 0.6666666666666666rem;
+  top: 0.2777777777777778rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_winset_Back.png);
+}
+.ui-btn-down-s .ui-icon-header-back-btn, .ui-btn-hover-s .ui-icon-header-back-btn {
+  width: 1.5555555555555554rem;
+  height: 1.5555555555555554rem;
+  left: 0.6666666666666666rem;
+  top: 0.2777777777777778rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_winset_Back.png);
+}
+.ui-icon-header-back-btn {
+  -moz-background-size: 1.3333333333333333rem 1.0555555555555556rem;
+  -o-background-size: 1.3333333333333333rem 1.0555555555555556rem;
+  -webkit-background-size: 1.3333333333333333rem 1.0555555555555556rem;
+  background-size: 1.3333333333333333rem 1.0555555555555556rem;
+  width: 1.3333333333333333rem;
+  height: 1.0555555555555556rem;
+}
+/* Pressed images */
+.ui-btn-down-s .ui-icon-bg, .ui-btn-down-s.ui-tizen-icon-bg {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_btn_circle_bg_press.png);
+  z-index: 0;
+}
+.ui-btn-down-s .ui-icon-reveal {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_reveal_press.png);
+}
+.ui-btn-down-s .ui-icon-reveal-left {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_reveal_left_press.png);
+}
+.ui-btn-down-s .ui-icon-closed {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_expand_closed_press.png);
+}
+.ui-btn-down-s .ui-icon-opened {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_expand_opened_press.png);
+}
+.ui-btn-down-s .ui-icon-info {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_info_press.png);
+}
+.ui-btn-down-s .ui-icon-rename {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_rename_press.png);
+}
+.ui-btn-down-s .ui-icon-call {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_call_press.png);
+}
+.ui-btn-down-s .ui-icon-warning {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_warning_press.png);
+}
+.ui-btn-down-s .ui-icon-plus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_plus_press.png);
+}
+.ui-btn-down-s .ui-icon-minus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_minus_press.png);
+}
+.ui-btn-down-s .ui-icon-cancel {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_cancel_press.png);
+}
+.ui-btn-down-s .ui-icon-send {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_send_press.png);
+}
+.ui-btn-down-s .ui-icon-favorite {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_winset_icon_favorite_off.png);
+}
+.ui-btn-down-s .ui-icon-editexpand {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_expand_press.png);
+  top: -1.0277777777777777rem;
+}
+.ui-btn-down-s .ui-icon-editminus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_minus_press.png);
+  top: -1.0277777777777777rem;
+}
+.ui-btn-down-s .ui-icon-editplus {
+  /* Overlap original property */
+
+  background-position: 0% 0%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  margin-top: 50%;
+  top: -0.8888888888888888rem;
+  z-index: 10;
+  vertical-align: middle;
+  background-image: url(images/00_button_icon_plus_press.png);
+  top: -1.0277777777777777rem;
+}
+.ui-btn-inner.ui-btn-icon-only {
+  padding: 0.8888888888888888rem 0.8888888888888888rem;
+}
+.ui-btn-edit .ui-btn-inner.ui-btn-icon-only {
+  padding: 1.0277777777777777rem 1.0277777777777777rem;
+}
+/* Circle Icon BG : data-iconbg = "circle" */
+.ui-btn-corner-all.ui-btn-corner-circle {
+  -moz-border-radius: 1em;
+  -webkit-border-radius: 1em;
+  bordert-radius: 1em;
+}
+/* No BG button : data-iconbg = "nobg" */
+.ui-btn.ui-btn-icon-nobg, .ui-btn .ui-btn-icon-nobg {
+  background-color: transparent;
+  border: none;
+}
+/* Contact Edit Style */
+.ui-btn.ui-btn-edit .ui-btn-text {
+  color: #cf2929;
+}
+.ui-btn.ui-btn-edit.ui-btn-hover-s, .ui-btn.ui-btn-edit.ui-btn-up-s, .ui-btn.ui-btn-edit.ui-btn-down-s {
+  font-size: 0.6em;
+}
+.ui-btn.ui-btn-edit.ui-btn-down-s .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-btn.ui-btn-edit {
+  background-color: #3b3b3b;
+  position: absolute;
+  top: 0rem;
+  margin-top: 0rem;
+}
+.ui-btn.ui-btn-edit.ui-btn-down-s {
+  background-color: #008cd2;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.ui-collapsible { margin: .5em 0; }
+.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; }
+.ui-collapsible-heading a { text-align: left; margin: 0;  }
+.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; }
+.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; }
+.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 10px 0; }
+.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; }
+.ui-collapsible-heading-status { position:absolute; left:-9999px; }
+.ui-collapsible-content {
+	display: block;
+	margin:  0 -8px;
+	padding: 10px 16px;
+	border-top:  none;      /* Overrides ui-btn-up-* */
+	background-image: none; /* Overrides ui-btn-up-* */
+	font-weight: normal;    /* Overrides ui-btn-up-* */
+}
+.ui-collapsible-content-collapsed { display: none; }
+
+.ui-collapsible-set { margin: .5em 0; }
+.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; }
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-dialog {
+  min-height: 480px;
+}
+.ui-dialog .ui-header, .ui-dialog .ui-content, .ui-dialog .ui-footer {
+  margin: 15px;
+  position: relative;
+}
+.ui-dialog .ui-header, .ui-dialog .ui-footer {
+  z-index: 10;
+  width: auto;
+}
+.ui-dialog .ui-header .ui-btn-left {
+  width: 0px;
+  border-width: 0px;
+}
+.ui-dialog .center_info {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+}
+.ui-dialog .center_info .popup-text {
+  font-size: 42px;
+  background: #213c49;
+  width: 100%;
+}
+.ui-dialog .center_info .popup-text p {
+  text-align: center;
+  padding: 22px 16px;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner {
+  white-space: normal;
+}
+.ui-icon-radio-off {
+  background-color: transparent;
+}
+.ui-checkbox, .ui-radio {
+  height: 2.2222222222222223rem;
+  position: relative;
+  margin: 0;
+  z-index: 1;
+}
+.ui-checkbox .ui-btn-corner-all, .ui-radio .ui-btn-corner-all {
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  bordert-radius: 0;
+}
+.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner {
+  border-top: 0;
+}
+.ui-checkbox .ui-btn-up-s, .ui-radio .ui-btn-up-s {
+  border: 0;
+  background: transparent;
+  font-weight: normal;
+}
+.ui-checkbox .ui-btn-hover-s, .ui-radio .ui-btn-hover-s {
+  border: 0;
+  background: transparent;
+  font-weight: normal;
+}
+.ui-checkbox .ui-btn-down-s, .ui-radio .ui-btn-down-s {
+  border: 0;
+  background: transparent;
+  font-weight: normal;
+}
+.ui-checkbox input, .ui-radio input {
+  position: absolute;
+  left: -10000px;
+  height: 100%;
+  outline: 0 !important;
+  z-index: 0;
+}
+.ui-checkbox .ui-btn, .ui-radio .ui-btn {
+  height: 100%;
+  margin: 0;
+  text-align: left;
+  z-index: 2;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left, .ui-radio .ui-btn.ui-btn-icon-left {
+  display: block;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner, .ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner {
+  display: inline-block;
+  line-height: 2.2222222222222223rem;
+  padding: 0 0 0 0.4444444444444444rem;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text, .ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text {
+  display: inline-block;
+  vertical-align: middle;
+  margin-left: 1.1111111111111112rem;
+}
+.ui-checkbox .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-icon, .ui-radio .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-icon {
+  position: absolute;
+  top: 50%;
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  margin-top: -0.5833333333333333rem;
+}
+.ui-checkbox.favorite input {
+  position: absolute;
+  left: -10000px;
+  height: 100%;
+  outline: 0 !important;
+  z-index: 1;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left {
+  display: block;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner {
+  display: inline-block;
+  line-height: 2.2222222222222223rem;
+  padding: 0 0 0 0.4444444444444444rem;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text {
+  display: inline-block;
+  vertical-align: middle;
+  margin-left: 2.6666666666666665rem;
+}
+.ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-icon {
+  position: absolute;
+  top: 50%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  margin-top: -0.8888888888888888rem;
+}
+/* put img inside of checkbox(normal, favorite, on&off style) */
+.ui-icon-checkbox-off,
+.ui-icon-checkbox-on,
+.favorite .ui-icon-checkbox-off,
+.favorite .ui-icon-checkbox-on,
+.ui-icon-checkbox-on-press,
+.ui-icon-checkbox-off-press,
+.ui-icon-radio-off,
+.ui-icon-radio-on,
+.ui-icon-radio-on-press,
+.ui-icon-radio-off-press {
+  background-size: 100% 100%;
+  background-color: transparent;
+}
+.ui-icon-checkbox-off {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_check_bg.png);
+}
+.ui-icon-checkbox-on {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_check_checking.png), url(images/00_check_bg.png);
+  background-repeat: no-repeat;
+}
+.ui-icon-checkbox-off-press {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_check_bg_press.png);
+}
+.ui-icon-checkbox-on-press {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_check_checking.png), url(images/00_check_bg_press.png);
+  background-repeat: no-repeat;
+}
+.favorite .ui-icon-checkbox-off, .favorite .ui-icon-checkbox-off-press {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-image: url(images/00_winset_icon_favorite_off.png);
+}
+.favorite .ui-icon-checkbox-on, .favorite .ui-icon-checkbox-on-press {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  background-image: url(images/00_winset_icon_favorite_on.png);
+}
+.ui-icon-radio-off {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_button_radio_normal2.png);
+}
+.ui-icon-radio-on {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_button_radio_normal1.png);
+}
+.ui-icon-radio-on-press {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_button_radio_press2.png);
+}
+.ui-icon-radio-off-press {
+  width: 1.1666666666666665rem;
+  height: 1.1666666666666665rem;
+  background-image: url(images/00_button_radio_press1.png);
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.ui-field-contain { padding: 1.5em 0; margin: 0; border-bottom-width: 1px; overflow: visible; }
+.ui-field-contain:first-child { border-top-width: 0; }
+@media all and (min-width: 450px){
+	.ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }
+}	/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+.ui-select { display: block; position: relative; }
+.ui-select select { position: absolute; left: -9999px; top: -9999px; }
+.ui-select .ui-btn { overflow: hidden; }
+.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%;  min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); z-index: 2; }
+@-moz-document url-prefix() {.ui-select .ui-btn select { opacity: 0.0001; }}
+.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; text-indent: 0; }
+
+.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; } 
+.ui-select .ui-btn-icon-right .ui-icon { right: 15px;  }
+
+/* labels */
+label.ui-select { font-size: 16px; line-height: 1.4;  font-weight: normal; margin: 0 0 .3em; display: block; }
+
+/*listbox*/
+.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; }
+.ui-select .ui-btn-text { text-overflow: ellipsis; overflow: hidden;}
+
+.ui-selectmenu { position: absolute; padding: 0; z-index: 100 !important; width: 80%; max-width: 350px; padding: 6px; }
+.ui-selectmenu .ui-listview { margin: 0; }
+.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; }
+.ui-selectmenu-hidden { top: -9999px; left: -9999px; }
+.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%;  z-index: 99; }
+.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; }
+.ui-selectmenu-list .ui-li .ui-icon { display: block; }
+.ui-li.ui-selectmenu-placeholder { display: none; }
+.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; }
+
+@media all and (min-width: 450px){
+	label.ui-select { vertical-align: top;  display: inline-block;  width: 20%;  margin: 0 2% 0 0; }
+	.ui-select { width: 60%; display: inline-block; }
+}	
+
+/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button.  this shim's content in there */
+.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+label.ui-input-text {
+  font-size: 0.8888888888888888rem;
+  line-height: 1.4;
+  display: block;
+  font-weight: normal;
+  margin: 0 0 .3em;
+}
+input.ui-input-text, textarea.ui-input-text {
+  background-image: none;
+  padding: .4em;
+  line-height: 1.4;
+  font-size: 0.8888888888888888rem;
+  display: block;
+  width: 95%;
+}
+input.ui-input-text {
+  -webkit-appearance: none;
+}
+textarea.ui-input-text {
+  height: 1.3888888888888888rem;
+  -webkit-transition: height 200ms linear;
+  -moz-transition: height 200ms linear;
+  -o-transition: height 200ms linear;
+  transition: height 200ms linear;
+}
+.ui-input-search {
+  padding: 0 0;
+  position: relative;
+}
+.ui-input-search input.ui-input-text {
+  border: none;
+  background: transparent none;
+  outline: 0 !important;
+}
+.ui-input-search .ui-btn-down-s, .ui-input-search .ui-btn-up-s, .ui-input-search .ui-btn-hover-s {
+  border: none;
+  background: transparent none;
+}
+.ui-input-search .ui-btn-icon-notext.ui-input-clear {
+  width: 1.0555555555555556rem;
+  height: 1.0555555555555556rem;
+}
+.ui-input-search .ui-btn-icon-notext.ui-input-clear .ui-btn-inner {
+  padding: 0;
+}
+.ui-input-search .ui-icon-deleteSearch {
+  width: 1.0555555555555556rem;
+  height: 1.0555555555555556rem;
+}
+.ui-input-search .ui-input-clear {
+  position: absolute;
+  right: 0;
+  top: 0;
+  vertical-align: middle;
+  margin: 0.4444444444444444rem;
+}
+.ui-input-search .ui-input-clear-hidden {
+  display: none;
+}
+.ui-image-search {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  margin: 0.4444444444444444rem;
+}
+.ui-image-searchfield:after {
+  margin-left: 1.611111111111111rem;
+  content: "Search";
+  color: #828282;
+}
+/* orientation adjustments - incomplete!*/
+@media all and (min-width: 720*@unit_base) {
+  label.ui-input-text {
+    vertical-align: top;
+    display: inline-block;
+    width: 20%;
+    margin: 0 2% 0 0;
+  }
+  input.ui-input-text, textarea.ui-input-text, .ui-input-search {
+    width: 60%;
+    display: inline-block;
+  }
+  .ui-input-search input.ui-input-text {
+    width: 85%;
+    /*echos rule from above*/
+  }
+}
+/* search bar */
+.ui-body-s > div > .ui-field-contain > .input-search-bar, .ui-body-s > .ui-field-contain > .input-search-bar {
+  margin: -1.3333333333333333rem -0.41666666666666663rem -0.8888888888888888rem -0.41666666666666663rem;
+}
+/* Need to confirm exact concept : Jinhyuk */
+.input-search-bar {
+  position: relative;
+  /* In case searchbar in header : Jinhyuk */
+
+  background-color: #242424;
+  padding: 0.4444444444444444rem;
+  vertical-align: middle;
+}
+.input-search-bar .ui-corner-all {
+  -moz-border-radius: 0.3em;
+  -webkit-border-radius: 0.3em;
+  bordert-radius: 0.3em;
+}
+.input-search-bar .ui-input-search {
+  font-size: 0.8888888888888888rem;
+  display: inline-block;
+  position: relative;
+  width: 70%;
+  padding: 0;
+  background-color: black;
+}
+.input-search-bar .ui-input-search .ui-input-text {
+  height: 2.0555555555555554rem;
+  padding: 0px;
+  margin-left: 0.2777777777777778rem;
+}
+.input-search-bar .ui-input-search-default {
+  width: 70%;
+  -webkit-transition: width 400ms linear;
+  -moz-transition: width 400ms linear;
+  -o-transition: width 400ms linear;
+  transition: width 400ms linear;
+}
+.input-search-bar .ui-input-search-wide {
+  width: 100%;
+  -webkit-transition: width 400ms linear;
+  -moz-transition: width 400ms linear;
+  -o-transition: width 400ms linear;
+  transition: width 400ms linear;
+}
+.input-search-bar .ui-btn-icon-cancel {
+  display: inline-block;
+  position: absolute;
+  left: 70%;
+  vertical-align: middle;
+  margin-left: 0.2777777777777778rem;
+  margin-right: 0.2777777777777778rem;
+  padding: 0px;
+  height: 2.0555555555555554rem;
+  border-color: none;
+}
+.input-search-bar .ui-btn-icon-cancel .ui-btn-text {
+  font-size: 0.8888888888888888rem;
+}
+.input-search-bar .ui-btn-icon-cancel .ui-btn-inner {
+  padding-top: 0.5rem;
+  padding-bottom: 0.5rem;
+}
+.input-search-bar .ui-btn-icon-cancel.ui-input-cancel {
+  width: 26%;
+}
+.input-search-bar .ui-btn-cancel-hide {
+  left: 100%;
+  -webkit-transition: left 400ms linear;
+  -moz-transition: left 400ms linear;
+  -o-transition: left 400ms linear;
+  transition: left 400ms linear;
+}
+.input-search-bar .ui-btn-cancel-show {
+  left: 70%;
+  -webkit-transition: left 400ms linear;
+  -moz-transition: left 400ms linear;
+  -o-transition: left 400ms linear;
+  transition: left 400ms linear;
+}
+.ui-header .input-search-bar {
+  padding-top: 0.4444444444444444rem;
+  padding-bottom: 0.4444444444444444rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-controlgroup, fieldset.ui-controlgroup {
+  padding: 0;
+  margin: .5em 0 1em;
+}
+.ui-bar .ui-controlgroup {
+  margin: 0 .3em;
+}
+.ui-controlgroup-label {
+  font-size: 1em;
+  line-height: 1.4;
+  font-weight: normal;
+  margin: 0 0 .3em;
+}
+.ui-controlgroup-controls {
+  display: block;
+}
+.ui-controlgroup li {
+  list-style: none;
+}
+.ui-controlgroup .ui-btn-inner {
+  white-space: nowrap;
+}
+.ui-controlgroup .ui-checkbox label label, .ui-controlgroup .ui-radio label {
+  font-size: 1em;
+}
+.ui-controlgroup .ui-radio {
+  width: 25%;
+  overflow: hidden;
+}
+.ui-controlgroup .ui-radio label {
+  text-align: center;
+  white-space: nowrap;
+}
+.ui-controlgroup .ui-radio-off, .ui-controlgroup .ui-radio-on {
+  width: 100%;
+  border-right-width: 1px;
+  border-right-color: #252525;
+  border-right-style: solid;
+  border-left-width: 1px;
+  border-left-color: #252525;
+  border-left-style: solid;
+}
+.ui-controlgroup .ui-corner-left {
+  border-left-width: 0px;
+}
+.ui-controlgroup .ui-corner-right {
+  border-right-width: 0px;
+}
+.ui-controlgroup-vertical .ui-btn, .ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio {
+  margin: 0;
+  border-bottom-width: 0;
+}
+.ui-controlgroup-vertical .ui-controlgroup-last {
+  border-bottom-width: 1px;
+}
+.ui-controlgroup-vertical .ui-radio {
+  width: 100%;
+}
+.ui-controlgroup-vertical .ui-radio label {
+  text-align: left;
+}
+.ui-controlgroup-vertical .ui-radio label .ui-btn-inner {
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+}
+.ui-controlgroup-horizontal {
+  padding: 0;
+}
+.ui-controlgroup-horizontal .ui-btn {
+  display: inline-block;
+  margin: 0 -5px 0 0;
+}
+.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio {
+  float: left;
+  margin: 0 -1px 0 0;
+}
+.ui-controlgroup-horizontal .ui-controlgroup-last {
+  margin-right: 0;
+}
+@media all and (min-width: 450px) {
+  .ui-controlgroup-label {
+    vertical-align: top;
+    display: inline-block;
+    width: 20%;
+    margin: 0 2% 0 0;
+  }
+  .ui-controlgroup-controls {
+    display: inline-block;
+  }
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/*** less definitions ***/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/************************/
+.ui-listview {
+  margin: 0;
+  counter-reset: listnumbering;
+  border-top-width: 1px;
+  border-top-style: solid;
+}
+.ui-listview li.ui-btn-up-s > .ui-li > .ui-btn-text > a.ui-link-inherit, .ui-listview li.ui-btn-hover-s > .ui-li > .ui-btn-text > a.ui-link-inherit, .ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+  font-size: 1.222222222222222rem;
+}
+.ui-listview li.ui-btn > .ui-btn-hastxt > .ui-btn-text.ui-btn-text-padding-right {
+  padding-right: 0rem;
+}
+.ui-listview > .ui-li {
+  border-bottom-width: 1px;
+  border-bottom-style: solid;
+}
+.ui-content .ui-listview {
+  margin: -0.4444444444444444rem;
+}
+.ui-content .ui-listview .ui-listview {
+  margin: 0;
+}
+.ui-content .ui-listview-inset {
+  margin: 1em 0;
+}
+.ui-listview, .ui-li {
+  list-style: none;
+  padding: 0;
+}
+.ui-li, .ui-li.ui-field-contain {
+  display: block;
+  margin: 0;
+  position: relative;
+  overflow: visible;
+  text-align: left;
+}
+.ui-li .ui-btn {
+  top: 50%;
+  margin-top: -0.8em;
+}
+.ui-li .ui-btn-text {
+  position: relative;
+}
+.ui-li .ui-btn-text a.ui-link-inherit {
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.ui-li:last-child, .ui-li.ui-field-contain:last-child {
+  border-bottom-width: 1px;
+}
+.ui-li > .ui-btn-inner {
+  display: block;
+  position: relative;
+  padding: 0;
+  border-width: 0;
+}
+.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li.ui-li-static {
+  padding: 0.7em 0.4444444444444444rem;
+  display: block;
+}
+.ui-li-divider, .ui-li-static {
+  font-weight: normal;
+  padding: 0px 0.4444444444444444rem;
+}
+.ui-li-static {
+  font-size: 1.222222222222222rem;
+}
+.ui-li-divider {
+  counter-reset: listnumbering;
+  font-size: 0.7777777777777777rem;
+  padding-top: 0.7777777777777777rem;
+}
+.ui-li-divider.ui-bar-s {
+  height: 0.7777777777777777rem;
+}
+ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec {
+  font-size: .8em;
+  display: inline-block;
+  padding-right: .3em;
+  font-weight: normal;
+  counter-increment: listnumbering;
+  content: counter(listnumbering) ". ";
+}
+ol.ui-listview .ui-li-jsnumbering:before {
+  content: "" !important;
+  /* to avoid chance of duplication */
+
+}
+.ui-listview-inset .ui-li {
+  border-right-width: 1px;
+  border-left-width: 1px;
+}
+.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-has-thumb.ui-li-static {
+  min-height: 1.6666666666666665rem;
+  padding-left: 2.7777777777777777rem;
+}
+.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-has-icon.ui-li-static {
+  min-height: 20px;
+  padding-left: 40px;
+}
+.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-has-count.ui-li-static {
+  padding-right: 45px;
+}
+.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-has-arrow.ui-li-static {
+  padding-right: 30px;
+}
+.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-has-arrow.ui-li-static.ui-li-has-count {
+  padding-right: 75px;
+}
+.ui-li-heading {
+  font-size: 16px;
+  font-weight: bold;
+  display: block;
+  margin: .6em 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.ui-li-desc {
+  font-size: 12px;
+  font-weight: normal;
+  display: block;
+  margin: -0.5em 0 0.6em;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.ui-li-thumb, .ui-li-icon {
+  position: absolute;
+  left: 1px;
+  top: 0;
+  max-height: 2.6666666666666665rem;
+  max-width: 2.6666666666666665rem;
+}
+.ui-li-aside {
+  float: right;
+  width: 50%;
+  text-align: right;
+  margin: .3em 0;
+}
+@media all and (min-width: 480px) {
+  .ui-li-aside {
+    width: 45%;
+  }
+}
+.ui-li-divider {
+  cursor: default;
+}
+.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-has-alt.ui-li-static {
+  padding-right: 95px;
+}
+.ui-li-has-count .ui-li-count {
+  position: absolute;
+  font-size: 11px;
+  font-weight: bold;
+  padding: .2em .5em;
+  top: 50%;
+  margin-top: -0.9em;
+  right: 38px;
+}
+.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count {
+  right: 10px;
+}
+.ui-li-has-alt .ui-li-count {
+  right: 55px;
+}
+.ui-li-link-alt {
+  position: absolute;
+  width: 40px;
+  height: 100%;
+  border-width: 0;
+  border-left-width: 1px;
+  top: 0;
+  right: 0;
+  margin: 0;
+  padding: 0;
+  z-index: 2;
+}
+.ui-li-link-alt .ui-btn {
+  overflow: hidden;
+  position: absolute;
+  right: 8px;
+  top: 50%;
+  margin: -11px 0 0 0;
+  border-bottom-width: 1px;
+  z-index: -1;
+}
+.ui-li-link-alt .ui-btn-inner {
+  padding: 0;
+  height: 100%;
+  position: absolute;
+  width: 100%;
+  top: 0;
+  left: 0;
+}
+.ui-li-link-alt .ui-btn .ui-icon {
+  right: 50%;
+  margin-right: -9px;
+}
+.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner {
+  border-top: 0px;
+}
+.ui-listview-filter {
+  border-width: 0;
+  overflow: hidden;
+  margin: -15px -15px 15px -15px;
+}
+.ui-listview-filter .ui-input-search {
+  margin: 5px;
+  width: auto;
+  display: block;
+}
+.ui-listview-filter-inset {
+  margin: -15px -5px -15px -5px;
+  background: transparent;
+}
+.ui-li.ui-screen-hidden {
+  display: none;
+}
+.ui-li-sub, .ui-li-sub-setting {
+  float: right;
+  text-align: right;
+  font-size: 0.8888888888888888rem;
+  margin: .3em 0;
+}
+/* listview: size for li with a link */
+/*
+.ui-listview li.ui-btn-up-s > .ui-li > .ui-btn-text > a.ui-link-inherit,
+.ui-listview li.ui-btn-hover-s > .ui-li > .ui-btn-text > a.ui-link-inherit,
+.ui-listview li.ui-btn-down-s > .ui-li > .ui-btn-text > a.ui-link-inherit {
+	margin: 0;
+	min-height: @height;
+	padding-left: 0;
+}
+*/
+.ui-li-long-text {
+  display: inline-block;
+  text-overflow: ellipsis;
+  overflow-x: hidden;
+  white-space: nowrap;
+}
+ul.ui-listview {
+  /* 1.11 Hidden style with 2 button */
+
+  /* For Contacts list : wongi_1108 */
+
+}
+ul.ui-listview > li.ui-li-1-11 {
+  height: 96px;
+  padding: 0px;
+  padding-left: 16px;
+  padding-right: 16px;
+}
+ul.ui-listview > li.ui-li-1-11 > div.ui-btn {
+  position: absolute;
+  padding: 0px;
+  margin-top: 0px;
+  width: 336px;
+  top: 18px;
+}
+ul.ui-listview > li.ui-li-1-11 > div.ui-btn > span.ui-btn-hastxt {
+  padding-top: 0.4em;
+}
+ul.ui-listview > li.ui-li-1-11 > div.ui-btn:nth-child(1) {
+  left: 16px;
+}
+ul.ui-listview > li.ui-li-1-11 > div.ui-btn:nth-child(2) {
+  left: 372px;
+}
+ul.ui-listview > li.ui-li-1line .ui-li-text-main, ul.ui-listview > li.ui-li-1line-sub .ui-li-text-main, ul.ui-listview > li.ui-li-1line-setting .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line .ui-li-text-sub, ul.ui-listview > li.ui-li-1line-sub .ui-li-text-sub, ul.ui-listview > li.ui-li-1line-setting .ui-li-text-sub {
+  float: right;
+  text-align: right;
+  font-size: 0.8888888888888888rem;
+  color: #646464;
+  top: 50%;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-setting .ui-li-text-sub {
+  color: #008cd2;
+}
+ul.ui-listview > li.ui-li-1line-btn1 .ui-li-text-main, ul.ui-listview > li.ui-li-1line-btn2 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-btn1 > .ui-btn, ul.ui-listview > li.ui-li-1line-btn2 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-1line-toggle .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-toggle .ui-toggleswitch {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-1line-bigicon1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-bigicon2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-bigicon4 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-bigicon5 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-bigicon6 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 2.6666666666666665rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-bigicon1 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon2 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon4 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon5 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon6 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-bigicon1 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon2 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon4 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon5 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-1line-bigicon6 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-1line-bigicon2 .ui-li-text-sub {
+  float: right;
+  text-align: right;
+  font-size: 0.8888888888888888rem;
+  color: #646464;
+  top: 50%;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-bigicon6 .ui-toggleswitch {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-1line-check1,
+ul.ui-listview > li.ui-li-1line-check2,
+ul.ui-listview > li.ui-li-1line-radio1,
+ul.ui-listview > li.ui-li-1line-radio3,
+ul.ui-listview > li.ui-li-1line-radio5 {
+  margin: 0;
+  height: 1.6666666666666665rem !important;
+  min-height: 1.6666666666666665rem;
+  padding-left: 2.0555555555555554rem;
+}
+ul.ui-listview > li.ui-li-1line-check1 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-check2 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-check1 .ui-radio,
+ul.ui-listview > li.ui-li-1line-check2 .ui-radio,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-radio,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-radio,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-radio,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-check1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-check2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-1line-check1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-check2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-radio1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-radio3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-1line-radio5 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-check3, ul.ui-listview > li.ui-li-1line-check4, ul.ui-listview > li.ui-li-1line-radio4 {
+  margin: 0;
+  height: 1.6666666666666665rem !important;
+  min-height: 1.6666666666666665rem;
+  padding-left: 4.277777777777778rem;
+}
+ul.ui-listview > li.ui-li-1line-check3 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-check4 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-checkbox,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-1line-check3 .ui-radio,
+ul.ui-listview > li.ui-li-1line-check4 .ui-radio,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-radio,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-1line-check3 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-check4 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-1line-radio4 .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-1line-check3 img.ui-li-bigicon, ul.ui-listview > li.ui-li-1line-check4 img.ui-li-bigicon, ul.ui-listview > li.ui-li-1line-radio4 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-check3 img.ui-li-bigicon, ul.ui-listview > li.ui-li-1line-check4 img.ui-li-bigicon, ul.ui-listview > li.ui-li-1line-radio4 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 2.0555555555555554rem;
+}
+ul.ui-listview > li.ui-li-1line-check3 .ui-li-text-main, ul.ui-listview > li.ui-li-1line-check4 .ui-li-text-main, ul.ui-listview > li.ui-li-1line-radio4 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-bigicon4 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-bigicon5 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-check2 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-check4 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-radio3 > .ui-btn,
+ul.ui-listview > li.ui-li-1line-radio5 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-1line-radio5 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-radio5 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: auto;
+  right: 2.6666666666666665rem;
+}
+ul.ui-listview > li.ui-li-1line-radio6 .ui-li-text-main {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  margin-top: -0.5em;
+}
+ul.ui-listview > li.ui-li-1line-radio6 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-radio6 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: auto;
+  right: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line, ul.ui-listview > li.ui-li-2line-setting, ul.ui-listview > li.ui-li-2line-toggle-setting {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line .ui-li-text-main, ul.ui-listview > li.ui-li-2line-setting .ui-li-text-main, ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-setting .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line .ui-toggleswitch, ul.ui-listview > li.ui-li-2line-setting .ui-toggleswitch, ul.ui-listview > li.ui-li-2line-toggle-setting .ui-toggleswitch {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-sub-main, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-sub-main .ui-li-text-main, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 1.6111111111111112rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-sub-main .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-sub-main img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-sub-main img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: auto;
+  right: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-2sub {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-btn1,
+ul.ui-listview > li.ui-li-2line-btn2,
+ul.ui-listview > li.ui-li-2line-btn-setting,
+ul.ui-listview > li.ui-li-2line-bigicon0 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-btn2 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-btn-setting > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon0 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-sub > img,
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-sub > img,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-sub > img,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-sub > img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-star1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-star1 img.ui-li-icon-sub {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-star2 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-star2 img.ui-li-icon-sub {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-sub > img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0.4444444444444444rem 0 0;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1,
+ul.ui-listview > li.ui-li-2line-bigicon2,
+ul.ui-listview > li.ui-li-2line-bigicon3,
+ul.ui-listview > li.ui-li-2line-bigicon4,
+ul.ui-listview > li.ui-li-2line-colorbar3,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon4 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.6666666666666665rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon4 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.6666666666666665rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon2 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon3 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon4 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-colorbar3 > .ui-btn,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon2 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon3 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon4 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-colorbar3 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon1 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon2 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon3 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon4 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-colorbar3 img.ui-li-bigicon,
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-sub {
+  color: #008cd2;
+}
+ul.ui-listview > li.ui-li-2line-check1, ul.ui-listview > li.ui-li-2line-check2, ul.ui-listview > li.ui-li-2line-radio1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-check1 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-check2 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-check1 .ui-radio,
+ul.ui-listview > li.ui-li-2line-check2 .ui-radio,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-radio,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-check1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-2line-check2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-2line-check1 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-check2 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-radio1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.0555555555555554rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-check1 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-check2 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-radio1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.0555555555555554rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-check1 > .ui-btn, ul.ui-listview > li.ui-li-2line-check2 > .ui-btn, ul.ui-listview > li.ui-li-2line-radio1 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-check3, ul.ui-listview > li.ui-li-2line-radio2, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-check3 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-checkbox,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-2line-check3 .ui-radio,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-radio,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-radio,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-2line-check3 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-2line-check3 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-radio2 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-check3 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-radio2 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 2.0555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-check3 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-radio2 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 4.277777777777778rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-check3 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-radio2 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 4.277777777777778rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-check3 > .ui-btn, ul.ui-listview > li.ui-li-2line-radio2 > .ui-btn, ul.ui-listview > li.ui-li-2line-icon-bigicon-btn > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-color-bar, ul.ui-listview > li.ui-li-2line-colorbar2 .ui-li-color-bar, ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-color-bar {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 0.2777777777777778rem;
+  height: 0.5555555555555556rem;
+  background-color: #506bcf;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-btn {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  margin: 0 0 0 0.4444444444444444rem;
+  max-height: 1.6666666666666665rem;
+}
+ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-colorbar2 .ui-li-text-main img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.6666666666666665rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.6666666666666665rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 img.ui-li-icon-sub {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 2.1666666666666665rem;
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-2line-thumb1, ul.ui-listview > li.ui-li-2line-thumb2, ul.ui-listview > li.ui-li-2line-thumb3 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-thumb2 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-thumb3 img.ui-li-bigicon {
+  width: 2.6666666666666665rem;
+  height: 2.6666666666666665rem;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-thumb2 img.ui-li-bigicon, ul.ui-listview > li.ui-li-2line-thumb3 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -1.3333333333333333rem;
+  left: auto;
+  right: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-main img, ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-main img, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-main img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-sub img, ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-sub img, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-sub img {
+  width: 0.8888888888888888rem;
+  height: 0.8888888888888888rem;
+  margin: 0 0.4444444444444444rem 0 0;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.6666666666666665rem;
+  top: 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.6666666666666665rem;
+  top: 2.1111111111111107rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 4.611111111111111rem;
+  top: 2.1111111111111107rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 > .ui-btn {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-btn {
+  max-width: 3.722222222222222rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-progressbar {
+  left: 2.6666666666666665rem;
+  top: 1.6666666666666665rem;
+  height: 0.4444444444444444rem;
+  width: 13rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.6666666666666665rem;
+  top: 0;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 2.6666666666666665rem;
+  top: 2.1111111111111107rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 2.1111111111111107rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-progressbar {
+  left: 2.6666666666666665rem;
+  top: 1.6666666666666665rem;
+  height: 0.4444444444444444rem;
+  width: 16.88888888888889rem;
+}
+ul.ui-listview > li.ui-li-2line .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-sub-main .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-setting .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-sub-main .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-setting .ui-li-text-sub {
+  max-width: 95%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-main, ul.ui-listview > li.ui-li-3-2-6 .ui-li-text-main {
+  max-width: 65%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-sub, ul.ui-listview > li.ui-li-3-2-6 .ui-li-text-sub {
+  max-width: 95%;
+}
+ul.ui-listview > li.ui-li-2line-2sub .ui-li-text-sub2, ul.ui-listview > li.ui-li-3-2-6 .ui-li-text-sub2 {
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-thumb2 .ui-li-text-sub {
+  max-width: 65%;
+}
+ul.ui-listview > li.ui-li-2line-btn1 .ui-btn,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-btn,
+ul.ui-listview > li.ui-li-2line-thumb1 .ui-btn,
+ul.ui-listview > li.ui-li-2line-thumb2 .ui-btn {
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-check1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-btn2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-toggle-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-btn-setting .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon0 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-bigicon3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-check1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-radio1 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-sub-main-bigicon1 .ui-li-text-sub {
+  max-width: 80%;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-main {
+  max-width: 85%;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-sub, ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub {
+  max-width: 65%;
+}
+ul.ui-listview > li.ui-li-2line-star1 .ui-li-text-sub2, ul.ui-listview > li.ui-li-2line-colorbar1 .ui-li-text-sub2 {
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-main {
+  max-width: 85%;
+}
+ul.ui-listview > li.ui-li-2line-star2 .ui-li-text-sub {
+  max-width: 95%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-main {
+  max-width: 55%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-sub {
+  max-width: 80%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon2 .ui-li-text-sub2 {
+  max-width: 20%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon4 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-check2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-check3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-li-text-main,
+ul.ui-listview > li.ui-li-2line-bigicon4 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-check2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-check3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-radio2 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-colorbar3 .ui-li-text-sub,
+ul.ui-listview > li.ui-li-2line-icon-bigicon-btn .ui-li-text-sub {
+  max-width: 65%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 .ui-li-text-main {
+  max-width: 75%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon8 .ui-li-text-sub {
+  max-width: 70%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-main {
+  max-width: 60%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-sub {
+  max-width: 40%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar1 .ui-li-text-sub2 {
+  max-width: 20%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-bigicon-pgbar2 .ui-li-text-sub {
+  max-width: 55%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-main {
+  max-width: 80%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-sub {
+  max-width: 60%;
+}
+ul.ui-listview > li.ui-li-2line-bigicon-pgbar3 .ui-li-text-sub2 {
+  max-width: 20%;
+}
+ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-main, ul.ui-listview > li.ui-li-2line-thumb3 .ui-li-text-sub {
+  max-width: 75%;
+}
+ul.ui-listview > li.ui-li-3-4-1 {
+  font-size: 1rem;
+  padding: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-3-4-1 h1.ui-li-heading {
+  font-size: 1.3333333333333333rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+}
+ul.ui-listview > li.ui-li-3-4-5 h1.ui-li-heading {
+  display: inline-block;
+  width: 6.222222222222221rem;
+  height: 100%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn,
+ul.ui-listview > li.ui-li-email-name2-btn,
+ul.ui-listview > li.ui-li-email-name1,
+ul.ui-listview > li.ui-li-email-name2,
+ul.ui-listview > li.ui-li-email-name1-btn-warning,
+ul.ui-listview > li.ui-li-email-name2-btn-warning,
+ul.ui-listview > li.ui-li-email-name1-warning,
+ul.ui-listview > li.ui-li-email-name2-warning,
+ul.ui-listview > li.ui-li-email-name1-btn-attach,
+ul.ui-listview > li.ui-li-email-name2-btn-attach,
+ul.ui-listview > li.ui-li-email-name1-attach,
+ul.ui-listview > li.ui-li-email-name2-attach,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach,
+ul.ui-listview > li.ui-li-email-name1-warning-attach,
+ul.ui-listview > li.ui-li-email-name2-warning-attach {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 4.444444444444445rem;
+  min-height: 4.444444444444445rem;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-color-bar,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-color-bar {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 0.2777777777777778rem;
+  height: 0.5555555555555556rem;
+  background-color: #506bcf;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1 .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2 .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-checkbox,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-radio,
+ul.ui-listview > li.ui-li-email-name1 .ui-radio,
+ul.ui-listview > li.ui-li-email-name2 .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-on-press {
+  position: absolute;
+  right: auto;
+  left: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 0 0 -0.2222222222222222rem;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1 .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2 .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-checkbox.favorite,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-off,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-on,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-checkbox-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-radio,
+ul.ui-listview > li.ui-li-email-name1 .ui-radio,
+ul.ui-listview > li.ui-li-email-name2 .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-radio,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-off,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-on,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-off-press,
+ul.ui-listview > li.ui-li-email-name1-btn .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2 .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-icon-radio-on-press,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-icon-radio-on-press {
+  position: absolute;
+  left: auto;
+  right: 0.4444444444444444rem;
+  top: 0.2222222222222222rem;
+  width: 1.5555555555555554rem;
+  height: 1.6666666666666665rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1 .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2 .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-checkbox.favorite .ui-btn.ui-btn-icon-left .ui-btn-inner .ui-btn-text {
+  margin-left: 1.6666666666666665rem;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-sub2,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #d2d2d2;
+  left: 2.0555555555555554rem;
+  top: 3rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-sub3,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-text-sub3 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #646464;
+  right: 0.4444444444444444rem;
+  top: 3rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 30%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.0555555555555554rem;
+  top: 0.2222222222222222rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-btn .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2 .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #818181;
+  left: 2.0555555555555554rem;
+  top: 2rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 2.0555555555555554rem;
+  top: 0.2222222222222222rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-btn-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-warning .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #818181;
+  left: 3.388888888888889rem;
+  top: 2rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name2-btn-warning img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name1-warning img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name2-warning img.ui-li-icon-warning {
+  position: absolute;
+  left: 2.0555555555555554rem;
+  right: auto;
+  top: 2.1111111111111107rem;
+  width: 0.8333333333333333rem;
+  height: 0.8333333333333333rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 3.388888888888889rem;
+  top: 0.2222222222222222rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-btn-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-attach .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #818181;
+  left: 2.0555555555555554rem;
+  top: 2rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name2-btn-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name1-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name2-attach img.ui-li-icon-attach {
+  position: absolute;
+  left: 2.0555555555555554rem;
+  right: auto;
+  top: 0.4444444444444444rem;
+  width: 1.1111111111111112rem;
+  height: 1.1111111111111112rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-main,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 3.388888888888889rem;
+  top: 0.2222222222222222rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name2-warning-attach .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.1111111111111112rem;
+  color: #818181;
+  left: 3.388888888888889rem;
+  top: 2rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name1-warning-attach img.ui-li-icon-attach,
+ul.ui-listview > li.ui-li-email-name2-warning-attach img.ui-li-icon-attach {
+  position: absolute;
+  left: 2.0555555555555554rem;
+  right: auto;
+  top: 0.4444444444444444rem;
+  width: 1.1111111111111112rem;
+  height: 1.1111111111111112rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name1-warning-attach img.ui-li-icon-warning,
+ul.ui-listview > li.ui-li-email-name2-warning-attach img.ui-li-icon-warning {
+  position: absolute;
+  left: 2.0555555555555554rem;
+  right: auto;
+  top: 2.1111111111111107rem;
+  width: 0.8333333333333333rem;
+  height: 0.8333333333333333rem;
+  margin: 0 0;
+}
+ul.ui-listview > li.ui-li-email-name1-btn > .ui-btn,
+ul.ui-listview > li.ui-li-email-name2-btn > .ui-btn,
+ul.ui-listview > li.ui-li-email-name1-btn-warning > .ui-btn,
+ul.ui-listview > li.ui-li-email-name2-btn-warning > .ui-btn,
+ul.ui-listview > li.ui-li-email-name1-btn-attach > .ui-btn,
+ul.ui-listview > li.ui-li-email-name2-btn-attach > .ui-btn,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach > .ui-btn,
+ul.ui-listview > li.ui-li-email-name2-btn-warning-attach > .ui-btn {
+  position: absolute;
+  right: 2.444444444444444rem;
+  top: 24%;
+}
+ul.ui-listview > li.ui-li-email-name1-btn .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1 .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-btn-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-warning .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-btn-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-btn-warning-attach .ui-li-text-sub1,
+ul.ui-listview > li.ui-li-email-name1-warning-attach .ui-li-text-sub1 {
+  color: #008cd2;
+}
+ul.ui-listview > li.ui-li-1line-leftsub1 .ui-li-text-sub-left {
+  font-size: 0.8888888888888888rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  width: 5.194444444444444rem;
+  line-height: 1.6666666666666665rem;
+  margin-top: -0.5em;
+  vertical-align: top;
+}
+ul.ui-listview > li.ui-li-1line-leftsub1 .ui-li-text-main-right {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 5.194444444444444rem;
+  margin-top: -0.5em;
+  padding-left: 0.4444444444444444rem;
+  border-left: 1px #444444 solid;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 {
+  margin: 0;
+  height: 1.6666666666666665rem !important;
+  min-height: 1.6666666666666665rem;
+  padding-left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 .ui-li-text-sub-left {
+  font-size: 0.8888888888888888rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  width: 5.194444444444444rem;
+  line-height: 1.6666666666666665rem;
+  margin-top: -0.5em;
+  vertical-align: top;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 .ui-li-text-main-right {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 5.194444444444444rem;
+  margin-top: -0.5em;
+  padding-left: 0.4444444444444444rem;
+  border-left: 1px #444444 solid;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 img.ui-li-bigicon {
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+}
+ul.ui-listview > li.ui-li-1line-leftsub2 img.ui-li-bigicon {
+  display: block;
+  position: absolute;
+  top: 50%;
+  margin-top: -0.8888888888888888rem;
+  left: auto;
+  right: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-4-2-3 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.9444444444444442rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-sub {
+  color: #008cd2;
+}
+ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-main, ul.ui-listview > li.ui-li-4-2-3 .ui-li-text-sub {
+  max-width: 95%;
+}
+ul.ui-listview > li.ui-li-4-2-10 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 3.5555555555555554rem;
+  min-height: 3.5555555555555554rem;
+}
+ul.ui-listview > li.ui-li-4-2-10 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.6666666666666665rem;
+  left: 0.4444444444444444rem;
+  top: 1.6111111111111112rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-2-10 .ui-li-text-sub {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-2-10 .ui-li-text-main, ul.ui-listview > li.ui-li-4-2-10 .ui-li-text-sub {
+  max-width: 80%;
+}
+ul.ui-listview > li.ui-li-4-2-10 .ui-checkbox {
+  position: absolute;
+  right: 0.4444444444444444rem;
+  top: 50%;
+  margin: -1.1em 1.8055555555555554rem 0 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-4-2-11 .ui-li-text-sub-left {
+  font-size: 0.8888888888888888rem;
+  top: 50%;
+  left: 0.4444444444444444rem;
+  width: 5.194444444444444rem;
+  line-height: 1.6666666666666665rem;
+  margin-top: -0.5em;
+  vertical-align: top;
+}
+ul.ui-listview > li.ui-li-4-2-11 .ui-li-text-main-right {
+  font-size: 1.222222222222222rem;
+  top: 50%;
+  left: 5.194444444444444rem;
+  margin-top: -0.5em;
+  padding-left: 0.4444444444444444rem;
+  border-left: 1px #444444 solid;
+}
+ul.ui-listview > li.ui-li-4-2-11 .ui-li-text-main-right {
+  display: inline-block;
+  word-wrap: normal;
+}
+ul.ui-listview > li.ui-li-3line-dgroup1 {
+  margin: 0;
+  padding: 0 0.4444444444444444rem;
+  height: 4.444444444444445rem;
+  min-height: 4.444444444444445rem;
+}
+ul.ui-listview > li.ui-li-3line-dgroup1 .ui-li-text-main {
+  position: absolute;
+  font-size: 1.222222222222222rem;
+  line-height: 1.3333333333333333rem;
+  left: 0.4444444444444444rem;
+  top: 0.2777777777777778rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-3line-dgroup1 .ui-li-text-sub1 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 1.6111111111111112rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-3line-dgroup1 .ui-li-text-sub2 {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  line-height: 1.3333333333333333rem;
+  color: #646464;
+  left: 0.4444444444444444rem;
+  top: 2.944444444444444rem;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 90%;
+}
+ul.ui-listview > li.ui-li-4-3-2 {
+  height: 190px;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-4-3-2 .ui-li-thumb {
+  float: left;
+  height: 128px;
+  max-height: 128px;
+  width: 128px;
+  max-width: 128px;
+  left: 32px;
+  top: 28px;
+}
+ul.ui-listview > li.ui-li-4-3-2 span.contact_name_field {
+  position: absolute;
+  font-size: 1.0555555555555556rem;
+  color: #f9f9f9;
+  left: 184px;
+  top: 32px;
+  height: 54px;
+}
+ul.ui-listview > li.ui-li-4-3-2 span.contact_subname_field {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  color: #929292;
+  left: 184px;
+  top: 94px;
+}
+ul.ui-listview > li.ui-li-4-3-2 span.companyname_field {
+  position: absolute;
+  font-size: 0.8888888888888888rem;
+  color: #929292;
+  left: 184px;
+  top: 126px;
+}
+ul.ui-listview > div.ui-li-dialogue-editor-photo {
+  width: 160px;
+  left: 16px;
+  top: 34px;
+  position: absolute;
+}
+ul.ui-listview > div.ui-li-dialogue-editor-photo > img {
+  width: 128px;
+  height: 128px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 {
+  border-left: 0.4444444444444444rem #444444 solid;
+  border-top-width: 0px;
+  left: 160px;
+  width: 790px;
+  padding-left: 12px;
+  padding-right: 0px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 > .ui-field-contain {
+  margin: 0;
+  padding: 8px;
+  width: 782px;
+  /* wongi_1215 : Default Text */
+
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 > .ui-field-contain > input {
+  border: none;
+  outline: none;
+  width: 782px;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 > .ui-field-contain > div.ui-input-default-text {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  margin: 0px;
+  color: #464646;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1 > .ui-field-contain > div.ui-input-default-text.ui-input-default-hidden {
+  display: none;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-1.ui-li-expanded {
+  background-color: #000000;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 {
+  padding: 0px !important;
+  height: 130px;
+  border-left: 0.4444444444444444rem #444444 solid;
+  border-top-width: 0px;
+  left: 0px;
+  width: 962px;
+  font-size: 32px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > div.ui-li-dialogue-editor-border {
+  border-right: 1px #444444 solid;
+  width: 160px;
+  height: 130px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > div div.ui-li-dialogue-editor-2-label {
+  margin-left: 16px;
+  line-height: 32px;
+  position: absolute;
+  top: 50%;
+  margin-top: -16px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > .ui-field-contain {
+  margin: 0;
+  width: 676px;
+  position: absolute;
+  top: 50%;
+  margin-top: -16px;
+  left: 200px;
+  /* wongi_1215 : Default Text */
+
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > .ui-field-contain > input {
+  border: none;
+  outline: none;
+  width: 676px;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > .ui-field-contain > div.ui-input-default-text {
+  position: absolute;
+  top: 0;
+  width: 100%;
+  margin: 0px;
+  color: #464646;
+}
+ul.ui-listview > li.ui-li-dialogue-editor-2 > .ui-field-contain > div.ui-input-default-text.ui-input-default-hidden {
+  display: none;
+}
+ul.ui-listview > li.ui-li-dialogue {
+  border-left: 0.4444444444444444rem #444444 solid;
+  border-top-width: 0px;
+}
+ul.ui-listview > li.ui-li-dialogue.ui-li-divider {
+  height: 0.8888888888888888rem;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-divider {
+  height: 0.8888888888888888rem;
+  padding: 0px;
+}
+ul.ui-listview > li.ui-li-group-title {
+  padding-top: 0.8888888888888888rem;
+}
+ul.ui-listview > li.ui-li-group-title span {
+  padding-left: 0.4444444444444444rem;
+}
+ul.ui-listview > li.ui-li-3-button {
+  padding-left: 8px;
+  padding-right: 8px;
+  height: 60px;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn {
+  margin-left: 8px;
+  margin-right: 8px;
+  height: 74px;
+  width: 224px;
+  top: 24px;
+  position: absolute;
+  padding: 0px;
+  margin-top: 0px;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn .ui-btn-inner.ui-btn-hastxt {
+  padding-top: 0.6em;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn:nth-child(1) {
+  left: 0%;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn:nth-child(2) {
+  left: 33%;
+}
+ul.ui-listview > li.ui-li-3-button div.ui-btn:nth-child(3) {
+  left: 66%;
+}
+.ui-listview .ui-li-bubble-left img, .ui-listview .ui-li-bubble-right img, .ui-listview .ui-li-bubble-sos img {
+  position: relative;
+  min-width: 4.444444444444445rem;
+  min-height: 4.444444444444445rem;
+}
+.ui-listview .ui-li-bubble-left {
+  word-wrap: break-word;
+  -moz-border-radius-topright: 0.25rem;
+  -webkit-border-top-right-radius: 0.25rem;
+  border-top-right-radius: 0.25rem;
+  -moz-border-radius-bottomright: 0.25rem;
+  -webkit-border-bottom-right-radius: 0.25rem;
+  border-bottom-right-radius: 0.25rem;
+  font-size: 1.0555555555555556rem;
+  margin-top: 0.3333333333333333rem;
+  margin-bottom: 0.3333333333333333rem;
+  margin-left: 0;
+  margin-right: auto;
+  max-width: 80%;
+  min-width: 30%;
+  padding: 16px 22px 16px 16px;
+}
+.ui-listview .ui-li-bubble-left p, .ui-listview .ui-li-bubble-left span {
+  font-size: 1.0555555555555556rem;
+}
+.ui-listview .ui-li-bubble-right {
+  word-wrap: break-word;
+  -moz-border-radius-topleft: 0.25rem;
+  -webkit-border-top-left-radius: 0.25rem;
+  border-top-left-radius: 0.25rem;
+  -moz-border-radius-bottomleft: 0.25rem;
+  -webkit-border-bottom-left-radius: 0.25rem;
+  border-bottom-left-radius: 0.25rem;
+  margin: 12px 0% 12px 20%;
+  padding: 16px 16px 16px 22px;
+}
+.ui-listview .ui-li-bubble-date {
+  height: 40px;
+  font-size: 0.7222222222222222rem;
+  margin: 12px 0%;
+  padding: 0% 16px;
+  padding-top: 15px;
+}
+.ui-listview span.ui-li-bubble-time {
+  margin-left: 12px;
+  font-size: 0.7222222222222222rem;
+  display: inline-block;
+}
+.ui-listview .ui-li-expandable-shown .ui-li-expanded-icon {
+  background-image: url(images/00_button_expand_opened.png);
+  background-size: 100%;
+  position: absolute;
+  top: 50%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  margin-top: -0.8888888888888888rem;
+  right: 0.4444444444444444rem;
+}
+.ui-listview .ui-li-expandable-hidden .ui-li-expand-icon {
+  background-image: url(images/00_button_expand_closed.png);
+  background-size: 100%;
+  position: absolute;
+  top: 50%;
+  width: 1.7777777777777777rem;
+  height: 1.7777777777777777rem;
+  margin-top: -0.8888888888888888rem;
+  right: 0.4444444444444444rem;
+}
+.ui-listview .ui-li-expanded {
+  overflow: hidden;
+  -webkit-transition: all 0.2s ease;
+  -moz-transition: all 0.2s ease;
+  -o-transition: all 0.2s ease;
+  transition: all 0.2s ease;
+}
+.ui-listview .ui-li-expand-transition-show {
+  visibility: visible;
+}
+.ui-listview .ui-li-expand-transition-hide {
+  visibility: hidden;
+  height: 0px;
+  padding-top: 0px;
+  padding-bottom: 0px;
+  border: 0px;
+}
+/* Odd iPad positioning issue. */
+@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
+  .ui-li .ui-btn-text {
+    overflow: visible;
+  }
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-controlgroup .ui-radio-on, .ui-controlgroup .ui-radio-off.ui-btn-hover-s.ui-btn-down-s {
+  background: #e6e6e6;
+}
+.ui-controlgroup .ui-radio-off {
+  background: #3d3d3d;
+}
+.ui-controlgroup .ui-btn-inner .ui-corner-left .ui-controlgroup-first {
+  -moz-border-radius: .3em ;
+  -webkit-border-radius: .3em ;
+  border-radius: .3em ;
+}
+.ui-controlgroup .ui-btn-inner .ui-corner-right .ui-controlgroup-last {
+  -moz-border-radius: .3em ;
+  -webkit-border-radius: .3em ;
+  border-radius: .3em ;
+}
+.ui-controlgroup .ui-radio-off.ui-btn-hover-s.ui-btn-down-s .ui-btn-inner, .ui-controlgroup .ui-radio-on .ui-btn-inner {
+  color: #000000;
+}
+.ui-controlgroup .ui-radio-off .ui-btn-inner {
+  color: #909090;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-option-header {
+  overflow: hidden;
+  background: #484848;
+}
+.ui-option-header-1-row {
+  height: 2.944444444444444rem;
+  border: none;
+}
+.ui-option-header-2-row {
+  height: 5.444444444444444rem;
+  border: none;
+}
+.ui-option-header-row-1 {
+  height: 2.944444444444444rem;
+}
+.ui-option-header-row-2 {
+  height: 5.444444444444444rem;
+  margin-top: -2px;
+  padding: 0rem 0.1388888888888889rem 0.16666666666666666rem 0.1388888888888889rem;
+}
+.ui-option-header-row-2 div {
+  margin-top: 0.1388888888888889rem;
+  margin-bottom: 0.1388888888888889rem;
+}
+.ui-option-header .ui-btn {
+  display: block;
+  margin: 0.08333333333333333rem 0.1388888888888889rem 0.1388888888888889rem 0.1388888888888889rem;
+}
+.ui-option-header .ui-input-search .ui-btn {
+  display: none;
+}
+.ui-option-header .ui-btn-text {
+  line-height: 0.9444444444444444rem;
+}
+.ui-option-header .ui-btn-down-s.ui-btn-hover-s .ui-btn-inner, .ui-option-header .ui-btn-down-s .ui-btn-inner {
+  background: #2384b6;
+}
+.ui-option-header .ui-btn-hover-s .ui-btn-inner, .ui-option-header .ui-btn-up-s .ui-btn-inner {
+  background: #202020;
+}
+.ui-option-header .ui-btn-inner {
+  padding-top: 0.16666666666666666rem;
+  padding-bottom: 0.16666666666666666rem;
+  color: #f9f9f9;
+}
+.ui-option-header .ui-controlgroup-horizontal .ui-btn {
+  display: inline-block !important;
+  margin: -0.08333333333333333rem !important;
+}
+.ui-option-header .ui-controlgroup, .ui-option-header fieldset.ui-controlgroup {
+  margin-bottom: 0px !important;
+}
+.ui-option-header .ui-controlgroup-horizontal .ui-corner-left {
+  margin-left: 0.1388888888888889rem !important;
+}
+.ui-option-header .ui-controlgroup-horizontal .ui-corner-right {
+  margin-right: 0.1388888888888889rem !important;
+}
+.ui-option-header-triangle-arrow {
+  top: -0.2777777777777778rem;
+  height: 0.2777777777777778rem;
+  width: 100%;
+  position: relative;
+  margin-bottom: -0.2777777777777778rem;
+}
+.ui-header.ui-option-header-resizing .ui-option-header .ui-btn {
+  background: transparent;
+  border: none;
+  width: 100%;
+  top: 0.4444444444444444rem;
+}
+.ui-header.ui-option-header-resizing .ui-option-header .ui-btn .ui-btn-inner {
+  width: 92%;
+  padding: 0.66em 0px 0.66em;
+  margin: 0px auto;
+}
+.ui-header.ui-option-header-resizing .ui-option-header .input-search-bar .ui-btn {
+  width: 28%;
+  /* 134  * @unit_base; */
+
+}
+/*
+.ui-triangle {
+  color : @color_optionheader_Background; 
+
+  position: absolute;
+  bottom: 0px;
+  border-style: solid;
+	
+	margin-left : -10 * @unit_base;
+
+	border-left-width : 10 * @unit_base;
+	border-top-width : 0 * @unit_base;
+	border-right-width :10 * @unit_base;
+	border-bottom-width : 10 * @unit_base;
+	border-bottom-color : @color_optionheader_Background;
+}
+*/
+.ui-triangle-image {
+  background-image: url(images/00_winset_control_top_arrow.png);
+  background-size: 100% 100%;
+  position: absolute;
+  width: 0.7777777777777777rem;
+  height: 0.6666666666666666rem;
+  left: 50%;
+}
+.ui-icon-optiontray {
+  background-size: 100% 100%;
+  background-image: url(images/00_winset_btn_optiontray.png);
+}
+.ui-header .ui-btn .ui-btn-icon-only {
+  padding: 0 0 0 0;
+  height: 100%;
+}
+.ui-header .ui-btn .ui-btn-icon-only .ui-icon-optiontray {
+  width: 1.3333333333333333rem;
+  height: 1.0555555555555556rem;
+  top: 0.5rem;
+  /* temporary center align */
+
+  left: 1.0277777777777777rem;
+}
+/*
+* jQuery Mobile Framework
+* Copyright (c) jQuery Project
+* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
+*/
+/*** less definitions ***/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+ul.ui-virtual-list-container > li.position_absolute {
+  position: absolute;
+}
+ul.ui-virtual-list-container > ul.position_absolute {
+  position: absolute;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-scrollview-clip {
+  position: relative;
+}
+.ui-scrolllistview .ui-li-divider {
+  z-index: 10;
+}
+.ui-scrollbar {
+  position: absolute;
+  overflow: hidden;
+  opacity: 0;
+}
+.ui-scrollbar-visible {
+  opacity: 1;
+}
+.ui-scrollbar-y {
+  top: 0.05555555555555555rem;
+  right: 0.05555555555555555rem;
+  bottom: 0.05555555555555555rem;
+  width: 0.2777777777777778rem;
+}
+.ui-scrollbar-x {
+  right: 0.05555555555555555rem;
+  bottom: 0.05555555555555555rem;
+  left: 0.05555555555555555rem;
+  height: 0.2777777777777778rem;
+}
+.ui-scrollbar-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-scrollbar-thumb {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background-color: #44444a;
+}
+.ui-scrollbar-y .ui-scrollbar-thumb {
+  width: 0.2777777777777778rem;
+  height: 100%;
+}
+.ui-scrollbar-x .ui-scrollbar-thumb {
+  width: 100%;
+  height: 0.2777777777777778rem;
+}
+/*
+ * the values below are for the group index
+ */
+/*
+ * padding here set to zero - otherwise the list scrolls underneith the top heading and can be seen above it
+ */
+.ui-content.ui-scrollview-clip {
+  padding: 0;
+  padding-bottom: 0.4444444444444444rem;
+}
+.ui-content.ui-scrollview-clip > div.ui-scrollview-view {
+  margin: 0;
+  padding: 0.4444444444444444rem;
+}
+/*
+ * this seems to effect how far the top divider is place wrt to the scrollview
+ * without this, it is placed too high, so it is clipped in half
+ */
+.ui-content.ui-scrollview-clip > .ui-listview.ui-scrollview-view {
+  margin: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-hsvpicker .hsvpicker-clrchannel-container {
+  display: table;
+  padding-left: 0.75rem;
+  padding-right: 0.75rem;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-arrow-btn-container {
+  display: table-cell;
+  vertical-align: middle;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-arrow-btn {
+  float: left;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container {
+  float: left;
+  position: relative;
+  width: 8.333333333333332rem;
+  height: 1.0555555555555556rem;
+  margin-left: 0px;
+  margin-right: 0px;
+  margin-top: 0px;
+  margin-bottom: 0px;
+  padding-left: 0.2777777777777778rem;
+  padding-right: 0.2777777777777778rem;
+  padding-top: 0.16666666666666669rem;
+  padding-bottom: 0.16666666666666669rem;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container .hsvpicker-clrchannel-mask {
+  position: absolute;
+  width: 8.333333333333332rem;
+  height: 1.0555555555555556rem;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container .hsvpicker-clrchannel-mask-black {
+  background: #000000;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container .hsvpicker-clrchannel-mask-white {
+  background: #ffffff;
+}
+.ui-hsvpicker .hsvpicker-clrchannel-container .hsvpicker-clrchannel-masks-container .hsvpicker-clrchannel-selector {
+  position: absolute;
+  left: 0rem;
+  top: 0rem;
+  width: 0.2777777777777778rem;
+  height: 1.1111111111111112rem;
+  border: 0.1388888888888889rem solid black;
+}
+.ui-popupwindow .colorpickerbutton-popup-container-style {
+  display: table;
+  width: 50%;
+  margin: 0 auto;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.todons-colorpalette-disabled .colorpalette-table .colorpalette-choice-active {
+  border-color: #999999 !important;
+}
+.ui-colorpalette {
+  display: table;
+  padding-left: 0.6666666666666666rem;
+  padding-right: 0.6666666666666666rem;
+  padding-top: 0.41666666666666663rem;
+  padding-bottom: 0.41666666666666663rem;
+}
+.ui-colorpalette .colorpalette-preview-container {
+  padding-top: 1.3333333333333333rem;
+  padding-bottom: 1.0833333333333333rem;
+  display: table;
+  margin: auto;
+}
+.ui-colorpalette .colorpalette-preview-container .colorpalette-preview {
+  display: table;
+  margin: auto;
+  width: 8.222222222222223rem;
+  height: 2.8055555555555554rem;
+  border: #c0c0c0 0.1111111111111111rem solid;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-bottom-row {
+  display: table-row;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-normal-row {
+  display: table-row;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-choice-container-left {
+  display: table-cell;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-choice-container-rest {
+  display: table-cell;
+  padding-bottom: 0.4444444444444444rem;
+  padding-left: 1.0555555555555556rem;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-normal-row .colorpalette-choice-container-left {
+  padding-bottom: 0.4444444444444444rem;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-choice {
+  width: 1.2777777777777777rem;
+  height: 1.2777777777777777rem;
+  border-width: 0.1111111111111111rem;
+  border-style: solid;
+  border-color: #c0c0c0;
+}
+.ui-colorpalette .colorpalette-table .colorpalette-choice-active {
+  border-color: #d9931a;
+}
+label.colorpickerbutton_label.ui-input-text {
+  display: block !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-colortitle h1 {
+  margin-left: 0.2777777777777778rem;
+}
+.todons-colortitle-disabled h1 {
+  color: #888888;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-datefield {
+  display: inline-block;
+}
+.ui-datefield div {
+  display: inline-block;
+}
+.ui-datefield div span {
+  margin-right: 0.5555555555555556rem;
+}
+.ui-datefield div .ui-datefield-selected {
+  color: #008cd2;
+}
+.ui-datefield div .ui-datefield-ampm {
+  margin-right: 0;
+  margin-top: 0;
+  top: -0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-datefield div .ui-datefield-ampm span.ui-btn-inner.ui-btn-hastxt {
+  margin-right: 0;
+  padding: 0 0.6944444444444444rem;
+}
+.ui-datefield div .ui-datefield-ampm span.ui-btn-inner.ui-btn-hastxt span {
+  margin-right: 0;
+}
+.ui-datefield .ui-datefield-tab {
+  display: inline-block;
+  min-width: 1.6666666666666665rem;
+}
+.ui-datetimepicker-selector div ul {
+  padding: 0;
+  display: inline;
+  list-style: none;
+  vertical-align: middle;
+  margin: 0;
+}
+.ui-datetimepicker-selector div ul li {
+  font-size: 1.222222222222222rem;
+  float: left;
+  padding: 0.8333333333333333rem 0.2222222222222222rem 0 0.2222222222222222rem;
+  max-width: 5.555555555555555rem;
+  min-width: 5.555555555555555rem;
+}
+.ui-datetimepicker-selector div ul li a.ui-link {
+  text-decoration: none;
+  color: #6997ad;
+}
+.ui-datetimepicker-selector div ul li a.ui-link:hover {
+  color: #6997ad;
+}
+.ui-datetimepicker-selector div ul li.current a.ui-link {
+  color: #f9f9f9;
+}
+.ui-datetimepicker {
+  left: 0 !important;
+  padding: 0;
+}
+.ui-datetimepicker .ui-popupwindow-padding {
+  background: #008cd2 !important;
+  border-radius: 0 !important;
+  -webkit-border-radius: 0 !important;
+  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.6) !important;
+  border-width: 0 !important;
+  text-align: center !important;
+}
+.ui-datetimepicker .ui-popupwindow-padding div {
+  height: 2.944444444444444rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-popupwindow-screen {
+  background: #000000;
+  opacity: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1200;
+}
+.ui-popupwindow {
+  position: absolute;
+  z-index: 1201 !important;
+  background: #536771;
+  color: white;
+  padding: 0.05555555555555555rem 0.05555555555555555rem;
+}
+.ui-popupwindow .center_info {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+}
+.ui-popupwindow .center_info .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_info .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_title {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_title .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_title .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_title .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_basic_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_1btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_basic_1btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_basic_1btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_1btn .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .center_basic_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_2btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_basic_2btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_basic_2btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_2btn .popup-button-bg .ui-btn {
+  width: 7.611111111111111rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_basic_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_basic_3btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_basic_3btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_basic_3btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_basic_3btn .popup-button-bg .ui-btn {
+  width: 5.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_title_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_1btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_title_1btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_title_1btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_title_1btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_title_1btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_1btn .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .center_title_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_2btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_title_2btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_title_2btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_title_2btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_title_2btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_2btn .popup-button-bg .ui-btn {
+  width: 7.611111111111111rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_title_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_title_3btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_title_3btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_title_3btn .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_title_3btn .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_title_3btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_title_3btn .popup-button-bg .ui-btn {
+  width: 5.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_button_vertical {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_button_vertical .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_button_vertical .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_button_vertical .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 1px;
+  padding-bottom: 0.4444444444444444rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_button_vertical .popup-button-bg .ui-btn {
+  width: 9.888888888888888rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0.4444444444444444rem;
+  margin-bottom: 0rem;
+  margin-left: auto;
+  margin-right: auto;
+}
+.ui-popupwindow .center_checkbox {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_checkbox .popup-text {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+}
+.ui-popupwindow .center_checkbox .popup-text p {
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg {
+  font-size: 1.1666666666666665rem;
+  background: #213c49;
+  width: 100%;
+  padding-top: 0rem;
+  padding-bottom: 0.611111111111111rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg .ui-checkbox .ui-btn {
+  text-align: center;
+  background: #213c49;
+  border: 0rem;
+}
+.ui-popupwindow .center_checkbox .popup-check-bg .ui-checkbox .ui-btn .ui-btn-inner {
+  border: 0rem;
+}
+.ui-popupwindow .center_checkbox .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_checkbox .popup-button-bg .ui-btn {
+  width: 7.611111111111111rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_liststyle_1btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: black;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-scroller-bg .ui-listview {
+  height: 14.222222222222221rem;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_1btn .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .center_liststyle_2btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: black;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-scroller-bg .ui-listview {
+  height: 14.222222222222221rem;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_2btn .popup-button-bg .ui-btn {
+  width: 7.611111111111111rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_liststyle_3btn {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-title {
+  font-size: 1.0555555555555556rem;
+  height: 1.7777777777777777rem;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-title p {
+  margin: 0rem 0rem;
+  padding: 0.3611111111111111rem 0rem;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-scroller-bg {
+  width: 100%;
+  overflow: hidden;
+  background: black;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-scroller-bg .ui-listview {
+  height: 14.222222222222221rem;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_liststyle_3btn .popup-button-bg .ui-btn {
+  width: 5.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin-top: 0rem;
+  margin-bottom: 0rem;
+  margin-left: 0.1388888888888889rem;
+  margin-right: 0.1388888888888889rem;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .center_progressbar .popup-text {
+  font-size: 0.7222222222222222rem;
+  font-color: #999999;
+  background: #213c49;
+  width: 100%;
+  height: 1.9444444444444444rem;
+}
+.ui-popupwindow .center_progressbar .popup-text p {
+  height: 100%;
+  text-align: center;
+  padding: 0.611111111111111rem 0.4444444444444444rem 0rem 0.4444444444444444rem;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg {
+  font-size: 0.7222222222222222rem;
+  font-color: #999999;
+  background: #213c49;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 1.3333333333333333rem;
+  padding: 0rem 0.4444444444444444rem 0rem 0.4444444444444444rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar .popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 1.3333333333333333rem;
+  padding: 0rem 0.4444444444444444rem 0rem 0.4444444444444444rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popupwindow .center_progressbar .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .center_progressbar .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .center_progressbar .popup-progress-bg {
+  background: #213c49;
+  width: 100%;
+  height: 100%;
+}
+.ui-popupwindow .centertext_progressbar {
+  display: -moz-box;
+  display: -webkit-box;
+  display: box;
+  -moz-box-orient: vertical;
+  -webkit-box-orient: vertical;
+  box-orient: vertical;
+  -moz-box-align: center;
+  -webkit-box-align: center;
+  box-align: center;
+  -moz-box-pack: center;
+  -webkit-box-pack: center;
+  box-pack: center;
+  text-align: center;
+}
+.ui-popupwindow .centertext_progressbar .popup-text {
+  font-size: 0.7222222222222222rem;
+  font-color: #999999;
+  background: #213c49;
+  width: 100%;
+  padding-top: 0.611111111111111rem;
+  padding-bottom: 0.4444444444444444rem;
+}
+.ui-popupwindow .centertext_progressbar .popup-text p {
+  text-align: center;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg {
+  font-size: 0.7222222222222222rem;
+  font-color: #999999;
+  background: #213c49;
+  width: 100%;
+  vertical-align: middle;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg .text-left {
+  width: 40%;
+  height: 1.1111111111111112rem;
+  padding: 0.4444444444444444rem 0.4444444444444444rem 0.611111111111111rem 0.4444444444444444rem;
+  text-align: left;
+  display: inline-block;
+}
+.ui-popupwindow .centertext_progressbar .popup-text-bottom-bg .text-right {
+  width: 40%;
+  height: 1.1111111111111112rem;
+  padding: 0.4444444444444444rem 0.4444444444444444rem 0.611111111111111rem 0.4444444444444444rem;
+  text-align: right;
+  display: inline-block;
+}
+.ui-popupwindow .centertext_progressbar .popup-button-bg {
+  font-size: 0.8888888888888888rem;
+  background: #565d60;
+  width: 100%;
+  padding-top: 0.3055555555555555rem;
+  padding-bottom: 0.3055555555555555rem;
+  vertical-align: middle;
+}
+.ui-popupwindow .centertext_progressbar .popup-button-bg .ui-btn {
+  width: 11.166666666666666rem;
+  height: 2.0555555555555554rem;
+  margin: auto;
+}
+.ui-popupwindow .centertext_progressbar .popup-progress-bg {
+  background: #213c49;
+  width: 100%;
+  height: 100%;
+}
+.ui-popupwindow > .ui-volumecontrol {
+  display: table;
+  margin: auto;
+  background: rgba(0, 0, 0, 0.666667);
+  width: 11.555555555555555rem;
+  height: 18.777777777777775rem;
+  padding-top: 0.611111111111111rem;
+}
+.ui-popupwindow > .ui-volumecontrol h1 {
+  font-size: 1.1666666666666665rem;
+  display: table;
+  margin: auto;
+  color: #c0c0c0;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-volumecontrol-icon {
+  display: table;
+  width: 100%;
+  height: 3.5555555555555554rem;
+  padding-top: 0.5833333333333333rem;
+  padding-bottom: 0.5833333333333333rem;
+  padding-left: 4.583333333333333rem;
+  padding-right: 4.583333333333333rem;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-volumecontrol-indicator {
+  display: table;
+  width: 100%;
+  height: 11.666666666666666rem;
+  padding-left: 1.8888888888888888rem;
+  padding-right: 1.8888888888888888rem;
+}
+.ui-popupwindow > .ui-volumecontrol .ui-corner-all {
+  -moz-border-radius: 0.3em !important;
+  -webkit-border-radius: 0.3em !important;
+  border-radius: 0.3em !important;
+}
+.ui-popupwindow-corner-all {
+  -moz-border-radius: 0em !important;
+  -webkit-border-radius: 0em !important;
+  border-radius: 0em !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-ctxpopup {
+  display: table;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-triangle-top {
+  top: 2px;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-triangle-left {
+  left: 2px;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-triangle-right {
+  right: 2px;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-triangle-bottom {
+  bottom: 2px;
+}
+.ui-ctxpopup .ui-ctxpopup-row {
+  display: table-row;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-ctxpopup-cell {
+  display: table-cell;
+}
+.ui-ctxpopup .ui-ctxpopup-row .ui-popupwindow-padding {
+  background: #2d2d2d;
+  border: none;
+  -webkit-box-shadow: 0rem 0rem 0.3333333333333333rem rgba(0, 0, 0, 0.6);
+  box-shadow: 0rem 0rem 0.3333333333333333rem rgba(0, 0, 0, 0.6);
+  -webkit-border-radius: 0.3em;
+  border-radius: 0.3em;
+}
+.ui-ctxpopup .ui-listview li.ui-btn-up-s, .ui-ctxpopup .ui-listview li.ui-btn-hover-s {
+  background: transparent;
+}
+.ui-ctxpopup .ui-listview li.ui-btn-down-s {
+  background: #0a8cd2;
+}
+.ui-ctxpopup .ui-listview li:last-child {
+  border-bottom-left-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-ctxpopup .ui-listview li:first-child {
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-ctxpopup .ui-listview {
+  border: none;
+}
+.ui-ctxpopup .ui-listview > .ui-li {
+  padding: 0 0.19444444444444442rem;
+}
+.ui-ctxpopup .ui-listview > .ui-li:last-child {
+  border: none;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn {
+  padding: 0;
+  background: transparent;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn .ui-btn-icon-only {
+  width: 3.5555555555555554rem;
+  height: 2.5555555555555554rem;
+  padding: 0;
+}
+.ui-ctxpopup .horizontal .icon .ui-btn .ui-icon {
+  padding: 0.8888888888888888rem 0;
+  height: inherit;
+  width: inherit;
+  margin: 0;
+  background-position: center;
+  -moz-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -o-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -webkit-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  background-size: 1.7777777777777777rem 1.7777777777777777rem;
+}
+.ui-ctxpopup .horizontal .text {
+  padding: 0 0.5555555555555556rem;
+}
+.ui-ctxpopup .horizontal a.ui-link {
+  color: #f9f9f9;
+  text-decoration: none;
+}
+.ui-ctxpopup .horizontal table {
+  border: none;
+  border-spacing: 0;
+}
+.ui-ctxpopup .horizontal td {
+  border-left: 0.027777777777777776rem solid #464646;
+  border-right: 0.027777777777777776rem solid #000000;
+  border-top: 0.027777777777777776rem solid #000000;
+  border-bottom: 0.027777777777777776rem solid #464646;
+}
+.ui-ctxpopup .horizontal td:first-of-type {
+  border-left: none;
+}
+.ui-ctxpopup .horizontal td:last-of-type {
+  border-right: none;
+}
+.ui-ctxpopup .horizontal tr:first-of-type > td {
+  border-top: none;
+}
+.ui-ctxpopup .horizontal tr:last-of-type > td {
+  border-bottom: none;
+}
+.ui-ctxpopup .horizontal tr:first-of-type > td:first-of-type {
+  border-top-left-radius: 0.3em;
+}
+.ui-ctxpopup .horizontal tr:first-of-type > td:last-of-type {
+  border-top-right-radius: 0.3em;
+}
+.ui-ctxpopup .horizontal tr:last-of-type > td:first-of-type {
+  border-bottom-left-radius: 0.3em;
+}
+.ui-ctxpopup .horizontal tr:last-of-type > td:last-of-type {
+  border-bottom-right-radius: 0.3em;
+}
+.ui-ctxpopup .horizontal ul {
+  padding: 0;
+  display: inline-block;
+  list-style: none;
+  vertical-align: middle;
+  margin: 0;
+}
+.ui-ctxpopup .horizontal li {
+  line-height: 2.5555555555555554rem;
+  min-height: 2.5555555555555554rem;
+  float: left;
+  display: inline-block;
+  border-left: 0.027777777777777776rem solid #464646;
+  border-right: 0.027777777777777776rem solid #000000;
+  text-align: center;
+}
+.ui-ctxpopup .horizontal li:first-of-type {
+  border-top-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+  border-left: none;
+}
+.ui-ctxpopup .horizontal li:last-of-type {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+  border-right: none;
+  margin-right: 0;
+}
+.ui-ctxpopup .horizontal li:active, .ui-ctxpopup .horizontal td:active {
+  background: #0a8cd2;
+}
+.ui-ctxpopup .button table .ui-btn {
+  margin: 0.2222222222222222rem;
+  padding: 0;
+  height: 2.0555555555555554rem;
+  width: 4.777777777777778rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+@-webkit-keyframes ui-scale-animation {
+  from {
+    -webkit-transform: scalex(0);
+  }
+  to {
+    -webkit-transform: scalex(1);
+  }
+}
+.ui-progressbar-value {
+  background-image: url(images/00_winset_list_progress_bar.png);
+  height: 100%;
+}
+.ui-progressbar {
+  position: relative;
+  background-image: url(images/00_winset_list_progress_bg.png);
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  height: 0.4444444444444444rem;
+}
+.ui-progress-bg {
+  position: relative;
+  top: 0;
+  background-image: url(images/00_winset_list_progress_bg.png);
+  width: 100%;
+  height: 0.4444444444444444rem;
+}
+.ui-progress-bar {
+  position: relative;
+  top: -0.4444444444444444rem;
+  width: 100%;
+  height: 0.4444444444444444rem;
+  background-image: url(images/00_winset_list_progress_bar.png);
+  -webkit-animation: ui-scale-animation 5s infinite linear;
+  -webkit-transform-origin: 0% 0%;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* Progress - circle style */
+@-webkit-keyframes ui-rotate-animation {
+  from {
+    -webkit-transform: rotate(0deg);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+  }
+}
+.ui-progress-container-circle-bg {
+  position: relative;
+  margin-top: 0.027777777777777776rem;
+  margin-bottom: 0.027777777777777776rem;
+  width: 100%;
+  height: 1.7777777777777777rem;
+}
+.ui-progress-container-circle {
+  position: relative;
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  height: 1.7777777777777777rem;
+  width: 1.7777777777777777rem;
+  float: right;
+  vertical-align: middle;
+}
+.ui-progress-circle {
+  position: relative;
+  top: 0;
+  height: 1.7777777777777777rem;
+  width: 1.7777777777777777rem;
+  background: url(images/process/00_winset_list_process_01.png) no-repeat;
+  -moz-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -o-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -webkit-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  background-size: 1.7777777777777777rem 1.7777777777777777rem;
+}
+.ui-progress-circle-running {
+  -webkit-animation: ui-rotate-animation 1s infinite linear;
+}
+/* Progress - pending style */
+@-webkit-keyframes ui-move-animation {
+  from {
+    -webkit-transform: translatey(-0.8888888888888888rem);
+  }
+  to {
+    -webkit-transform: translatey(0);
+  }
+}
+.ui-progress-container-pending {
+  position: relative;
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  height: 0.4444444444444444rem;
+  overflow: hidden;
+}
+.ui-progress-pending {
+  position: relative;
+  top: 0;
+  width: 100%;
+  height: 1.3333333333333333rem;
+  padding-top: 0;
+  padding-bottom: 0;
+  background: -webkit-linear-gradient(-45deg, transparent, transparent 25%, #008cd2 25%, #008cd2 50%, transparent 50%, transparent 75%, #008cd2 75%);
+  background: -webkit-gradient(linear, left top, right bottom, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(25%, rgba(0, 0, 0, 0)), color-stop(25%, #008cd2), color-stop(50%, #008cd2), color-stop(50%, rgba(0, 0, 0, 0)), color-stop(75%, rgba(0, 0, 0, 0)), color-stop(75%, #008cd2));
+  background-color: #373737;
+  -moz-background-size: 0.8888888888888888rem 0.8888888888888888rem;
+  -o-background-size: 0.8888888888888888rem 0.8888888888888888rem;
+  -webkit-background-size: 0.8888888888888888rem 0.8888888888888888rem;
+  background-size: 0.8888888888888888rem 0.8888888888888888rem;
+}
+.ui-progress-pending-running {
+  -webkit-animation: ui-move-animation 0.5s infinite linear;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+label.ui-slider {
+  display: block;
+}
+input.ui-slider-input {
+  display: inline-block;
+  width: 1.3888888888888888rem;
+}
+select.ui-slider-switch {
+  display: none;
+}
+.ui-slider-bg, .ui-slider-icon-bg {
+  position: relative;
+  margin-left: 0.8888888888888888rem;
+  margin-right: 0.8888888888888888rem;
+  margin-bottom: 0.2em;
+  vertical-align: middle;
+}
+.ui-slider-icon-bg {
+  margin-left: 2.6666666666666665rem;
+  margin-right: 2.6666666666666665rem;
+}
+.ui-slider-left-volume, .ui-slider-left-bright {
+  position: absolute;
+  top: -0.2em;
+  left: -2.6666666666666665rem;
+  height: 2.2222222222222223rem;
+  width: 2.2222222222222223rem;
+  vertical-align: middle;
+  background: url(images/00_slider_btn_brightness01.png) no-repeat;
+  -moz-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -o-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -webkit-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  background-size: 2.2222222222222223rem 2.2222222222222223rem;
+}
+.ui-slider-left-volume {
+  background: url(images/00_slider_btn_volume01.png) no-repeat;
+  -moz-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -o-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -webkit-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  background-size: 2.2222222222222223rem 2.2222222222222223rem;
+}
+.ui-slider-right-volume, .ui-slider-right-bright {
+  position: absolute;
+  top: -0.2em;
+  right: -2.6666666666666665rem;
+  height: 2.2222222222222223rem;
+  width: 2.2222222222222223rem;
+  vertical-align: middle;
+  background: url(images/00_slider_btn_brightness02.png) no-repeat;
+  -moz-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -o-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -webkit-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  background-size: 2.2222222222222223rem 2.2222222222222223rem;
+}
+.ui-slider-right-volume {
+  background: url(images/00_slider_btn_volume02.png) no-repeat;
+  -moz-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -o-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  -webkit-background-size: 2.2222222222222223rem 2.2222222222222223rem;
+  background-size: 2.2222222222222223rem 2.2222222222222223rem;
+}
+.ui-slider-left-text {
+  position: absolute;
+  top: -0.2em;
+  left: -2.6666666666666665rem;
+  height: 2.2222222222222223rem;
+  width: 2.2222222222222223rem;
+  text-align: center;
+  color: #646464;
+}
+.ui-slider-right-text {
+  position: absolute;
+  top: -0.2em;
+  right: -2.6666666666666665rem;
+  height: 2.2222222222222223rem;
+  width: 2.2222222222222223rem;
+  text-align: center;
+  color: #646464;
+}
+div.ui-slider {
+  display: inline-block;
+  overflow: visible;
+  height: 0.4444444444444444rem;
+  width: 100%;
+  background-image: url(images/00_winset_list_progress_bg.png);
+}
+div.ui-slider .ui-btn {
+  top: 0.15em !important;
+}
+div.ui-slider .ui-btn-inner {
+  padding: 0.4em 0rem;
+}
+div.ui-slider .ui-btn-text {
+  color: #2a6d8c;
+}
+a.ui-slider-handle {
+  position: relative;
+  z-index: 10;
+  top: -0.5833333333333333rem;
+  width: 1.611111111111111rem;
+  height: 1.611111111111111rem;
+  margin-top: -0.8055555555555555rem;
+  margin-left: -0.8055555555555555rem;
+  color: #2a6d8c;
+  background: url(images/00_slider_handle.png) no-repeat;
+  -moz-background-size: 1.611111111111111rem 1.611111111111111rem;
+  -o-background-size: 1.611111111111111rem 1.611111111111111rem;
+  -webkit-background-size: 1.611111111111111rem 1.611111111111111rem;
+  background-size: 1.611111111111111rem 1.611111111111111rem;
+}
+.ui-slider-popup {
+  position: absolute !important;
+  width: 2.833333333333333rem;
+  height: 2.833333333333333rem;
+  text-align: center;
+  padding-top: 0.5em;
+  z-index: 100;
+  opacity: 0.9;
+  background: url(images/00_slider_popup_bg.png) no-repeat;
+  -moz-background-size: 2.833333333333333rem 2.833333333333333rem;
+  -o-background-size: 2.833333333333333rem 2.833333333333333rem;
+  -webkit-background-size: 2.833333333333333rem 2.833333333333333rem;
+  background-size: 2.833333333333333rem 2.833333333333333rem;
+}
+.ui-slider-bar {
+  position: absolute;
+  top: 0.8em;
+  height: 0.4444444444444444rem;
+  width: 0;
+  background-image: url(images/00_winset_list_progress_bar.png);
+}
+.ui-slider-handle-press {
+  position: absolute;
+  z-index: 15;
+  width: 1.611111111111111rem;
+  height: 1.611111111111111rem;
+  background: url(images/00_slider_handle_press.png) no-repeat;
+  -moz-background-size: 1.611111111111111rem 1.611111111111111rem;
+  -o-background-size: 1.611111111111111rem 1.611111111111111rem;
+  -webkit-background-size: 1.611111111111111rem 1.611111111111111rem;
+  background-size: 1.611111111111111rem 1.611111111111111rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-imageslider {
+  position: relative;
+  width: 100%;
+}
+.ui-imageslider-bg {
+  display: none;
+  position: absolute;
+  text-align: center;
+  width: 100%;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* tickernoti */
+@-webkit-keyframes ui-ticker-show {
+  from {
+    opacity: 0;
+    -webkit-transform: translatey(-2.7777777777777777rem);
+    top: -2.7777777777777777rem;
+  }
+  to {
+    opacity: 1;
+    -webkit-transform: translatey(0);
+    top: 0;
+  }
+}
+@-webkit-keyframes ui-ticker-hide {
+  from {
+    opacity: 1;
+    -webkit-transform: translatey(0);
+    top: 0;
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translatey(-2.7777777777777777rem);
+    top: -2.7777777777777777rem;
+  }
+}
+.ui-ticker {
+  position: fixed;
+  display: none;
+  left: 0;
+  width: 100%;
+  height: 2.7777777777777777rem;
+  z-index: 2147483547;
+  background: #6c6c6c;
+}
+.ui-ticker.fix {
+  display: block;
+}
+.ui-ticker.show {
+  display: block;
+  -webkit-animation: ui-ticker-show 0.8s 1 ease;
+  top: 0;
+}
+.ui-ticker.hide {
+  display: block;
+  -webkit-animation: ui-ticker-hide 0.8s 1 ease;
+  top: -2.7777777777777777rem;
+}
+.ui-ticker-btn {
+  position: relative;
+  height: 1.5rem;
+  margin-top: 0.6388888888888888rem;
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  vertical-align: middle;
+  float: right;
+}
+.ui-ticker-btn .ui-btn-inner {
+  padding: 0.3em 0.7em;
+}
+.ui-ticker-icon {
+  position: absolute;
+  top: 0;
+  height: 1.7777777777777777rem;
+  width: 1.7777777777777777rem;
+  margin-top: 0.5rem;
+  margin-bottom: 0.5rem;
+  margin-left: 0.4444444444444444rem;
+  margin-right: 0.4444444444444444rem;
+  vertical-align: middle;
+  /* FIXME: please fix this image file */
+
+  background: url(images/00_button_call.png) no-repeat;
+  -moz-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -o-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  -webkit-background-size: 1.7777777777777777rem 1.7777777777777777rem;
+  background-size: 1.7777777777777777rem 1.7777777777777777rem;
+}
+.ui-ticker-text1-bg {
+  position: absolute;
+  top: 0;
+  height: 0.7777777777777777rem;
+  left: 2.6666666666666665rem;
+  margin-top: 0.5555555555555556rem;
+  font-size: 0.8em;
+  color: #bababa;
+}
+.ui-ticker-text2-bg {
+  position: absolute;
+  top: 0;
+  height: 0.8888888888888888rem;
+  left: 2.6666666666666665rem;
+  margin-top: 1.3333333333333333rem;
+  color: #f4f4f4;
+}
+/* smallpopup */
+@-webkit-keyframes ui-smallpopup-show {
+  from {
+    opacity: 0;
+    -webkit-transform: scaley(0);
+  }
+  to {
+    opacity: 1;
+    -webkit-transform: scaley(1);
+  }
+}
+@-webkit-keyframes ui-smallpopup-hide {
+  from {
+    opacity: 1;
+    height: 1.3333333333333333rem;
+    left: 0;
+    -webkit-transform: scaley(1);
+  }
+  to {
+    opacity: 0;
+    height: 0;
+    left: 0;
+    -webkit-transform: scaley(0);
+  }
+}
+.ui-smallpopup {
+  position: fixed;
+  display: none;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 1.3333333333333333rem;
+  z-index: 1100;
+  background: #344a55;
+  vertical-align: middle;
+}
+.ui-smallpopup.fix {
+  display: block;
+}
+.ui-smallpopup.show {
+  display: block;
+  -webkit-animation: ui-smallpopup-show 0.5s 1 ease;
+}
+.ui-smallpopup.hide {
+  display: block;
+  left: -100%;
+  -webkit-animation: ui-smallpopup-hide 0.5s 1 ease;
+}
+.ui-smallpopup-text-bg {
+  position: relative;
+  margin-top: 0.16666666666666666rem;
+  margin-left: 0.4444444444444444rem;
+  color: #f9f9f9;
+}
+/*
+ * pagrcontrol stylesheet
+ * by Youmin Ha <youmin.ha@samsung.com>
+ */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+div.pagecontrol {
+  text-align: center;
+}
+div.pagecontrol > div.page_n {
+  display: inline-block;
+  border: 0;
+  width: 1.4444444444444444rem;
+  height: 1.4444444444444444rem;
+}
+div.pagecontrol > div.page_n_margin_44 {
+  margin-left: 0.611111111111111rem;
+  margin-right: 0.611111111111111rem;
+}
+div.pagecontrol > div.page_n_margin_35 {
+  margin-left: 0.4722222222222222rem;
+  margin-right: 0.4444444444444444rem;
+}
+div.pagecontrol > div.page_n_margin_26 {
+  margin-left: 0.3333333333333333rem;
+  margin-right: 0.3333333333333333rem;
+}
+div.pagecontrol > div.page_n_margin_19 {
+  margin-left: 0.25rem;
+  margin-right: 0.2222222222222222rem;
+}
+div.pagecontrol > div.page_n_dot {
+  background-image: url('images/00_mainmenu_page_bar_001.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_1 {
+  background-image: url('images/00_mainmenu_page_bar_1.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_2 {
+  background-image: url('images/00_mainmenu_page_bar_2.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_3 {
+  background-image: url('images/00_mainmenu_page_bar_3.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_4 {
+  background-image: url('images/00_mainmenu_page_bar_4.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_5 {
+  background-image: url('images/00_mainmenu_page_bar_5.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_6 {
+  background-image: url('images/00_mainmenu_page_bar_6.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_7 {
+  background-image: url('images/00_mainmenu_page_bar_7.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_8 {
+  background-image: url('images/00_mainmenu_page_bar_8.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_9 {
+  background-image: url('images/00_mainmenu_page_bar_9.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+div.pagecontrol > div.page_n_10 {
+  background-image: url('images/00_mainmenu_page_bar_10.png');
+  background-size: 1.4444444444444444rem;
+  -webkit-transition: background 0.5s ease;
+  -moz-transition: background 0.5s ease;
+  -o-transition: background 0.5s ease;
+  transition: background 0.5s ease;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-swipelist {
+  list-style-type: none;
+}
+.ui-swipelist-item {
+  -webkit-user-select: none;
+  -user-select: none;
+}
+.ui-swipelist-item .ui-btn {
+  margin-top: -0.3em !important;
+}
+.ui-swipelist-item-cover {
+  position: absolute;
+  border: none;
+  top: 0%;
+  left: 0%;
+  width: 100%;
+  height: 100%;
+  z-index: 100;
+}
+.ui-swipelist-item-cover .ui-li-text-main {
+  position: absolute;
+}
+.ui-swipelist-item-cover .ui-li-text-sub-left {
+  margin-top: 0.8em !important;
+  margin-left: 0.4444444444444444rem !important;
+}
+.ui-swipelist-item-cover .ui-li-text-main-right {
+  margin-top: 0.7em !important;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-nocontents {
+  position: relative;
+  left: 0;
+  width: 100%;
+  height: 14.11111111111111rem;
+}
+.ui-nocontents-icon-text,
+.ui-nocontents-icon-picture,
+.ui-nocontents-icon-multimedia,
+.ui-nocontents-icon-unnamed {
+  position: absolute;
+  display: block;
+  width: 8.722222222222221rem;
+  height: 8.61111111111111rem;
+  background: url(images/00_Nocontents_text.png) no-repeat;
+  -moz-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -o-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -webkit-background-size: 8.61111111111111rem 8.722222222222221rem;
+  background-size: 8.61111111111111rem 8.722222222222221rem;
+}
+.ui-nocontents-icon-picture {
+  background: url(images/00_Nocontents_picture.png) no-repeat;
+  -moz-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -o-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -webkit-background-size: 8.61111111111111rem 8.722222222222221rem;
+  background-size: 8.61111111111111rem 8.722222222222221rem;
+}
+.ui-nocontents-icon-multimedia {
+  background: url(images/00_Nocontents_multimedia.png) no-repeat;
+  -moz-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -o-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -webkit-background-size: 8.61111111111111rem 8.722222222222221rem;
+  background-size: 8.61111111111111rem 8.722222222222221rem;
+}
+.ui-nocontents-icon-unnamed {
+  background: url(images/00_Nocontents_unnamed.png) no-repeat;
+  -moz-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -o-background-size: 8.61111111111111rem 8.722222222222221rem;
+  -webkit-background-size: 8.61111111111111rem 8.722222222222221rem;
+  background-size: 8.61111111111111rem 8.722222222222221rem;
+}
+.ui-nocontents-text {
+  position: absolute;
+  height: 1.2777777777777777rem;
+  width: 100%;
+  text-align: center;
+  color: #514e4c;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-shortcutscroll {
+  position: absolute;
+  right: 0rem;
+  background-color: rgba(68, 68, 68, 0.5);
+  width: 0.8333333333333333rem;
+  -webkit-user-select: none;
+  margin: 0;
+  padding-right: 0.08em;
+  opacity: 1;
+}
+.ui-shortcutscroll ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+.ui-shortcutscroll li {
+  cursor: pointer;
+  color: rgba(180, 180, 180, 0.6);
+  padding: 0.05555555555555555rem 0.05555555555555555rem 0.05555555555555555rem 0.05555555555555555rem;
+  text-align: right;
+}
+.ui-shortcutscroll2 {
+  position: absolute;
+  right: 0rem;
+  -webkit-user-select: none;
+  margin: 0;
+  padding-right: 0.08em;
+  opacity: 1;
+}
+.ui-shortcutscroll2 ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+.ui-shortcutscroll2 li {
+  cursor: pointer;
+  color: rgba(180, 180, 180, 0.6);
+  padding: 0.05555555555555555rem 0.05555555555555555rem 0.05555555555555555rem 0.05555555555555555rem;
+  text-align: right;
+}
+.ui-shortcutscroll-bg {
+  position: absolute;
+  right: 0rem;
+  background-color: rgba(68, 68, 68, 0.5);
+  width: 0.8333333333333333rem;
+  z-index: 10;
+  top: 0;
+}
+.ui-shortcutscroll-popup {
+  position: absolute;
+  background: #738993;
+  color: #f9f9f9;
+  padding: 0.2777777777777778rem 0.8333333333333333rem;
+  -moz-box-shadow: 0.2222222222222222rem 0.2777777777777778rem 0rem rgba(199, 199, 199, 0.5);
+  -webkit-box-shadow: 0.2222222222222222rem 0.2777777777777778rem 0rem rgba(199, 199, 199, 0.5);
+  box-shadow: 0.2222222222222222rem 0.2777777777777778rem 0rem rgba(199, 199, 199, 0.5);
+  text-align: center;
+  font-size: 2.083333333333333rem;
+  font-weight: bold;
+  display: none;
+  box-sizing: border-box;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* dayselector CSS */
+.ui-dayselector label {
+  height: 1.5555555555555554rem;
+  width: 1.7777777777777777rem;
+}
+.ui-dayselector {
+  display: inline-block;
+}
+.ui-dayselector .ui-btn {
+  border-color: #646464;
+  border-style: solid;
+  border-width: 0.027777777777777776rem;
+}
+.ui-dayselector .ui-btn .ui-btn-inner {
+  text-align: center;
+  padding: 0.8em 0px;
+}
+.ui-dayselector .ui-checkbox-off {
+  background: #3b3b3b;
+}
+.ui-dayselector .ui-checkbox-off .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-dayselector .ui-checkbox-off.ui-btn-down-s.ui-btn-hover-s {
+  background: #008cd2;
+}
+.ui-dayselector .ui-checkbox-on {
+  background: #008cd2;
+}
+.ui-dayselector .ui-checkbox-on .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-dayselector .ui-checkbox-on.ui-btn-down-s.ui-btn-hover-s {
+  background: #3b3b3b;
+}
+.ui-dayselector .ui-dayselector-label-6 .ui-btn-text {
+  color: #00a8e7;
+}
+.ui-dayselector .ui-dayselector-label-6.ui-checkbox-on .ui-btn-text {
+  color: #f9f9f9;
+}
+.ui-dayselector .ui-dayselector-label-0 .ui-btn-text {
+  color: #f01402;
+}
+.ui-dayselector .ui-checkbox {
+  height: 2.5rem;
+}
+.ui-dayselector .ui-checkbox .ui-btn {
+  width: 2.611111111111111rem;
+}
+.ui-dayselector .ui-checkbox .ui-btn.ui-corner-left {
+  border-top-left-radius: 0.1388888888888889rem;
+  border-bottom-left-radius: 0.1388888888888889rem;
+}
+.ui-dayselector .ui-checkbox .ui-btn.ui-corner-right {
+  border-top-right-radius: 0.1388888888888889rem;
+  border-bottom-right-radius: 0.1388888888888889rem;
+}
+.ui-dayselector .todons-dayselector-disabled .ui-dayselector-label-6 {
+  color: #121212;
+}
+.ui-dayselector .todons-dayselector-disabled .ui-dayselector-label-0 {
+  color: #363636;
+}
+.ui-dayselector.ui-controlgroup-vertical .ui-checkbox .ui-btn {
+  width: 2.7777777777777777rem;
+}
+.ui-dayselector.ui-controlgroup-vertical .ui-checkbox .ui-btn .ui-btn-text {
+  margin-left: 0rem;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-toggleswitch {
+  position: relative;
+  overflow: hidden;
+  background: #3b3b3b;
+}
+.ui-toggleswitch .toggleswitch-background {
+  position: absolute;
+  margin: 0px;
+  border: 0px;
+  left: 0px;
+  right: 0px;
+  top: 0px;
+  bottom: 0px;
+  pointer-events: none;
+}
+.ui-toggleswitch .toggleswitch-sizer {
+  margin: 0px;
+  opacity: 0;
+  pointer-events: none;
+}
+.ui-toggleswitch .toggleswitch-floating-button {
+  background: #f9f9f9;
+  position: absolute;
+  margin: 0px;
+  left: 0px;
+  right: 0px;
+}
+.ui-toggleswitch .ui-btn-inner {
+  padding: 0.05555555555555555rem 0.19444444444444442rem !important;
+}
+.ui-toggleswitch .toggleswitch-mover {
+  border-color: transparent;
+  background: none;
+  pointer-events: none;
+}
+.tizen-huegradient {
+    background: none; /* Old browsers */
+    background: -webkit-gradient(linear, left top, right top,
+        color-stop(  0%          ,rgba(255,  0,  0,1)),
+        color-stop( 16.666666667%,rgba(255,255,  0,1)),
+        color-stop( 33.333333333%,rgba(0  ,255,  0,1)),
+        color-stop( 50%          ,rgba(0  ,255,255,1)),
+        color-stop( 66.666666667%,rgba(0  ,  0,255,1)),
+        color-stop( 83.333333333%,rgba(255,  0,255,1)),
+        color-stop(100%          ,rgba(255,  0,  0,1))); /* Chrome,Safari4+ */
+    background: -moz-linear-gradient(left, 
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+    background: -webkit-linear-gradient(left,
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+    background: -o-linear-gradient(left,
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+    background: -ms-linear-gradient(left,
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+    background: linear-gradient(left,
+        rgba(255,  0,  0,1)   0%, 
+        rgba(255,255,  0,1)  16.666666667%,
+        rgba(  0,255,  0,1)  33.333333333%,
+        rgba(  0,255,255,1)  50%,
+        rgba(  0,  0,255,1)  66.666666667%,
+        rgba(255,  0,255,1)  83.333333333%,
+        rgba(255,  0,  0,1) 100%);
+}
+
+/* Full-saturation magic grayscale values were taken from the Gimp */
+.tizen-huegradient-disabled {
+    background: none; /* Old browsers */
+    background: -webkit-gradient(linear, left top, right top,
+        color-stop(  0%          ,rgba( 54, 54, 54,1)),
+        color-stop( 16.666666667%,rgba(237,237,237,1)),
+        color-stop( 33.333333333%,rgba(182,182,182,1)),
+        color-stop( 50%          ,rgba(201,201,201,1)),
+        color-stop( 66.666666667%,rgba( 18, 18, 18,1)),
+        color-stop( 83.333333333%,rgba( 73, 73, 73,1)),
+        color-stop(100%          ,rgba( 54, 54, 54,1))); /* Chrome,Safari4+ */
+    background: -moz-linear-gradient(left, 
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+    background: -webkit-linear-gradient(left,
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+    background: -o-linear-gradient(left,
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+    background: -ms-linear-gradient(left,
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+    background: linear-gradient(left,
+        rgba( 54, 54, 54,1)   0%, 
+        rgba(237,237,237,1)  16.666666667%,
+        rgba(182,182,182,1)  33.333333333%,
+        rgba(201,201,201,1)  50%,
+        rgba( 18, 18, 18,1)  66.666666667%,
+        rgba( 73, 73, 73,1)  83.333333333%,
+        rgba( 54, 54, 54,1) 100%);
+}
+/* Own CSS */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+/* @selector-size should be an odd number, in order to pixel-perfectly center on a given colour */
+.ui-colorpicker {
+  display: table;
+}
+.ui-colorpicker .colorpicker-hs-container {
+  position: relative;
+  display: table-cell;
+  float: left;
+  width: 7.111111111111111rem;
+  height: 7.111111111111111rem;
+  padding: 1.1388888888888888rem;
+}
+.ui-colorpicker .colorpicker-hs-container .colorpicker-hs-mask {
+  position: absolute;
+  width: 7.111111111111111rem;
+  height: 7.111111111111111rem;
+}
+.ui-colorpicker .colorpicker-hs-container .colorpicker-hs-selector {
+  position: absolute;
+  width: 2rem;
+  height: 2rem;
+  border: 0.1388888888888889rem solid black;
+}
+.ui-colorpicker .colorpicker-l-container {
+  position: relative;
+  float: left;
+  width: 0.5rem;
+  height: 7.111111111111111rem;
+  padding-left: 1px;
+  padding-right: 1px;
+  padding-top: 1.1388888888888888rem;
+  padding-bottom: 1.1388888888888888rem;
+}
+.ui-colorpicker .colorpicker-l-container .colorpicker-l-mask {
+  position: absolute;
+  width: 0.5rem;
+  height: 7.111111111111111rem;
+  left: 0.8888888888888888rem;
+}
+.ui-colorpicker .colorpicker-l-container .colorpicker-l-selector {
+  left: 0px;
+  position: absolute;
+  width: 2rem;
+  height: 2rem;
+  border: 0.1388888888888889rem solid black;
+}
+.ui-colorpicker .colorpicker-hs-container .sat-gradient {
+  background: none;
+  /* Old browsers */
+
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(128, 128, 128, 0)), color-stop(100%, #808080));
+  /* Chrome,Safari4+ */
+
+  background: -moz-linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* FF3.6+ */
+
+  background: -webkit-linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* Chrome10+,Safari5.1+ */
+
+  background: -o-linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* Opera11.10+ */
+
+  background: -ms-linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* IE10+ */
+
+  background: linear-gradient(top, rgba(128, 128, 128, 0) 0%, #808080 100%);
+  /* W3C */
+
+  /* filter: progid:DXImageTransform.Microsoft.gradient (startColorstr='#00808080', endColorstr="#808080", GradientType = 0); */
+
+}
+.ui-colorpicker .colorpicker-l-container .l-gradient {
+  background: none;
+  /* Old browsers */
+
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #000000), color-stop(100%, #ffffff));
+  /* Chrome,Safari4+ */
+
+  background: -moz-linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* FF3.6+ */
+
+  background: -webkit-linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* Chrome10+,Safari5.1+ */
+
+  background: -o-linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* Opera11.10+ */
+
+  background: -ms-linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* IE10+ */
+
+  background: linear-gradient(top, #000000 0%, #ffffff 100%);
+  /* W3C */
+
+  /* filter: progid:DXImageTransform.Microsoft.gradient (startColorstr='#000000', endColorstr="#ffffff", GradientType = 0); */
+
+}
+/* Need to add !important below, because these classes are added before jqm enhancement */
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-colorpickerbutton-input {
+  max-width: 4.166666666666666rem;
+  display: inline-block !important;
+}
+.ui-colorpickerbutton-input-hidden {
+  display: none !important;
+}
+.ui-triangle-container {
+  position: relative;
+}
+.ui-triangle-container .ui-triangle {
+  position: absolute;
+  border-style: solid;
+  border-color: transparent;
+  border-width: 12px;
+}
+.ui-triangle-container .ui-triangle-top {
+  top: 0px;
+  border-top-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -12px;
+}
+.ui-triangle-container .ui-triangle-bottom {
+  bottom: 0px;
+  border-bottom-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -12px;
+}
+.ui-triangle-container .ui-triangle-left {
+  left: 0px;
+  margin-top: -12px;
+  border-left-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container .ui-triangle-right {
+  right: 0px;
+  margin-top: -12px;
+  border-right-width: 0px;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container-top {
+  height: 12px;
+  top: 0px;
+  margin-top: -12px;
+}
+.ui-triangle-container-bottom {
+  height: 12px;
+  bottom: 0px;
+  margin-bottom: -12px;
+}
+.ui-triangle-container-left {
+  width: 12px;
+}
+.ui-triangle-container-right {
+  width: 12px;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-multibuttonentry {
+  display: table;
+  background-color: #DDDDDD;
+  outline: none;
+}
+.ui-multibuttonentry .ui-multibuttonentry-label {
+  display: inline-block;
+  text-align: center;
+  position: relative;
+  margin: .3em;
+  padding: .2em .5em;
+  color: #222222;
+  font-weight: bold;
+  text-align: center;
+  font-size: 1em;
+  background-color: #DDDDDD;
+}
+.ui-multibuttonentry-input {
+  display: inline-block;
+  outline: none;
+  position: relative;
+  border: 0 !important;
+  padding: 0 !important;
+  margin: .5em;
+  color: #222222;
+  text-align: left;
+  font-size: 1em;
+  background-color: #DDDDDD;
+}
+.ui-multibuttonentry div, .ui-multibuttonentry a {
+  display: inline-block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  margin: .3em;
+  padding: .2em .5em;
+  font-size: 1em;
+  text-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.3);
+  -webkit-border-radius: .5em;
+  -moz-border-radius: .5em;
+  border-radius: .5em;
+  -webkit-box-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.2);
+  box-shadow: 0 0.1em 0.1em rgba(0, 0, 0, 0.2);
+  color: #fef4e9;
+}
+a.ui-multibuttonentry-link {
+  float: right;
+  color: #ffffff !important;
+  font-size: 1em;
+  font-weight: bold;
+  text-decoration: none;
+  border: solid 1px #696969;
+  background: #a9a9a9;
+  background: -webkit-gradient(linear, left top, left bottom, from(#a9a9a9), to(#696969));
+  background: -moz-linear-gradient(top, #a9a9a9, #696969);
+}
+div.ui-multibuttonentry-block {
+  border: solid 1px #da7c0c;
+  background: #f78d1d;
+  background: -webkit-gradient(linear, left top, left bottom, from(#faa51a), to(#f47a20));
+  background: -moz-linear-gradient(top, #faa51a, #f47a20);
+}
+div.ui-multibuttonentry-sblock {
+  border: solid 1px #0033FF;
+  background: #0099FF;
+  background: -webkit-gradient(linear, left top, left bottom, from(#00ffff), to(#0099ff));
+  background: -moz-linear-gradient(top, #00ffff, #0099ff);
+}
+.ui-multibuttonentry .ui-multibuttonentry-desclabel {
+  display: inline-block;
+  outline: none;
+  position: relative;
+  border: 0;
+  color: #222222;
+  text-align: left;
+  font-size: 1em;
+  background-color: #DDDDDD;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-handler {
+  position: absolute;
+  overflow: hidden;
+}
+.ui-handler-y {
+  top: 0.2777777777777778rem;
+  right: 0.2777777777777778rem;
+  bottom: 0.2777777777777778rem;
+  width: 1.3333333333333333rem;
+}
+.ui-handler-x {
+  right: 0.2777777777777778rem;
+  bottom: 0.2777777777777778rem;
+  left: 0.2777777777777778rem;
+  height: 1.3333333333333333rem;
+}
+.ui-handler-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-handler-thumb {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background-color: rgba(255, 255, 255, 0.5);
+  background-position: center;
+  background-repeat: no-repeat;
+  -moz-border-radius: 0.1388888888888889rem;
+  -webkit-border-radius: 0.1388888888888889rem;
+  border-radius: 0.1388888888888889rem;
+}
+.ui-handler-y .ui-handler-thumb {
+  width: 1.3333333333333333rem;
+  height: 5.944444444444444rem;
+  background-image: url("images/00_scroll_bar_handler.png");
+  background-size: 1.3333333333333333rem 1.1111111111111112rem;
+}
+.ui-handler-x .ui-handler-thumb {
+  width: 5.944444444444444rem;
+  height: 1.3333333333333333rem;
+  background-image: url("images/00_scroll_bar_handler_hor.png");
+  background-size: 1.1111111111111112rem 1.3333333333333333rem;
+}
+/*
+ * jQuery Mobile Framework
+ * Copyright (c) jQuery Project
+ * Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt)
+ * licenses.
+ */
+/*** less definitions ***/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-virtualgrid {
+  overflow: hidden;
+  position: absolute;
+}
+.ui-virtualgrid-wrapblock {
+  position: absolute;
+  left: 0;
+}
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+/*
+ * Common definition for theme
+ */
+/******************************
+  z-index order collection
+ ******************************/
+/******************************
+  Global LESS mixin collection
+ ******************************/
+/*************************
+  Vars/Mixins for Widgets
+
+  NOTE:
+    * Color variables' name: @color_<widget name>_<identifier>
+	* Color values: Use rgb() or rgba()
+ *************************/
+/***************************************************************************
+                   List 
+***************************************************************************/
+/* #424242 */
+/* #a4a4a4 */
+/***************************************************************************
+                   Shortcut Scroll
+***************************************************************************/
+/***************************************************************************
+                   Popup 
+***************************************************************************/
+/* #213c49 */
+/* #565d60 */
+/***************************************************************************
+                    Button
+***************************************************************************/
+.LESSbutton_text1_style {
+  font-family: Helvetica, Arial, sans-serif;
+  font-weight: normal;
+  font-size: 1.0rem;
+  font-style: normal;
+  color: #f9f9f9;
+}
+.LESSbutton_text1_style:hover {
+  color: #f9f9f9;
+}
+/***************************************************************************
+		    Date Time picker color set
+***************************************************************************/
+/***************************************************************************
+                  Contextual Popup 
+***************************************************************************/
+/***************************************************************************
+                    DaySelector
+***************************************************************************/
+/* #00a8e7 */
+/* #f01402 */
+/* #f9f9f9 *//* #646464 *//* #3b3b3b */
+/* #008cd2 *//***************************************************************************
+                    OptionHeader
+***************************************************************************/
+/* #484848 */
+/* #202020 */
+/* #2384b6 */
+/* #f9f9f9 */
+/***************************************************************************
+                    SearchBar(forms.textinput)
+***************************************************************************/
+/* #242424 */
+/* #828282 */
+/***************************************************************************
+                    SegmentControl
+***************************************************************************/
+/* #e6e6e6 */
+/* #3d3d3d; */
+/* #909090 */
+/* #000000 */
+/***************************************************************************
+                    ControlGroup
+***************************************************************************/
+/* #252525 */
+/***************************************************************************
+                    Header / Footer 
+                    NavigationBar / ControlBar
+***************************************************************************/
+/* #1F1F1F */
+/* #0a8cd2 */
+/* #0a8cd2 */
+/* #1F1F1F */
+/* #2B2B2B */
+/* #000000 */
+/* #767676 */
+/* #F9F9F9 */
+/* #434343 */
+/* #F9F9F9 */
+/* #6c6c6c */
+/* #848484 */
+/* #4C4C4C */
+/* #1F1F1F */
+/* #353535 */
+/* #2A2A2A */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #1F1F1F */
+/* #F9F9F9 */
+/* #4c4c4c */
+/***************************************************************************
+                    Tickernoti
+***************************************************************************/
+/***************************************************************************
+                    Smallpopup
+***************************************************************************/
+/***************************************************************************
+                    No Contents
+***************************************************************************/
+/***************************************************************************
+                    Slider
+***************************************************************************/
+/***************************************************************************
+                   Handler
+***************************************************************************/
+/***************************************************************************
+                   multimediaview
+***************************************************************************/
+.ui-multimediaview {
+  background-color: #000000;
+  overflow: hidden;
+}
+.ui-multimediaview-wrap {
+  width: 100%;
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+.ui-multimediaview-fullscreen {
+  position: absolute !important;
+  z-index: 1100 !important;
+}
+.ui-multimediaview-audio {
+  background-color: #000000 !important;
+}
+.ui-multimediaview-control span {
+  display: inline-block;
+}
+.ui-multimediaview-control span.ui-play-icon {
+  background-image: url("./images/controlbar/01_controlbar_icon_Play.png");
+}
+.ui-multimediaview-control span.ui-pause-icon {
+  background-image: url("./images/controlbar/01_controlbar_icon_pause.png");
+}
+.ui-multimediaview-control span.ui-stop-icon {
+  background-image: url(./images/stop.png);
+}
+.ui-multimediaview-control span.ui-ff-icon {
+  background: url(./images/controlbar/01_controlbar_icon_FF.png);
+}
+.ui-multimediaview-control span.ui-rew-icon {
+  background-image: url(./images/controlbar/01_controlbar_icon_REW.png);
+}
+.ui-multimediaview-control span.ui-volume-icon {
+  background-image: url(./images/Volume/00_volume_icon.png);
+}
+.ui-multimediaview-control span.ui-mute-icon {
+  background-image: url(./images/Volume/00_volume_icon_Mute.png);
+}
+.ui-multimediaview-control span.ui-fullscreen-on {
+  background-image: url(./images/00_button_fullscreen_on.png);
+}
+.ui-multimediaview-control span.ui-fullscreen-off {
+  background-image: url(./images/00_button_fullscreen_off.png);
+}
+.ui-multimediaview-control {
+  position: absolute;
+  display: block;
+  z-index: 1101 !important;
+  padding: 0;
+  margin: 0;
+  outline: 0;
+  border: 0;
+  background-color: rgba(0, 0, 0, 0.5);
+  height: 2.333333333333333rem;
+}
+.ui-multimediaview-control span.ui-button {
+  background-position: center center;
+  background-size: 80%;
+  background-repeat: no-repeat;
+  width: 2.0555555555555554rem;
+  height: 2.0555555555555554rem;
+  -webkit-border-radius: 0.16666666666666666rem;
+  -moz-border-radius: 0.16666666666666666rem;
+  border-radius: 0.16666666666666666rem;
+  background-color: #555555;
+  margin: 0.1111111111111111rem;
+}
+.ui-multimediaview-control .ui-playpausebutton {
+  background-color: transparent !important;
+  float: left;
+}
+.ui-multimediaview-control .ui-timestamplabel {
+  text-align: center;
+  color: #2a6d8c;
+  float: left;
+}
+.ui-multimediaview-control .ui-timestamplabel p {
+  margin: 0;
+  text-align: center;
+  font-size: 0.611111111111111rem;
+  line-height: 0.7777777777777777rem;
+  text-align: left;
+}
+.ui-multimediaview-control .ui-durationlabel {
+  text-align: center;
+  color: #ffffff;
+  float: right;
+}
+.ui-multimediaview-control .ui-durationlabel p {
+  margin: 0rem;
+  text-align: center;
+  font-size: 0.611111111111111rem;
+  line-height: 0.7777777777777777rem;
+  text-align: right;
+}
+.ui-multimediaview-control .ui-seekbar {
+  margin-top: 0.5555555555555556rem;
+  padding-left: 0.1111111111111111rem;
+  padding-right: 0.1111111111111111rem;
+  height: 0.4444444444444444rem;
+  float: left;
+}
+.ui-multimediaview-control .ui-seekbar .ui-duration {
+  margin: 0;
+  padding: 0;
+  width: 100%;
+  height: 0.4444444444444444rem;
+  background-color: #373737;
+  -webkit-border-radius: 0.08333333333333333rem;
+  -moz-border-radius: 0.08333333333333333rem;
+  border-radius: 0.08333333333333333rem;
+}
+.ui-multimediaview-control .ui-seekbar .ui-currenttime {
+  margin: 0;
+  padding: 0;
+  height: 0.4444444444444444rem;
+  position: absolute;
+  background-color: #2a6d8c;
+  -webkit-border-radius: 0.08333333333333333rem;
+  -moz-border-radius: 0.08333333333333333rem;
+  border-radius: 0.08333333333333333rem;
+}
+.ui-multimediaview-control .ui-volumecontrol {
+  width: 6.111111111111111rem;
+  height: 100%;
+  float: left;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar {
+  height: 100%;
+  padding-top: 0.9166666666666666rem;
+  padding-left: 1.1111111111111112rem;
+  display: block;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-guide {
+  width: 4.444444444444445rem;
+  height: 0.4444444444444444rem;
+  position: absolute;
+  background-color: white;
+  -webkit-border-radius: 0.08333333333333333rem;
+  -moz-border-radius: 0.08333333333333333rem;
+  border-radius: 0.08333333333333333rem;
+  background-color: #373737;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-value {
+  margin: 0;
+  padding: 0;
+  height: 0.4444444444444444rem;
+  position: absolute;
+  -webkit-border-radius: 0.08333333333333333rem;
+  -moz-border-radius: 0.08333333333333333rem;
+  border-radius: 0.08333333333333333rem;
+  background-color: #2a6d8c;
+}
+.ui-multimediaview-control .ui-volumecontrol .ui-volumebar .ui-handler {
+  margin: 0;
+  padding: 0;
+  width: 0.8333333333333333rem;
+  height: 0.8333333333333333rem;
+  position: absolute;
+  -webkit-border-radius: 0.1388888888888889rem;
+  -moz-border-radius: 0.1388888888888889rem;
+  border-radius: 0.1388888888888889rem;
+  background-color: #f9f9f9;
+}
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/snapshot.png b/templates/CordovaTizenWebUIFrameworkTemplate/snapshot.png
new file mode 100644
index 0000000..2a21ba1
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/snapshot.png
Binary files differ
diff --git a/templates/CordovaTizenWebUIFrameworkTemplate/tizen-app-template.xml b/templates/CordovaTizenWebUIFrameworkTemplate/tizen-app-template.xml
new file mode 100644
index 0000000..52191b2
--- /dev/null
+++ b/templates/CordovaTizenWebUIFrameworkTemplate/tizen-app-template.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tizen-app-template  xmlns="http://www.s-core.com/tizen-app-template" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.s-core.com/tizen-app-template tizen-app-template.xsd "
+sdk-version="1.0 beta" template-version="0.2" 
+icon64="ic_cordova_64.png" icon32="ic_cordova_32.png">
+    <template-name>CordovaTizenWebUITemplate</template-name>
+    <widget-type>TIZEN</widget-type>
+    <description-file-name>description.xml</description-file-name>
+</tizen-app-template>
diff --git a/www/config.xml b/www/config.xml
new file mode 100644
index 0000000..3f408d1
--- /dev/null
+++ b/www/config.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" version="2.0 Beta" viewmodes="fullscreen" id="http://YourDomain.com/cordova-basic-template">  
+	<icon src="icon.png"/>  
+	<content src="index.html"/>  
+	<feature name="http://tizen.org/api/application" required="true"/>  
+	<feature name="http://tizen.org/api/application.kill" required="true"/>  
+	<feature name="http://tizen.org/api/application.launch" required="true"/>  
+	<feature name="http://tizen.org/api/application.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact" required="true"/>  
+	<feature name="http://tizen.org/api/contact.read" required="true"/>  
+	<feature name="http://tizen.org/api/contact.write" required="true"/>  
+	<feature name="http://tizen.org/api/systeminfo" required="true"/>  
+	<feature name="http://tizen.org/api/time" required="true"/>  
+	<feature name="http://tizen.org/api/time.read" required="true"/>  
+	<feature name="http://tizen.org/api/time.write" required="true"/>  
+	<feature name="http://tizen.org/api/tizen" required="true"/>  
+	<name>cordova-basic-template</name>
+</widget>
diff --git a/www/cordova-2.0.0.js b/www/cordova-2.0.0.js
new file mode 100644
index 0000000..ee17d0d
--- /dev/null
+++ b/www/cordova-2.0.0.js
@@ -0,0 +1,6957 @@
+// commit 870218e03979cb7fb6fcae8cd8532008d163d6cc
+
+// File generated at :: Thu Aug 02 2012 17:18:02 GMT+0200 (CEST)
+
+/*
+ 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.
+*/
+
+;(function() {
+
+// file: lib/scripts/require.js
+var require,
+    define;
+
+(function () {
+    var modules = {};
+
+    function build(module) {
+        var factory = module.factory;
+        module.exports = {};
+        delete module.factory;
+        factory(require, module.exports, module);
+        return module.exports;
+    }
+
+    require = function (id) {
+        if (!modules[id]) {
+            throw "module " + id + " not found";
+        }
+        return modules[id].factory ? build(modules[id]) : modules[id].exports;
+    };
+
+    define = function (id, factory) {
+        if (modules[id]) {
+            throw "module " + id + " already defined";
+        }
+
+        modules[id] = {
+            id: id,
+            factory: factory
+        };
+    };
+
+    define.remove = function (id) {
+        delete modules[id];
+    };
+
+})();
+
+//Export for use in node
+if (typeof module === "object" && typeof require === "function") {
+    module.exports.require = require;
+    module.exports.define = define;
+}
+// file: lib/cordova.js
+define("cordova", function(require, exports, module) {
+var channel = require('cordova/channel');
+
+/**
+ * Listen for DOMContentLoaded and notify our channel subscribers.
+ */
+document.addEventListener('DOMContentLoaded', function() {
+    channel.onDOMContentLoaded.fire();
+}, false);
+if (document.readyState == 'complete' || document.readyState == 'interactive') {
+    channel.onDOMContentLoaded.fire();
+}
+
+/**
+ * Intercept calls to addEventListener + removeEventListener and handle deviceready,
+ * resume, and pause events.
+ */
+var m_document_addEventListener = document.addEventListener;
+var m_document_removeEventListener = document.removeEventListener;
+var m_window_addEventListener = window.addEventListener;
+var m_window_removeEventListener = window.removeEventListener;
+
+/**
+ * Houses custom event handlers to intercept on document + window event listeners.
+ */
+var documentEventHandlers = {},
+    windowEventHandlers = {};
+
+document.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof documentEventHandlers[e] != 'undefined') {
+        if (evt === 'deviceready') {
+            documentEventHandlers[e].subscribeOnce(handler);
+        } else {
+            documentEventHandlers[e].subscribe(handler);
+        }
+    } else {
+        m_document_addEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.addEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    if (typeof windowEventHandlers[e] != 'undefined') {
+        windowEventHandlers[e].subscribe(handler);
+    } else {
+        m_window_addEventListener.call(window, evt, handler, capture);
+    }
+};
+
+document.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof documentEventHandlers[e] != "undefined") {
+        documentEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_document_removeEventListener.call(document, evt, handler, capture);
+    }
+};
+
+window.removeEventListener = function(evt, handler, capture) {
+    var e = evt.toLowerCase();
+    // If unsubcribing from an event that is handled by a plugin
+    if (typeof windowEventHandlers[e] != "undefined") {
+        windowEventHandlers[e].unsubscribe(handler);
+    } else {
+        m_window_removeEventListener.call(window, evt, handler, capture);
+    }
+};
+
+function createEvent(type, data) {
+    var event = document.createEvent('Events');
+    event.initEvent(type, false, false);
+    if (data) {
+        for (var i in data) {
+            if (data.hasOwnProperty(i)) {
+                event[i] = data[i];
+            }
+        }
+    }
+    return event;
+}
+
+if(typeof window.console === "undefined") {
+    window.console = {
+        log:function(){}
+    };
+}
+
+var cordova = {
+    define:define,
+    require:require,
+    /**
+     * Methods to add/remove your own addEventListener hijacking on document + window.
+     */
+    addWindowEventHandler:function(event, opts) {
+        return (windowEventHandlers[event] = channel.create(event, opts));
+    },
+    addDocumentEventHandler:function(event, opts) {
+        return (documentEventHandlers[event] = channel.create(event, opts));
+    },
+    removeWindowEventHandler:function(event) {
+        delete windowEventHandlers[event];
+    },
+    removeDocumentEventHandler:function(event) {
+        delete documentEventHandlers[event];
+    },
+    /**
+     * Retreive original event handlers that were replaced by Cordova
+     *
+     * @return object
+     */
+    getOriginalHandlers: function() {
+        return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener},
+        'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}};
+    },
+    /**
+     * Method to fire event from native code
+     */
+    fireDocumentEvent: function(type, data) {
+        var evt = createEvent(type, data);
+        if (typeof documentEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                documentEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            document.dispatchEvent(evt);
+        }
+    },
+    fireWindowEvent: function(type, data) {
+        var evt = createEvent(type,data);
+        if (typeof windowEventHandlers[type] != 'undefined') {
+            setTimeout(function() {
+                windowEventHandlers[type].fire(evt);
+            }, 0);
+        } else {
+            window.dispatchEvent(evt);
+        }
+    },
+    // TODO: this is Android only; think about how to do this better
+    shuttingDown:false,
+    UsePolling:false,
+    // END TODO
+
+    // TODO: iOS only
+    // This queue holds the currently executing command and all pending
+    // commands executed with cordova.exec().
+    commandQueue:[],
+    // Indicates if we're currently in the middle of flushing the command
+    // queue on the native side.
+    commandQueueFlushing:false,
+    // END TODO
+    /**
+     * Plugin callback mechanism.
+     */
+    callbackId: 0,
+    callbacks:  {},
+    callbackStatus: {
+        NO_RESULT: 0,
+        OK: 1,
+        CLASS_NOT_FOUND_EXCEPTION: 2,
+        ILLEGAL_ACCESS_EXCEPTION: 3,
+        INSTANTIATION_EXCEPTION: 4,
+        MALFORMED_URL_EXCEPTION: 5,
+        IO_EXCEPTION: 6,
+        INVALID_ACTION: 7,
+        JSON_EXCEPTION: 8,
+        ERROR: 9
+    },
+
+    /**
+     * Called by native code when returning successful result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackSuccess: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+
+            // If result is to be sent to callback
+            if (args.status == cordova.callbackStatus.OK) {
+                try {
+                    if (cordova.callbacks[callbackId].success) {
+                        cordova.callbacks[callbackId].success(args.message);
+                    }
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+callbackId+" = "+e);
+                }
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+
+    /**
+     * Called by native code when returning error result from an action.
+     *
+     * @param callbackId
+     * @param args
+     */
+    callbackError: function(callbackId, args) {
+        if (cordova.callbacks[callbackId]) {
+            try {
+                if (cordova.callbacks[callbackId].fail) {
+                    cordova.callbacks[callbackId].fail(args.message);
+                }
+            }
+            catch (e) {
+                console.log("Error in error callback: "+callbackId+" = "+e);
+            }
+
+            // Clear callback if not expecting any more results
+            if (!args.keepCallback) {
+                delete cordova.callbacks[callbackId];
+            }
+        }
+    },
+    addConstructor: function(func) {
+        channel.onCordovaReady.subscribeOnce(function() {
+            try {
+                func();
+            } catch(e) {
+                console.log("Failed to run constructor: " + e);
+            }
+        });
+    }
+};
+
+// Register pause, resume and deviceready channels as events on document.
+channel.onPause = cordova.addDocumentEventHandler('pause');
+channel.onResume = cordova.addDocumentEventHandler('resume');
+channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready');
+
+module.exports = cordova;
+
+});
+
+// file: lib/common/builder.js
+define("cordova/builder", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+function each(objects, func, context) {
+    for (var prop in objects) {
+        if (objects.hasOwnProperty(prop)) {
+            func.apply(context, [objects[prop], prop]);
+        }
+    }
+}
+
+function include(parent, objects, clobber, merge) {
+    each(objects, function (obj, key) {
+        try {
+          var result = obj.path ? require(obj.path) : {};
+
+          if (clobber) {
+              // Clobber if it doesn't exist.
+              if (typeof parent[key] === 'undefined') {
+                  parent[key] = result;
+              } else if (typeof obj.path !== 'undefined') {
+                  // If merging, merge properties onto parent, otherwise, clobber.
+                  if (merge) {
+                      recursiveMerge(parent[key], result);
+                  } else {
+                      parent[key] = result;
+                  }
+              }
+              result = parent[key];
+          } else {
+            // Overwrite if not currently defined.
+            if (typeof parent[key] == 'undefined') {
+              parent[key] = result;
+            } else if (merge && typeof obj.path !== 'undefined') {
+              // If merging, merge parent onto result
+              recursiveMerge(result, parent[key]);
+              parent[key] = result;
+            } 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);
+          }
+        } catch(e) {
+          utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"');
+        }
+    });
+}
+
+/**
+ * Merge properties from one object onto another recursively.  Properties from
+ * the src object will overwrite existing target property.
+ *
+ * @param target Object to merge properties into.
+ * @param src Object to merge properties from.
+ */
+function recursiveMerge(target, src) {
+    for (var prop in src) {
+        if (src.hasOwnProperty(prop)) {
+            if (typeof target.prototype !== 'undefined' && target.prototype.constructor === target) {
+                // If the target object is a constructor override off prototype.
+                target.prototype[prop] = src[prop];
+            } else {
+                target[prop] = typeof src[prop] === 'object' ? recursiveMerge(
+                        target[prop], src[prop]) : src[prop];
+            }
+        }
+    }
+    return target;
+}
+
+module.exports = {
+    build: function (objects) {
+        return {
+            intoButDontClobber: function (target) {
+                include(target, objects, false, false);
+            },
+            intoAndClobber: function(target) {
+                include(target, objects, true, false);
+            },
+            intoAndMerge: function(target) {
+                include(target, objects, true, true);
+            }
+        };
+    }
+};
+
+});
+
+// file: lib/common/channel.js
+define("cordova/channel", function(require, exports, module) {
+var utils = require('cordova/utils');
+
+/**
+ * Custom pub-sub "channel" that can have functions subscribed to it
+ * This object is used to define and control firing of events for
+ * cordova initialization.
+ *
+ * The order of events during page load and Cordova startup is as follows:
+ *
+ * onDOMContentLoaded         Internal event that is received when the web page is loaded and parsed.
+ * onNativeReady              Internal event that indicates the Cordova native side is ready.
+ * onCordovaReady             Internal event fired when all Cordova JavaScript objects have been created.
+ * onCordovaInfoReady         Internal event fired when device properties are available.
+ * onCordovaConnectionReady   Internal event fired when the connection property has been set.
+ * onDeviceReady              User event fired to indicate that Cordova is ready
+ * onResume                   User event fired to indicate a start/resume lifecycle event
+ * onPause                    User event fired to indicate a pause lifecycle event
+ * onDestroy                  Internal event fired when app is being destroyed (User should use window.onunload event, not this one).
+ *
+ * The only Cordova events that user code should register for are:
+ *      deviceready           Cordova native code is initialized and Cordova APIs can be called from JavaScript
+ *      pause                 App has moved to background
+ *      resume                App has returned to foreground
+ *
+ * Listeners can be registered as:
+ *      document.addEventListener("deviceready", myDeviceReadyListener, false);
+ *      document.addEventListener("resume", myResumeListener, false);
+ *      document.addEventListener("pause", myPauseListener, false);
+ *
+ * The DOM lifecycle events should be used for saving and restoring state
+ *      window.onload
+ *      window.onunload
+ *
+ */
+
+/**
+ * Channel
+ * @constructor
+ * @param type  String the channel name
+ * @param opts  Object options to pass into the channel, currently
+ *                     supports:
+ *                     onSubscribe: callback that fires when
+ *                       something subscribes to the Channel. Sets
+ *                       context to the Channel.
+ *                     onUnsubscribe: callback that fires when
+ *                       something unsubscribes to the Channel. Sets
+ *                       context to the Channel.
+ */
+var Channel = function(type, opts) {
+    this.type = type;
+    this.handlers = {};
+    this.numHandlers = 0;
+    this.guid = 1;
+    this.fired = false;
+    this.enabled = true;
+    this.events = {
+        onSubscribe:null,
+        onUnsubscribe:null
+    };
+    if (opts) {
+        if (opts.onSubscribe) this.events.onSubscribe = opts.onSubscribe;
+        if (opts.onUnsubscribe) this.events.onUnsubscribe = opts.onUnsubscribe;
+    }
+},
+    channel = {
+        /**
+         * Calls the provided function only after all of the channels specified
+         * have been fired.
+         */
+        join: function (h, c) {
+            var i = c.length;
+            var len = i;
+            var f = function() {
+                if (!(--i)) h();
+            };
+            for (var j=0; j<len; j++) {
+                !c[j].fired?c[j].subscribeOnce(f):i--;
+            }
+            if (!i) h();
+        },
+        create: function (type, opts) {
+            channel[type] = new Channel(type, opts);
+            return channel[type];
+        },
+
+        /**
+         * cordova Channels that must fire before "deviceready" is fired.
+         */
+        deviceReadyChannelsArray: [],
+        deviceReadyChannelsMap: {},
+
+        /**
+         * Indicate that a feature needs to be initialized before it is ready to be used.
+         * This holds up Cordova's "deviceready" event until the feature has been initialized
+         * and Cordova.initComplete(feature) is called.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        waitForInitialization: function(feature) {
+            if (feature) {
+                var c = null;
+                if (this[feature]) {
+                    c = this[feature];
+                }
+                else {
+                    c = this.create(feature);
+                }
+                this.deviceReadyChannelsMap[feature] = c;
+                this.deviceReadyChannelsArray.push(c);
+            }
+        },
+
+        /**
+         * Indicate that initialization code has completed and the feature is ready to be used.
+         *
+         * @param feature {String}     The unique feature name
+         */
+        initializationComplete: function(feature) {
+            var c = this.deviceReadyChannelsMap[feature];
+            if (c) {
+                c.fire();
+            }
+        }
+    };
+
+function forceFunction(f) {
+    if (f === null || f === undefined || typeof f != 'function') throw "Function required as first argument!";
+}
+
+/**
+ * Subscribes the given function to the channel. Any time that
+ * Channel.fire is called so too will the function.
+ * Optionally specify an execution context for the function
+ * and a guid that can be used to stop subscribing to the channel.
+ * Returns the guid.
+ */
+Channel.prototype.subscribe = function(f, c, g) {
+    // need a function to call
+    forceFunction(f);
+
+    var func = f;
+    if (typeof c == "object") { func = utils.close(c, f); }
+
+    g = g || func.observer_guid || f.observer_guid;
+    if (!g) {
+        // first time we've seen this subscriber
+        g = this.guid++;
+    }
+    else {
+        // subscriber already handled; dont set it twice
+        return g;
+    }
+    func.observer_guid = g;
+    f.observer_guid = g;
+    this.handlers[g] = func;
+    this.numHandlers++;
+    if (this.events.onSubscribe) this.events.onSubscribe.call(this);
+    if (this.fired) func.call(this);
+    return g;
+};
+
+/**
+ * Like subscribe but the function is only called once and then it
+ * auto-unsubscribes itself.
+ */
+Channel.prototype.subscribeOnce = function(f, c) {
+    // need a function to call
+    forceFunction(f);
+
+    var g = null;
+    var _this = this;
+    var m = function() {
+        f.apply(c || null, arguments);
+        _this.unsubscribe(g);
+    };
+    if (this.fired) {
+        if (typeof c == "object") { f = utils.close(c, f); }
+        f.apply(this, this.fireArgs);
+    } else {
+        g = this.subscribe(m);
+    }
+    return g;
+};
+
+/**
+ * Unsubscribes the function with the given guid from the channel.
+ */
+Channel.prototype.unsubscribe = function(g) {
+    // need a function to unsubscribe
+    if (g === null || g === undefined) { throw "You must pass _something_ into Channel.unsubscribe"; }
+
+    if (typeof g == 'function') { g = g.observer_guid; }
+    var handler = this.handlers[g];
+    if (handler) {
+        if (handler.observer_guid) handler.observer_guid=null;
+        this.handlers[g] = null;
+        delete this.handlers[g];
+        this.numHandlers--;
+        if (this.events.onUnsubscribe) this.events.onUnsubscribe.call(this);
+    }
+};
+
+/**
+ * Calls all functions subscribed to this channel.
+ */
+Channel.prototype.fire = function(e) {
+    if (this.enabled) {
+        var fail = false;
+        this.fired = true;
+        for (var item in this.handlers) {
+            var handler = this.handlers[item];
+            if (typeof handler == 'function') {
+                var rv = (handler.apply(this, arguments)===false);
+                fail = fail || rv;
+            }
+        }
+        this.fireArgs = arguments;
+        return !fail;
+    }
+    return true;
+};
+
+// defining them here so they are ready super fast!
+// DOM event that is received when the web page is loaded and parsed.
+channel.create('onDOMContentLoaded');
+
+// Event to indicate the Cordova native side is ready.
+channel.create('onNativeReady');
+
+// Event to indicate that all Cordova JavaScript objects have been created
+// and it's time to run plugin constructors.
+channel.create('onCordovaReady');
+
+// Event to indicate that device properties are available
+channel.create('onCordovaInfoReady');
+
+// Event to indicate that the connection property has been set.
+channel.create('onCordovaConnectionReady');
+
+// Event to indicate that Cordova is ready
+channel.create('onDeviceReady');
+
+// Event to indicate a resume lifecycle event
+channel.create('onResume');
+
+// Event to indicate a pause lifecycle event
+channel.create('onPause');
+
+// Event to indicate a destroy lifecycle event
+channel.create('onDestroy');
+
+// Channels that must fire before "deviceready" is fired.
+channel.waitForInitialization('onCordovaReady');
+channel.waitForInitialization('onCordovaConnectionReady');
+
+module.exports = channel;
+
+});
+
+// file: lib/common/common.js
+define("cordova/common", function(require, exports, module) {
+module.exports = {
+    objects: {
+        cordova: {
+            path: 'cordova',
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                },
+                logger: {
+                    path: 'cordova/plugin/logger'
+                }
+            }
+        },
+        Cordova: {
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        PhoneGap:{
+            children: {
+                exec: {
+                    path: 'cordova/exec'
+                }
+            }
+        },
+        navigator: {
+            children: {
+                notification: {
+                    path: 'cordova/plugin/notification'
+                },
+                accelerometer: {
+                    path: 'cordova/plugin/accelerometer'
+                },
+                battery: {
+                    path: 'cordova/plugin/battery'
+                },
+                camera:{
+                    path: 'cordova/plugin/Camera'
+                },
+                compass:{
+                    path: 'cordova/plugin/compass'
+                },
+                contacts: {
+                    path: 'cordova/plugin/contacts'
+                },
+                device:{
+                    children:{
+                        capture: {
+                            path: 'cordova/plugin/capture'
+                        }
+                    }
+                },
+                geolocation: {
+                    path: 'cordova/plugin/geolocation'
+                },
+                network: {
+                    children: {
+                        connection: {
+                            path: 'cordova/plugin/network'
+                        }
+                    }
+                },
+                splashscreen: {
+                    path: 'cordova/plugin/splashscreen'
+                }
+            }
+        },
+        Acceleration: {
+            path: 'cordova/plugin/Acceleration'
+        },
+        Camera:{
+            path: 'cordova/plugin/CameraConstants'
+        },
+        CameraPopoverOptions: {
+            path: 'cordova/plugin/CameraPopoverOptions'
+        },
+        CaptureError: {
+            path: 'cordova/plugin/CaptureError'
+        },
+        CaptureAudioOptions:{
+            path: 'cordova/plugin/CaptureAudioOptions'
+        },
+        CaptureImageOptions: {
+            path: 'cordova/plugin/CaptureImageOptions'
+        },
+        CaptureVideoOptions: {
+            path: 'cordova/plugin/CaptureVideoOptions'
+        },
+        CompassHeading:{
+            path: 'cordova/plugin/CompassHeading'
+        },
+        CompassError:{
+            path: 'cordova/plugin/CompassError'
+        },
+        ConfigurationData: {
+            path: 'cordova/plugin/ConfigurationData'
+        },
+        Connection: {
+            path: 'cordova/plugin/Connection'
+        },
+        Contact: {
+            path: 'cordova/plugin/Contact'
+        },
+        ContactAddress: {
+            path: 'cordova/plugin/ContactAddress'
+        },
+        ContactError: {
+            path: 'cordova/plugin/ContactError'
+        },
+        ContactField: {
+            path: 'cordova/plugin/ContactField'
+        },
+        ContactFindOptions: {
+            path: 'cordova/plugin/ContactFindOptions'
+        },
+        ContactName: {
+            path: 'cordova/plugin/ContactName'
+        },
+        ContactOrganization: {
+            path: 'cordova/plugin/ContactOrganization'
+        },
+        Coordinates: {
+            path: 'cordova/plugin/Coordinates'
+        },
+        device: {
+            path: 'cordova/plugin/device'
+        },
+        DirectoryEntry: {
+            path: 'cordova/plugin/DirectoryEntry'
+        },
+        DirectoryReader: {
+            path: 'cordova/plugin/DirectoryReader'
+        },
+        Entry: {
+            path: 'cordova/plugin/Entry'
+        },
+        File: {
+            path: 'cordova/plugin/File'
+        },
+        FileEntry: {
+            path: 'cordova/plugin/FileEntry'
+        },
+        FileError: {
+            path: 'cordova/plugin/FileError'
+        },
+        FileReader: {
+            path: 'cordova/plugin/FileReader'
+        },
+        FileSystem: {
+            path: 'cordova/plugin/FileSystem'
+        },
+        FileTransfer: {
+            path: 'cordova/plugin/FileTransfer'
+        },
+        FileTransferError: {
+            path: 'cordova/plugin/FileTransferError'
+        },
+        FileUploadOptions: {
+            path: 'cordova/plugin/FileUploadOptions'
+        },
+        FileUploadResult: {
+            path: 'cordova/plugin/FileUploadResult'
+        },
+        FileWriter: {
+            path: 'cordova/plugin/FileWriter'
+        },
+        Flags: {
+            path: 'cordova/plugin/Flags'
+        },
+        LocalFileSystem: {
+            path: 'cordova/plugin/LocalFileSystem'
+        },
+        Media: {
+            path: 'cordova/plugin/Media'
+        },
+        MediaError: {
+            path: 'cordova/plugin/MediaError'
+        },
+        MediaFile: {
+            path: 'cordova/plugin/MediaFile'
+        },
+        MediaFileData:{
+            path: 'cordova/plugin/MediaFileData'
+        },
+        Metadata:{
+            path: 'cordova/plugin/Metadata'
+        },
+        Position: {
+            path: 'cordova/plugin/Position'
+        },
+        PositionError: {
+            path: 'cordova/plugin/PositionError'
+        },
+        ProgressEvent: {
+            path: 'cordova/plugin/ProgressEvent'
+        },
+        requestFileSystem:{
+            path: 'cordova/plugin/requestFileSystem'
+        },
+        resolveLocalFileSystemURI:{
+            path: 'cordova/plugin/resolveLocalFileSystemURI'
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/exec.js
+define("cordova/exec", function(require, exports, module) {
+/**
+ * Execute a cordova command.  It is up to the native side whether this action
+ * is synchronous or asynchronous.  The native side can return:
+ *      Synchronous: PluginResult object as a JSON string
+ *      Asynchrounous: Empty string ""
+ * If async, the native side will cordova.callbackSuccess or cordova.callbackError,
+ * depending upon the result of the action.
+ *
+ * @param {Function} successCB  The success callback
+ * @param {Function} failCB     The fail callback
+ * @param {String} service      The name of the service to use
+ * @param {String} action       Action to be run in cordova
+ * @param {String[]} [args]     Zero or more arguments to pass to the method
+ */
+
+var tizen = require('cordova/plugin/tizen/manager'),
+    cordova = require('cordova'),
+    utils = require('cordova/utils');
+
+module.exports = function(successCB, failCB, service, action, args) {
+
+    try {
+        var v = tizen.exec(successCB, failCB, service, action, args);
+
+        // If status is OK, then return value back to caller
+        if (v.status == cordova.callbackStatus.OK) {
+
+            // If there is a success callback, then call it now with returned value
+            if (successCB) {
+                try {
+                    successCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in success callback: "+ service + "." + action + " = " + e);
+                }
+
+            }
+            return v.message;
+        } else if (v.status == cordova.callbackStatus.NO_RESULT) {
+            // Nothing to do here
+        } else {
+            // If error, then display error
+            console.log("Error: " + service + "." + action + " Status=" + v.status + " Message=" + v.message);
+
+            // If there is a fail callback, then call it now with returned value
+            if (failCB) {
+                try {
+                    failCB(v.message);
+                }
+                catch (e) {
+                    console.log("Error in error callback: " + service + "." + action + " = "+e);
+                }
+            }
+            return null;
+        }
+    } catch (e) {
+        utils.alert("Error: " + e);
+    }
+};
+
+});
+
+// file: lib/tizen/platform.js
+define("cordova/platform", function(require, exports, module) {
+module.exports = {
+    id: "tizen",
+    initialize: function() {},
+    objects: {
+        device: {
+            path: "cordova/plugin/tizen/Device"
+        },
+        File: { // exists natively, override
+            path: "cordova/plugin/File"
+        },
+        FileReader: { // exists natively, override
+            path: "cordova/plugin/FileReader"
+        },
+        FileError: { //exists natively, override
+            path: "cordova/plugin/FileError"
+        }
+    },
+    merges: {
+        MediaError: { // exists natively
+            path: "cordova/plugin/tizen/MediaError"
+        },
+        navigator: {
+            children: {
+                device: {
+                    path: "cordova/plugin/tizen/Device"
+                },
+                contacts: {
+                    path: "cordova/plugin/tizen/contacts"
+                },
+               notification: {
+                   path: "cordova/plugin/tizen/Notification"
+               }
+            }
+        },
+        Contact: {
+            path: "cordova/plugin/tizen/Contact"
+        }
+    }
+};
+
+});
+
+// file: lib/common/plugin/Acceleration.js
+define("cordova/plugin/Acceleration", function(require, exports, module) {
+var Acceleration = function(x, y, z, timestamp) {
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.timestamp = timestamp || (new Date()).getTime();
+};
+
+module.exports = Acceleration;
+
+});
+
+// file: lib/common/plugin/Camera.js
+define("cordova/plugin/Camera", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    Camera = require('cordova/plugin/CameraConstants');
+
+var cameraExport = {};
+
+// Tack on the Camera Constants to the base camera plugin.
+for (var key in Camera) {
+    cameraExport[key] = Camera[key];
+}
+
+/**
+ * Gets a picture from source defined by "options.sourceType", and returns the
+ * image as defined by the "options.destinationType" option.
+
+ * The defaults are sourceType=CAMERA and destinationType=FILE_URI.
+ *
+ * @param {Function} successCallback
+ * @param {Function} errorCallback
+ * @param {Object} options
+ */
+cameraExport.getPicture = function(successCallback, errorCallback, options) {
+    // successCallback required
+    if (typeof successCallback != "function") {
+        console.log("Camera Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback != "function")) {
+        console.log("Camera Error: errorCallback is not a function");
+        return;
+    }
+
+    var quality = 50;
+    if (options && typeof options.quality == "number") {
+        quality = options.quality;
+    } else if (options && typeof options.quality == "string") {
+        var qlity = parseInt(options.quality, 10);
+        if (isNaN(qlity) === false) {
+            quality = qlity.valueOf();
+        }
+    }
+
+    var destinationType = Camera.DestinationType.FILE_URI;
+    if (typeof options.destinationType == "number") {
+        destinationType = options.destinationType;
+    }
+
+    var sourceType = Camera.PictureSourceType.CAMERA;
+    if (typeof options.sourceType == "number") {
+        sourceType = options.sourceType;
+    }
+
+    var targetWidth = -1;
+    if (typeof options.targetWidth == "number") {
+        targetWidth = options.targetWidth;
+    } else if (typeof options.targetWidth == "string") {
+        var width = parseInt(options.targetWidth, 10);
+        if (isNaN(width) === false) {
+            targetWidth = width.valueOf();
+        }
+    }
+
+    var targetHeight = -1;
+    if (typeof options.targetHeight == "number") {
+        targetHeight = options.targetHeight;
+    } else if (typeof options.targetHeight == "string") {
+        var height = parseInt(options.targetHeight, 10);
+        if (isNaN(height) === false) {
+            targetHeight = height.valueOf();
+        }
+    }
+
+    var encodingType = Camera.EncodingType.JPEG;
+    if (typeof options.encodingType == "number") {
+        encodingType = options.encodingType;
+    }
+
+    var mediaType = Camera.MediaType.PICTURE;
+    if (typeof options.mediaType == "number") {
+        mediaType = options.mediaType;
+    }
+    var allowEdit = false;
+    if (typeof options.allowEdit == "boolean") {
+        allowEdit = options.allowEdit;
+    } else if (typeof options.allowEdit == "number") {
+        allowEdit = options.allowEdit <= 0 ? false : true;
+    }
+    var correctOrientation = false;
+    if (typeof options.correctOrientation == "boolean") {
+        correctOrientation = options.correctOrientation;
+    } else if (typeof options.correctOrientation == "number") {
+        correctOrientation = options.correctOrientation <=0 ? false : true;
+    }
+    var saveToPhotoAlbum = false;
+    if (typeof options.saveToPhotoAlbum == "boolean") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum;
+    } else if (typeof options.saveToPhotoAlbum == "number") {
+        saveToPhotoAlbum = options.saveToPhotoAlbum <=0 ? false : true;
+    }
+    var popoverOptions = null;
+    if (typeof options.popoverOptions == "object") {
+        popoverOptions = options.popoverOptions;
+    }
+
+    var args = [quality, destinationType, sourceType, targetWidth, targetHeight, encodingType,
+                mediaType, allowEdit, correctOrientation, saveToPhotoAlbum, popoverOptions];
+
+    exec(successCallback, errorCallback, "Camera", "takePicture", args);
+};
+
+cameraExport.cleanup = function(successCallback, errorCallback) {
+    exec(successCallback, errorCallback, "Camera", "cleanup", []);
+};
+
+module.exports = cameraExport;
+});
+
+// file: lib/common/plugin/CameraConstants.js
+define("cordova/plugin/CameraConstants", function(require, exports, module) {
+module.exports = {
+  DestinationType:{
+    DATA_URL: 0,         // Return base64 encoded string
+    FILE_URI: 1          // Return file uri (content://media/external/images/media/2 for Android)
+  },
+  EncodingType:{
+    JPEG: 0,             // Return JPEG encoded image
+    PNG: 1               // Return PNG encoded image
+  },
+  MediaType:{
+    PICTURE: 0,          // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
+    VIDEO: 1,            // allow selection of video only, ONLY RETURNS URL
+    ALLMEDIA : 2         // allow selection from all media types
+  },
+  PictureSourceType:{
+    PHOTOLIBRARY : 0,    // Choose image from picture library (same as SAVEDPHOTOALBUM for Android)
+    CAMERA : 1,          // Take picture from camera
+    SAVEDPHOTOALBUM : 2  // Choose image from picture library (same as PHOTOLIBRARY for Android)
+  },
+  PopoverArrowDirection:{
+      ARROW_UP : 1,        // matches iOS UIPopoverArrowDirection constants to specify arrow location on popover
+      ARROW_DOWN : 2,
+      ARROW_LEFT : 4,
+      ARROW_RIGHT : 8,
+      ARROW_ANY : 15
+  }
+};
+});
+
+// file: lib/common/plugin/CameraPopoverOptions.js
+define("cordova/plugin/CameraPopoverOptions", function(require, exports, module) {
+var Camera = require('cordova/plugin/CameraConstants');
+
+/**
+ * Encapsulates options for iOS Popover image picker
+ */
+var CameraPopoverOptions = function(x,y,width,height,arrowDir){
+    // information of rectangle that popover should be anchored to
+    this.x = x || 0;
+    this.y = y || 32;
+    this.width = width || 320;
+    this.height = height || 480;
+    // The direction of the popover arrow
+    this.arrowDir = arrowDir || Camera.PopoverArrowDirection.ARROW_ANY;
+};
+
+module.exports = CameraPopoverOptions;
+});
+
+// file: lib/common/plugin/CaptureAudioOptions.js
+define("cordova/plugin/CaptureAudioOptions", function(require, exports, module) {
+/**
+ * Encapsulates all audio capture operation configuration options.
+ */
+var CaptureAudioOptions = function(){
+    // Upper limit of sound clips user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single sound clip in seconds.
+    this.duration = 0;
+    // The selected audio mode. Must match with one of the elements in supportedAudioModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureAudioOptions;
+});
+
+// file: lib/common/plugin/CaptureError.js
+define("cordova/plugin/CaptureError", function(require, exports, module) {
+/**
+ * The CaptureError interface encapsulates all errors in the Capture API.
+ */
+var CaptureError = function(c) {
+   this.code = c || null;
+};
+
+// Camera or microphone failed to capture image or sound.
+CaptureError.CAPTURE_INTERNAL_ERR = 0;
+// Camera application or audio capture application is currently serving other capture request.
+CaptureError.CAPTURE_APPLICATION_BUSY = 1;
+// Invalid use of the API (e.g. limit parameter has value less than one).
+CaptureError.CAPTURE_INVALID_ARGUMENT = 2;
+// User exited camera application or audio capture application before capturing anything.
+CaptureError.CAPTURE_NO_MEDIA_FILES = 3;
+// The requested capture operation is not supported.
+CaptureError.CAPTURE_NOT_SUPPORTED = 20;
+
+module.exports = CaptureError;
+});
+
+// file: lib/common/plugin/CaptureImageOptions.js
+define("cordova/plugin/CaptureImageOptions", function(require, exports, module) {
+/**
+ * Encapsulates all image capture operation configuration options.
+ */
+var CaptureImageOptions = function(){
+    // Upper limit of images user can take. Value must be equal or greater than 1.
+    this.limit = 1;
+    // The selected image mode. Must match with one of the elements in supportedImageModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureImageOptions;
+});
+
+// file: lib/common/plugin/CaptureVideoOptions.js
+define("cordova/plugin/CaptureVideoOptions", function(require, exports, module) {
+/**
+ * Encapsulates all video capture operation configuration options.
+ */
+var CaptureVideoOptions = function(){
+    // Upper limit of videos user can record. Value must be equal or greater than 1.
+    this.limit = 1;
+    // Maximum duration of a single video clip in seconds.
+    this.duration = 0;
+    // The selected video mode. Must match with one of the elements in supportedVideoModes array.
+    this.mode = null;
+};
+
+module.exports = CaptureVideoOptions;
+});
+
+// file: lib/common/plugin/CompassError.js
+define("cordova/plugin/CompassError", function(require, exports, module) {
+/**
+ *  CompassError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var CompassError = function(err) {
+    this.code = (err !== undefined ? err : null);
+};
+
+CompassError.COMPASS_INTERNAL_ERR = 0;
+CompassError.COMPASS_NOT_SUPPORTED = 20;
+
+module.exports = CompassError;
+});
+
+// file: lib/common/plugin/CompassHeading.js
+define("cordova/plugin/CompassHeading", function(require, exports, module) {
+var CompassHeading = function(magneticHeading, trueHeading, headingAccuracy, timestamp) {
+  this.magneticHeading = (magneticHeading !== undefined ? magneticHeading : null);
+  this.trueHeading = (trueHeading !== undefined ? trueHeading : null);
+  this.headingAccuracy = (headingAccuracy !== undefined ? headingAccuracy : null);
+  this.timestamp = (timestamp !== undefined ? timestamp : new Date().getTime());
+};
+
+module.exports = CompassHeading;
+});
+
+// file: lib/common/plugin/ConfigurationData.js
+define("cordova/plugin/ConfigurationData", function(require, exports, module) {
+/**
+ * Encapsulates a set of parameters that the capture device supports.
+ */
+function ConfigurationData() {
+    // The ASCII-encoded string in lower case representing the media type.
+    this.type = null;
+    // The height attribute represents height of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0.
+    this.height = 0;
+    // The width attribute represents width of the image or video in pixels.
+    // In the case of a sound clip this attribute has value 0
+    this.width = 0;
+}
+
+module.exports = ConfigurationData;
+});
+
+// file: lib/common/plugin/Connection.js
+define("cordova/plugin/Connection", function(require, exports, module) {
+/**
+ * Network status
+ */
+module.exports = {
+        UNKNOWN: "unknown",
+        ETHERNET: "ethernet",
+        WIFI: "wifi",
+        CELL_2G: "2g",
+        CELL_3G: "3g",
+        CELL_4G: "4g",
+        NONE: "none"
+};
+});
+
+// file: lib/common/plugin/Contact.js
+define("cordova/plugin/Contact", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils');
+
+/**
+* Converts primitives into Complex Object
+* Currently only used for Date fields
+*/
+function convertIn(contact) {
+    var value = contact.birthday;
+    try {
+      contact.birthday = new Date(parseFloat(value));
+    } catch (exception){
+      console.log("Cordova Contact convertIn error: exception creating date.");
+    }
+    return contact;
+}
+
+/**
+* Converts Complex objects into primitives
+* Only conversion at present is for Dates.
+**/
+
+function convertOut(contact) {
+    var value = contact.birthday;
+    if (value !== null) {
+        // try to make it a Date object if it is not already
+        if (!utils.isDate(value)){
+            try {
+                value = new Date(value);
+            } catch(exception){
+                value = null;
+            }
+        }
+        if (utils.isDate(value)){
+            value = value.valueOf(); // convert to milliseconds
+        }
+        contact.birthday = value;
+    }
+    return contact;
+}
+
+/**
+* Contains information about a single contact.
+* @constructor
+* @param {DOMString} id unique identifier
+* @param {DOMString} displayName
+* @param {ContactName} name
+* @param {DOMString} nickname
+* @param {Array.<ContactField>} phoneNumbers array of phone numbers
+* @param {Array.<ContactField>} emails array of email addresses
+* @param {Array.<ContactAddress>} addresses array of addresses
+* @param {Array.<ContactField>} ims instant messaging user ids
+* @param {Array.<ContactOrganization>} organizations
+* @param {DOMString} birthday contact's birthday
+* @param {DOMString} note user notes about contact
+* @param {Array.<ContactField>} photos
+* @param {Array.<ContactField>} categories
+* @param {Array.<ContactField>} urls contact's web sites
+*/
+var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses,
+    ims, organizations, birthday, note, photos, categories, urls) {
+    this.id = id || null;
+    this.rawId = null;
+    this.displayName = displayName || null;
+    this.name = name || null; // ContactName
+    this.nickname = nickname || null;
+    this.phoneNumbers = phoneNumbers || null; // ContactField[]
+    this.emails = emails || null; // ContactField[]
+    this.addresses = addresses || null; // ContactAddress[]
+    this.ims = ims || null; // ContactField[]
+    this.organizations = organizations || null; // ContactOrganization[]
+    this.birthday = birthday || null;
+    this.note = note || null;
+    this.photos = photos || null; // ContactField[]
+    this.categories = categories || null; // ContactField[]
+    this.urls = urls || null; // ContactField[]
+};
+
+/**
+* Removes contact from device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.remove = function(successCB, errorCB) {
+    var fail = function(code) {
+        errorCB(new ContactError(code));
+    };
+    if (this.id === null) {
+        fail(ContactError.UNKNOWN_ERROR);
+    }
+    else {
+        exec(successCB, fail, "Contacts", "remove", [this.id]);
+    }
+};
+
+/**
+* Creates a deep copy of this Contact.
+* With the contact ID set to null.
+* @return copy of this Contact
+*/
+Contact.prototype.clone = function() {
+    var clonedContact = utils.clone(this);
+    var i;
+    clonedContact.id = null;
+    clonedContact.rawId = null;
+    // Loop through and clear out any id's in phones, emails, etc.
+    if (clonedContact.phoneNumbers) {
+        for (i = 0; i < clonedContact.phoneNumbers.length; i++) {
+            clonedContact.phoneNumbers[i].id = null;
+        }
+    }
+    if (clonedContact.emails) {
+        for (i = 0; i < clonedContact.emails.length; i++) {
+            clonedContact.emails[i].id = null;
+        }
+    }
+    if (clonedContact.addresses) {
+        for (i = 0; i < clonedContact.addresses.length; i++) {
+            clonedContact.addresses[i].id = null;
+        }
+    }
+    if (clonedContact.ims) {
+        for (i = 0; i < clonedContact.ims.length; i++) {
+            clonedContact.ims[i].id = null;
+        }
+    }
+    if (clonedContact.organizations) {
+        for (i = 0; i < clonedContact.organizations.length; i++) {
+            clonedContact.organizations[i].id = null;
+        }
+    }
+    if (clonedContact.categories) {
+        for (i = 0; i < clonedContact.categories.length; i++) {
+            clonedContact.categories[i].id = null;
+        }
+    }
+    if (clonedContact.photos) {
+        for (i = 0; i < clonedContact.photos.length; i++) {
+            clonedContact.photos[i].id = null;
+        }
+    }
+    if (clonedContact.urls) {
+        for (i = 0; i < clonedContact.urls.length; i++) {
+            clonedContact.urls[i].id = null;
+        }
+    }
+    return clonedContact;
+};
+
+/**
+* Persists contact to device storage.
+* @param successCB success callback
+* @param errorCB error callback
+*/
+Contact.prototype.save = function(successCB, errorCB) {
+  var fail = function(code) {
+      errorCB(new ContactError(code));
+  };
+    var success = function(result) {
+      if (result) {
+          if (typeof successCB === 'function') {
+              var fullContact = require('cordova/plugin/contacts').create(result);
+              successCB(convertIn(fullContact));
+          }
+      }
+      else {
+          // no Entry object returned
+          fail(ContactError.UNKNOWN_ERROR);
+      }
+  };
+    var dupContact = convertOut(utils.clone(this));
+    exec(success, fail, "Contacts", "save", [dupContact]);
+};
+
+
+module.exports = Contact;
+
+});
+
+// file: lib/common/plugin/ContactAddress.js
+define("cordova/plugin/ContactAddress", function(require, exports, module) {
+/**
+* Contact address.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code
+* @param formatted // NOTE: not a W3C standard
+* @param streetAddress
+* @param locality
+* @param region
+* @param postalCode
+* @param country
+*/
+
+var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.formatted = formatted || null;
+    this.streetAddress = streetAddress || null;
+    this.locality = locality || null;
+    this.region = region || null;
+    this.postalCode = postalCode || null;
+    this.country = country || null;
+};
+
+module.exports = ContactAddress;
+});
+
+// file: lib/common/plugin/ContactError.js
+define("cordova/plugin/ContactError", function(require, exports, module) {
+/**
+ *  ContactError.
+ *  An error code assigned by an implementation when an error has occured
+ * @constructor
+ */
+var ContactError = function(err) {
+    this.code = (typeof err != 'undefined' ? err : null);
+};
+
+/**
+ * Error codes
+ */
+ContactError.UNKNOWN_ERROR = 0;
+ContactError.INVALID_ARGUMENT_ERROR = 1;
+ContactError.TIMEOUT_ERROR = 2;
+ContactError.PENDING_OPERATION_ERROR = 3;
+ContactError.IO_ERROR = 4;
+ContactError.NOT_SUPPORTED_ERROR = 5;
+ContactError.PERMISSION_DENIED_ERROR = 20;
+
+module.exports = ContactError;
+});
+
+// file: lib/common/plugin/ContactField.js
+define("cordova/plugin/ContactField", function(require, exports, module) {
+/**
+* Generic contact field.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param type
+* @param value
+* @param pref
+*/
+var ContactField = function(type, value, pref) {
+    this.id = null;
+    this.type = (type && type.toString()) || null;
+    this.value = (value && value.toString()) || null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+};
+
+module.exports = ContactField;
+});
+
+// file: lib/common/plugin/ContactFindOptions.js
+define("cordova/plugin/ContactFindOptions", function(require, exports, module) {
+/**
+ * ContactFindOptions.
+ * @constructor
+ * @param filter used to match contacts against
+ * @param multiple boolean used to determine if more than one contact should be returned
+ */
+
+var ContactFindOptions = function(filter, multiple) {
+    this.filter = filter || '';
+    this.multiple = (typeof multiple != 'undefined' ? multiple : false);
+};
+
+module.exports = ContactFindOptions;
+});
+
+// file: lib/common/plugin/ContactName.js
+define("cordova/plugin/ContactName", function(require, exports, module) {
+/**
+* Contact name.
+* @constructor
+* @param formatted // NOTE: not part of W3C standard
+* @param familyName
+* @param givenName
+* @param middle
+* @param prefix
+* @param suffix
+*/
+var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) {
+    this.formatted = formatted || null;
+    this.familyName = familyName || null;
+    this.givenName = givenName || null;
+    this.middleName = middle || null;
+    this.honorificPrefix = prefix || null;
+    this.honorificSuffix = suffix || null;
+};
+
+module.exports = ContactName;
+});
+
+// file: lib/common/plugin/ContactOrganization.js
+define("cordova/plugin/ContactOrganization", function(require, exports, module) {
+/**
+* Contact organization.
+* @constructor
+* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard
+* @param name
+* @param dept
+* @param title
+* @param startDate
+* @param endDate
+* @param location
+* @param desc
+*/
+
+var ContactOrganization = function(pref, type, name, dept, title) {
+    this.id = null;
+    this.pref = (typeof pref != 'undefined' ? pref : false);
+    this.type = type || null;
+    this.name = name || null;
+    this.department = dept || null;
+    this.title = title || null;
+};
+
+module.exports = ContactOrganization;
+});
+
+// file: lib/common/plugin/Coordinates.js
+define("cordova/plugin/Coordinates", function(require, exports, module) {
+/**
+ * This class contains position information.
+ * @param {Object} lat
+ * @param {Object} lng
+ * @param {Object} alt
+ * @param {Object} acc
+ * @param {Object} head
+ * @param {Object} vel
+ * @param {Object} altacc
+ * @constructor
+ */
+var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) {
+    /**
+     * The latitude of the position.
+     */
+    this.latitude = lat;
+    /**
+     * The longitude of the position,
+     */
+    this.longitude = lng;
+    /**
+     * The accuracy of the position.
+     */
+    this.accuracy = acc;
+    /**
+     * The altitude of the position.
+     */
+    this.altitude = (alt !== undefined ? alt : null);
+    /**
+     * The direction the device is moving at the position.
+     */
+    this.heading = (head !== undefined ? head : null);
+    /**
+     * The velocity with which the device is moving at the position.
+     */
+    this.speed = (vel !== undefined ? vel : null);
+
+    if (this.speed === 0 || this.speed === null) {
+        this.heading = NaN;
+    }
+
+    /**
+     * The altitude accuracy of the position.
+     */
+    this.altitudeAccuracy = (altacc !== undefined) ? altacc : null;
+};
+
+module.exports = Coordinates;
+
+});
+
+// file: lib/common/plugin/DirectoryEntry.js
+define("cordova/plugin/DirectoryEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileError = require('cordova/plugin/FileError'),
+    DirectoryReader = require('cordova/plugin/DirectoryReader');
+
+/**
+ * An interface representing a directory on the file system.
+ *
+ * {boolean} isFile always false (readonly)
+ * {boolean} isDirectory always true (readonly)
+ * {DOMString} name of the directory, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the directory (readonly)
+ * TODO: implement this!!! {FileSystem} filesystem on which the directory resides (readonly)
+ */
+var DirectoryEntry = function(name, fullPath) {
+     DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]);
+};
+
+utils.extend(DirectoryEntry, Entry);
+
+/**
+ * Creates a new DirectoryReader to read entries from this directory
+ */
+DirectoryEntry.prototype.createReader = function() {
+    return new DirectoryReader(this.fullPath);
+};
+
+/**
+ * Creates or looks up a directory
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory
+ * @param {Flags} options to create or excluively create the directory
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]);
+};
+
+/**
+ * Deletes a directory and all of it's contents
+ *
+ * @param {Function} successCallback is called with no parameters
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]);
+};
+
+/**
+ * Creates or looks up a file
+ *
+ * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file
+ * @param {Flags} options to create or excluively create the file
+ * @param {Function} successCallback is called with the new entry
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var FileEntry = require('cordova/plugin/FileEntry');
+        var entry = new FileEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFile", [this.fullPath, path, options]);
+};
+
+module.exports = DirectoryEntry;
+
+});
+
+// file: lib/common/plugin/DirectoryReader.js
+define("cordova/plugin/DirectoryReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError') ;
+
+/**
+ * An interface that lists the files and directories in a directory.
+ */
+function DirectoryReader(path) {
+    this.path = path || null;
+}
+
+/**
+ * Returns a list of entries from a directory.
+ *
+ * @param {Function} successCallback is called with a list of entries
+ * @param {Function} errorCallback is called with a FileError
+ */
+DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var retVal = [];
+        for (var i=0; i<result.length; i++) {
+            var entry = null;
+            if (result[i].isDirectory) {
+                entry = new (require('cordova/plugin/DirectoryEntry'))();
+            }
+            else if (result[i].isFile) {
+                entry = new (require('cordova/plugin/FileEntry'))();
+            }
+            entry.isDirectory = result[i].isDirectory;
+            entry.isFile = result[i].isFile;
+            entry.name = result[i].name;
+            entry.fullPath = result[i].fullPath;
+            retVal.push(entry);
+        }
+        successCallback(retVal);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "readEntries", [this.path]);
+};
+
+module.exports = DirectoryReader;
+
+});
+
+// file: lib/common/plugin/Entry.js
+define("cordova/plugin/Entry", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    Metadata = require('cordova/plugin/Metadata');
+
+/**
+ * Represents a file or directory on the local file system.
+ *
+ * @param isFile
+ *            {boolean} true if Entry is a file (readonly)
+ * @param isDirectory
+ *            {boolean} true if Entry is a directory (readonly)
+ * @param name
+ *            {DOMString} name of the file or directory, excluding the path
+ *            leading to it (readonly)
+ * @param fullPath
+ *            {DOMString} the absolute full path to the file or directory
+ *            (readonly)
+ */
+function Entry(isFile, isDirectory, name, fullPath, fileSystem) {
+    this.isFile = (typeof isFile != 'undefined'?isFile:false);
+    this.isDirectory = (typeof isDirectory != 'undefined'?isDirectory:false);
+    this.name = name || '';
+    this.fullPath = fullPath || '';
+    this.filesystem = fileSystem || null;
+}
+
+/**
+ * Look up the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ */
+Entry.prototype.getMetadata = function(successCallback, errorCallback) {
+  var success = typeof successCallback !== 'function' ? null : function(lastModified) {
+      var metadata = new Metadata(lastModified);
+      successCallback(metadata);
+  };
+  var fail = typeof errorCallback !== 'function' ? null : function(code) {
+      errorCallback(new FileError(code));
+  };
+
+  exec(success, fail, "File", "getMetadata", [this.fullPath]);
+};
+
+/**
+ * Set the metadata of the entry.
+ *
+ * @param successCallback
+ *            {Function} is called with a Metadata object
+ * @param errorCallback
+ *            {Function} is called with a FileError
+ * @param metadataObject
+ *            {Object} keys and values to set
+ */
+Entry.prototype.setMetadata = function(successCallback, errorCallback, metadataObject) {
+
+  exec(successCallback, errorCallback, "File", "setMetadata", [this.fullPath, metadataObject]);
+};
+
+/**
+ * Move a file or directory to a new location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to move this entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new DirectoryEntry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+    // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "moveTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Copy a directory to a different location.
+ *
+ * @param parent
+ *            {DirectoryEntry} the directory to which to copy the entry
+ * @param newName
+ *            {DOMString} new name of the entry, defaults to the current name
+ * @param successCallback
+ *            {Function} called with the new Entry object
+ * @param errorCallback
+ *            {Function} called with a FileError
+ */
+Entry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    // user must specify parent Entry
+    if (!parent) {
+        fail(FileError.NOT_FOUND_ERR);
+        return;
+    }
+
+        // source path
+    var srcPath = this.fullPath,
+        // entry name
+        name = newName || this.name,
+        // success callback
+        success = function(entry) {
+            if (entry) {
+                if (typeof successCallback === 'function') {
+                    // create appropriate Entry object
+                    var result = (entry.isDirectory) ? new (require('cordova/plugin/DirectoryEntry'))(entry.name, entry.fullPath) : new (require('cordova/plugin/FileEntry'))(entry.name, entry.fullPath);
+                    try {
+                        successCallback(result);
+                    }
+                    catch (e) {
+                        console.log('Error invoking callback: ' + e);
+                    }
+                }
+            }
+            else {
+                // no Entry object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+
+    // copy
+    exec(success, fail, "File", "copyTo", [srcPath, parent.fullPath, name]);
+};
+
+/**
+ * Return a URL that can be used to identify this entry.
+ */
+Entry.prototype.toURL = function() {
+    // fullPath attribute contains the full URL
+    return this.fullPath;
+};
+
+/**
+ * Returns a URI that can be used to identify this entry.
+ *
+ * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI.
+ * @return uri
+ */
+Entry.prototype.toURI = function(mimeType) {
+    console.log("DEPRECATED: Update your code to use 'toURL'");
+    // fullPath attribute contains the full URI
+    return this.toURL();
+};
+
+/**
+ * Remove a file or directory. It is an error to attempt to delete a
+ * directory that is not empty. It is an error to attempt to delete a
+ * root directory of a file system.
+ *
+ * @param successCallback {Function} called with no parameters
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.remove = function(successCallback, errorCallback) {
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(successCallback, fail, "File", "remove", [this.fullPath]);
+};
+
+/**
+ * Look up the parent DirectoryEntry of this entry.
+ *
+ * @param successCallback {Function} called with the parent DirectoryEntry object
+ * @param errorCallback {Function} called with a FileError
+ */
+Entry.prototype.getParent = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(result) {
+        var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+        var entry = new DirectoryEntry(result.name, result.fullPath);
+        successCallback(entry);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getParent", [this.fullPath]);
+};
+
+module.exports = Entry;
+});
+
+// file: lib/common/plugin/File.js
+define("cordova/plugin/File", function(require, exports, module) {
+/**
+ * Constructor.
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+
+var File = function(name, fullPath, type, lastModifiedDate, size){
+    this.name = name || '';
+    this.fullPath = fullPath || null;
+    this.type = type || null;
+    this.lastModifiedDate = lastModifiedDate || null;
+    this.size = size || 0;
+};
+
+module.exports = File;
+});
+
+// file: lib/common/plugin/FileEntry.js
+define("cordova/plugin/FileEntry", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    Entry = require('cordova/plugin/Entry'),
+    FileWriter = require('cordova/plugin/FileWriter'),
+    File = require('cordova/plugin/File'),
+    FileError = require('cordova/plugin/FileError');
+
+/**
+ * An interface representing a file on the file system.
+ *
+ * {boolean} isFile always true (readonly)
+ * {boolean} isDirectory always false (readonly)
+ * {DOMString} name of the file, excluding the path leading to it (readonly)
+ * {DOMString} fullPath the absolute full path to the file (readonly)
+ * {FileSystem} filesystem on which the file resides (readonly)
+ */
+var FileEntry = function(name, fullPath) {
+     FileEntry.__super__.constructor.apply(this, [true, false, name, fullPath]);
+};
+
+utils.extend(FileEntry, Entry);
+
+/**
+ * Creates a new FileWriter associated with the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new FileWriter
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.createWriter = function(successCallback, errorCallback) {
+    this.file(function(filePointer) {
+        var writer = new FileWriter(filePointer);
+
+        if (writer.fileName === null || writer.fileName === "") {
+            if (typeof errorCallback === "function") {
+                errorCallback(new FileError(FileError.INVALID_STATE_ERR));
+            }
+        } else {
+            if (typeof successCallback === "function") {
+                successCallback(writer);
+            }
+        }
+    }, errorCallback);
+};
+
+/**
+ * Returns a File that represents the current state of the file that this FileEntry represents.
+ *
+ * @param {Function} successCallback is called with the new File object
+ * @param {Function} errorCallback is called with a FileError
+ */
+FileEntry.prototype.file = function(successCallback, errorCallback) {
+    var win = typeof successCallback !== 'function' ? null : function(f) {
+        var file = new File(f.name, f.fullPath, f.type, f.lastModifiedDate, f.size);
+        successCallback(file);
+    };
+    var fail = typeof errorCallback !== 'function' ? null : function(code) {
+        errorCallback(new FileError(code));
+    };
+    exec(win, fail, "File", "getFileMetadata", [this.fullPath]);
+};
+
+
+module.exports = FileEntry;
+});
+
+// file: lib/common/plugin/FileError.js
+define("cordova/plugin/FileError", function(require, exports, module) {
+/**
+ * FileError
+ */
+function FileError(error) {
+  this.code = error || null;
+}
+
+// File error codes
+// Found in DOMException
+FileError.NOT_FOUND_ERR = 1;
+FileError.SECURITY_ERR = 2;
+FileError.ABORT_ERR = 3;
+
+// Added by File API specification
+FileError.NOT_READABLE_ERR = 4;
+FileError.ENCODING_ERR = 5;
+FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
+FileError.INVALID_STATE_ERR = 7;
+FileError.SYNTAX_ERR = 8;
+FileError.INVALID_MODIFICATION_ERR = 9;
+FileError.QUOTA_EXCEEDED_ERR = 10;
+FileError.TYPE_MISMATCH_ERR = 11;
+FileError.PATH_EXISTS_ERR = 12;
+
+module.exports = FileError;
+});
+
+// file: lib/common/plugin/FileReader.js
+define("cordova/plugin/FileReader", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class reads the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To read from the SD card, the file name is "sdcard/my_file.txt"
+ * @constructor
+ */
+var FileReader = function() {
+    this.fileName = "";
+
+    this.readyState = 0; // FileReader.EMPTY
+
+    // File data
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onloadstart = null;    // When the read starts.
+    this.onprogress = null;     // While reading (and decoding) file or fileBlob data, and reporting partial file data (progess.loaded/progress.total)
+    this.onload = null;         // When the read has successfully completed.
+    this.onerror = null;        // When the read has failed (see errors).
+    this.onloadend = null;      // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the read has been aborted. For instance, by invoking the abort() method.
+};
+
+// States
+FileReader.EMPTY = 0;
+FileReader.LOADING = 1;
+FileReader.DONE = 2;
+
+/**
+ * Abort reading file.
+ */
+FileReader.prototype.abort = function() {
+    this.result = null;
+
+    if (this.readyState == FileReader.DONE || this.readyState == FileReader.EMPTY) {
+      return;
+    }
+
+    this.readyState = FileReader.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === 'function') {
+        this.onabort(new ProgressEvent('abort', {target:this}));
+    }
+    // If load end callback
+    if (typeof this.onloadend === 'function') {
+        this.onloadend(new ProgressEvent('loadend', {target:this}));
+    }
+};
+
+/**
+ * Read text file.
+ *
+ * @param file          {File} File object containing file properties
+ * @param encoding      [Optional] (see http://www.iana.org/assignments/character-sets)
+ */
+FileReader.prototype.readAsText = function(file, encoding) {
+    // Figure out pathing
+    this.fileName = '';
+    if (typeof file.fullPath === 'undefined') {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    // Default encoding is UTF-8
+    var enc = encoding ? encoding : "UTF-8";
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // null result
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsText", [this.fileName, enc]);
+};
+
+
+/**
+ * Read file and return data as a base64 encoded data url.
+ * A data url is of the form:
+ *      data:[<mediatype>][;base64],<data>
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsDataURL = function(file) {
+    this.fileName = "";
+    if (typeof file.fullPath === "undefined") {
+        this.fileName = file;
+    } else {
+        this.fileName = file.fullPath;
+    }
+
+    // Already loading something
+    if (this.readyState == FileReader.LOADING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // LOADING state
+    this.readyState = FileReader.LOADING;
+
+    // If loadstart callback
+    if (typeof this.onloadstart === "function") {
+        this.onloadstart(new ProgressEvent("loadstart", {target:this}));
+    }
+
+    var me = this;
+
+    // Read file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            // Save result
+            me.result = r;
+
+            // If onload callback
+            if (typeof me.onload === "function") {
+                me.onload(new ProgressEvent("load", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileReader.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileReader.DONE;
+
+            me.result = null;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {target:me}));
+            }
+
+            // If onloadend callback
+            if (typeof me.onloadend === "function") {
+                me.onloadend(new ProgressEvent("loadend", {target:me}));
+            }
+        }, "File", "readAsDataURL", [this.fileName]);
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsBinaryString = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('method "readAsBinaryString" is not supported at this time.');
+};
+
+/**
+ * Read file and return data as a binary data.
+ *
+ * @param file          {File} File object containing file properties
+ */
+FileReader.prototype.readAsArrayBuffer = function(file) {
+    // TODO - Can't return binary data to browser.
+    console.log('This method is not supported at this time.');
+};
+
+module.exports = FileReader;
+});
+
+// file: lib/common/plugin/FileSystem.js
+define("cordova/plugin/FileSystem", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry');
+
+/**
+ * An interface representing a file system
+ *
+ * @constructor
+ * {DOMString} name the unique name of the file system (readonly)
+ * {DirectoryEntry} root directory of the file system (readonly)
+ */
+var FileSystem = function(name, root) {
+    this.name = name || null;
+    if (root) {
+        this.root = new DirectoryEntry(root.name, root.fullPath);
+    }
+};
+
+module.exports = FileSystem;
+
+});
+
+// file: lib/common/plugin/FileTransfer.js
+define("cordova/plugin/FileTransfer", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileTransferError = require('cordova/plugin/FileTransferError');
+
+/**
+ * FileTransfer uploads a file to a remote server.
+ * @constructor
+ */
+var FileTransfer = function() {};
+
+/**
+* Given an absolute file path, uploads a file on the device to a remote server
+* using a multipart HTTP request.
+* @param filePath {String}           Full path of the file on the device
+* @param server {String}             URL of the server to receive the file
+* @param successCallback (Function}  Callback to be invoked when upload has completed
+* @param errorCallback {Function}    Callback to be invoked upon error
+* @param options {FileUploadOptions} Optional parameters such as file name and mimetype
+* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false
+*/
+FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) {
+    // sanity parameter checking
+    if (!filePath || !server) throw new Error("FileTransfer.upload requires filePath and server URL parameters at the minimum.");
+    // check for options
+    var fileKey = null;
+    var fileName = null;
+    var mimeType = null;
+    var params = null;
+    var chunkedMode = true;
+    var headers = null;
+    if (options) {
+        fileKey = options.fileKey;
+        fileName = options.fileName;
+        mimeType = options.mimeType;
+        headers = options.headers;
+        if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") {
+            chunkedMode = options.chunkedMode;
+        }
+        if (options.params) {
+            params = options.params;
+        }
+        else {
+            params = {};
+        }
+    }
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(successCallback, fail, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode, headers]);
+};
+
+/**
+ * Downloads a file form a given URL and saves it to the specified directory.
+ * @param source {String}          URL of the server to receive the file
+ * @param target {String}         Full path of the file on the device
+ * @param successCallback (Function}  Callback to be invoked when upload has completed
+ * @param errorCallback {Function}    Callback to be invoked upon error
+ */
+FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) {
+    // sanity parameter checking
+    if (!source || !target) throw new Error("FileTransfer.download requires source URI and target URI parameters at the minimum.");
+    var win = function(result) {
+        var entry = null;
+        if (result.isDirectory) {
+            entry = new (require('cordova/plugin/DirectoryEntry'))();
+        }
+        else if (result.isFile) {
+            entry = new (require('cordova/plugin/FileEntry'))();
+        }
+        entry.isDirectory = result.isDirectory;
+        entry.isFile = result.isFile;
+        entry.name = result.name;
+        entry.fullPath = result.fullPath;
+        successCallback(entry);
+    };
+
+    var fail = function(e) {
+        var error = new FileTransferError(e.code, e.source, e.target, e.http_status);
+        errorCallback(error);
+    };
+
+    exec(win, errorCallback, 'FileTransfer', 'download', [source, target]);
+};
+
+module.exports = FileTransfer;
+
+});
+
+// file: lib/common/plugin/FileTransferError.js
+define("cordova/plugin/FileTransferError", function(require, exports, module) {
+/**
+ * FileTransferError
+ * @constructor
+ */
+var FileTransferError = function(code, source, target, status) {
+    this.code = code || null;
+    this.source = source || null;
+    this.target = target || null;
+    this.http_status = status || null;
+};
+
+FileTransferError.FILE_NOT_FOUND_ERR = 1;
+FileTransferError.INVALID_URL_ERR = 2;
+FileTransferError.CONNECTION_ERR = 3;
+
+module.exports = FileTransferError;
+
+});
+
+// file: lib/common/plugin/FileUploadOptions.js
+define("cordova/plugin/FileUploadOptions", function(require, exports, module) {
+/**
+ * Options to customize the HTTP request used to upload files.
+ * @constructor
+ * @param fileKey {String}   Name of file request parameter.
+ * @param fileName {String}  Filename to be used by the server. Defaults to image.jpg.
+ * @param mimeType {String}  Mimetype of the uploaded file. Defaults to image/jpeg.
+ * @param params {Object}    Object with key: value params to send to the server.
+ * @param headers {Object}   Keys are header names, values are header values. Multiple
+ *                           headers of the same name are not supported.
+ */
+var FileUploadOptions = function(fileKey, fileName, mimeType, params, headers) {
+    this.fileKey = fileKey || null;
+    this.fileName = fileName || null;
+    this.mimeType = mimeType || null;
+    this.params = params || null;
+    this.headers = headers || null;
+};
+
+module.exports = FileUploadOptions;
+
+});
+
+// file: lib/common/plugin/FileUploadResult.js
+define("cordova/plugin/FileUploadResult", function(require, exports, module) {
+/**
+ * FileUploadResult
+ * @constructor
+ */
+var FileUploadResult = function() {
+    this.bytesSent = 0;
+    this.responseCode = null;
+    this.response = null;
+};
+
+module.exports = FileUploadResult;
+});
+
+// file: lib/common/plugin/FileWriter.js
+define("cordova/plugin/FileWriter", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    FileError = require('cordova/plugin/FileError'),
+    ProgressEvent = require('cordova/plugin/ProgressEvent');
+
+/**
+ * This class writes to the mobile device file system.
+ *
+ * For Android:
+ *      The root directory is the root of the file system.
+ *      To write to the SD card, the file name is "sdcard/my_file.txt"
+ *
+ * @constructor
+ * @param file {File} File object containing file properties
+ * @param append if true write to the end of the file, otherwise overwrite the file
+ */
+var FileWriter = function(file) {
+    this.fileName = "";
+    this.length = 0;
+    if (file) {
+        this.fileName = file.fullPath || file;
+        this.length = file.size || 0;
+    }
+    // default is to write at the beginning of the file
+    this.position = 0;
+
+    this.readyState = 0; // EMPTY
+
+    this.result = null;
+
+    // Error
+    this.error = null;
+
+    // Event handlers
+    this.onwritestart = null;   // When writing starts
+    this.onprogress = null;     // While writing the file, and reporting partial file data
+    this.onwrite = null;        // When the write has successfully completed.
+    this.onwriteend = null;     // When the request has completed (either in success or failure).
+    this.onabort = null;        // When the write has been aborted. For instance, by invoking the abort() method.
+    this.onerror = null;        // When the write has failed (see errors).
+};
+
+// States
+FileWriter.INIT = 0;
+FileWriter.WRITING = 1;
+FileWriter.DONE = 2;
+
+/**
+ * Abort writing file.
+ */
+FileWriter.prototype.abort = function() {
+    // check for invalid state
+    if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // set error
+    this.error = new FileError(FileError.ABORT_ERR);
+
+    this.readyState = FileWriter.DONE;
+
+    // If abort callback
+    if (typeof this.onabort === "function") {
+        this.onabort(new ProgressEvent("abort", {"target":this}));
+    }
+
+    // If write end callback
+    if (typeof this.onwriteend === "function") {
+        this.onwriteend(new ProgressEvent("writeend", {"target":this}));
+    }
+};
+
+/**
+ * Writes data to the file
+ *
+ * @param text to be written
+ */
+FileWriter.prototype.write = function(text) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":me}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // position always increases by bytes written because file would be extended
+            me.position += r;
+            // The length of the file is now where we are done writing.
+
+            me.length = me.position;
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "write", [this.fileName, text, this.position]);
+};
+
+/**
+ * Moves the file pointer to the location specified.
+ *
+ * If the offset is a negative number the position of the file
+ * pointer is rewound.  If the offset is greater than the file
+ * size the position is set to the end of the file.
+ *
+ * @param offset is the location to move the file pointer to.
+ */
+FileWriter.prototype.seek = function(offset) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    if (!offset && offset !== 0) {
+        return;
+    }
+
+    // See back from end of file.
+    if (offset < 0) {
+        this.position = Math.max(offset + this.length, 0);
+    }
+    // Offset is bigger then file size so set position
+    // to the end of the file.
+    else if (offset > this.length) {
+        this.position = this.length;
+    }
+    // Offset is between 0 and file size so set the position
+    // to start writing.
+    else {
+        this.position = offset;
+    }
+};
+
+/**
+ * Truncates the file to the size specified.
+ *
+ * @param size to chop the file at.
+ */
+FileWriter.prototype.truncate = function(size) {
+    // Throw an exception if we are already writing a file
+    if (this.readyState === FileWriter.WRITING) {
+        throw new FileError(FileError.INVALID_STATE_ERR);
+    }
+
+    // WRITING state
+    this.readyState = FileWriter.WRITING;
+
+    var me = this;
+
+    // If onwritestart callback
+    if (typeof me.onwritestart === "function") {
+        me.onwritestart(new ProgressEvent("writestart", {"target":this}));
+    }
+
+    // Write file
+    exec(
+        // Success callback
+        function(r) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Update the length of the file
+            me.length = r;
+            me.position = Math.min(me.position, r);
+
+            // If onwrite callback
+            if (typeof me.onwrite === "function") {
+                me.onwrite(new ProgressEvent("write", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        },
+        // Error callback
+        function(e) {
+            // If DONE (cancelled), then don't do anything
+            if (me.readyState === FileWriter.DONE) {
+                return;
+            }
+
+            // DONE state
+            me.readyState = FileWriter.DONE;
+
+            // Save error
+            me.error = new FileError(e);
+
+            // If onerror callback
+            if (typeof me.onerror === "function") {
+                me.onerror(new ProgressEvent("error", {"target":me}));
+            }
+
+            // If onwriteend callback
+            if (typeof me.onwriteend === "function") {
+                me.onwriteend(new ProgressEvent("writeend", {"target":me}));
+            }
+        }, "File", "truncate", [this.fileName, size]);
+};
+
+module.exports = FileWriter;
+
+});
+
+// file: lib/common/plugin/Flags.js
+define("cordova/plugin/Flags", function(require, exports, module) {
+/**
+ * Supplies arguments to methods that lookup or create files and directories.
+ *
+ * @param create
+ *            {boolean} file or directory if it doesn't exist
+ * @param exclusive
+ *            {boolean} used with create; if true the command will fail if
+ *            target path exists
+ */
+function Flags(create, exclusive) {
+    this.create = create || false;
+    this.exclusive = exclusive || false;
+}
+
+module.exports = Flags;
+});
+
+// file: lib/common/plugin/LocalFileSystem.js
+define("cordova/plugin/LocalFileSystem", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Represents a local file system.
+ */
+var LocalFileSystem = function() {
+
+};
+
+LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence
+LocalFileSystem.PERSISTENT = 1; //persistent
+
+module.exports = LocalFileSystem;
+});
+
+// file: lib/common/plugin/Media.js
+define("cordova/plugin/Media", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+var mediaObjects = {};
+
+/**
+ * This class provides access to the device media, interfaces to both sound and video
+ *
+ * @constructor
+ * @param src                   The file name or url to play
+ * @param successCallback       The callback to be called when the file is done playing or recording.
+ *                                  successCallback()
+ * @param errorCallback         The callback to be called if there is an error.
+ *                                  errorCallback(int errorCode) - OPTIONAL
+ * @param statusCallback        The callback to be called when media status has changed.
+ *                                  statusCallback(int statusCode) - OPTIONAL
+ */
+var Media = function(src, successCallback, errorCallback, statusCallback) {
+
+    // successCallback optional
+    if (successCallback && (typeof successCallback !== "function")) {
+        console.log("Media Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Media Error: errorCallback is not a function");
+        return;
+    }
+
+    // statusCallback optional
+    if (statusCallback && (typeof statusCallback !== "function")) {
+        console.log("Media Error: statusCallback is not a function");
+        return;
+    }
+
+    this.id = utils.createUUID();
+    mediaObjects[this.id] = this;
+    this.src = src;
+    this.successCallback = successCallback;
+    this.errorCallback = errorCallback;
+    this.statusCallback = statusCallback;
+    this._duration = -1;
+    this._position = -1;
+    exec(null, this.errorCallback, "Media", "create", [this.id, this.src]);
+};
+
+// Media messages
+Media.MEDIA_STATE = 1;
+Media.MEDIA_DURATION = 2;
+Media.MEDIA_POSITION = 3;
+Media.MEDIA_ERROR = 9;
+
+// Media states
+Media.MEDIA_NONE = 0;
+Media.MEDIA_STARTING = 1;
+Media.MEDIA_RUNNING = 2;
+Media.MEDIA_PAUSED = 3;
+Media.MEDIA_STOPPED = 4;
+Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"];
+
+// "static" function to return existing objs.
+Media.get = function(id) {
+    return mediaObjects[id];
+};
+
+/**
+ * Start or resume playing audio file.
+ */
+Media.prototype.play = function(options) {
+    exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]);
+};
+
+/**
+ * Stop playing audio file.
+ */
+Media.prototype.stop = function() {
+    var me = this;
+    exec(function() {
+        me._position = 0;
+        me.successCallback();
+    }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]);
+};
+
+/**
+ * Seek or jump to a new time in the track..
+ */
+Media.prototype.seekTo = function(milliseconds) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+    }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]);
+};
+
+/**
+ * Pause playing audio file.
+ */
+Media.prototype.pause = function() {
+    exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]);
+};
+
+/**
+ * Get duration of an audio file.
+ * The duration is only set for audio that is playing, paused or stopped.
+ *
+ * @return      duration or -1 if not known.
+ */
+Media.prototype.getDuration = function() {
+    return this._duration;
+};
+
+/**
+ * Get position of audio.
+ */
+Media.prototype.getCurrentPosition = function(success, fail) {
+    var me = this;
+    exec(function(p) {
+        me._position = p;
+        success(p);
+    }, fail, "Media", "getCurrentPositionAudio", [this.id]);
+};
+
+/**
+ * Start recording audio file.
+ */
+Media.prototype.startRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]);
+};
+
+/**
+ * Stop recording audio file.
+ */
+Media.prototype.stopRecord = function() {
+    exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]);
+};
+
+/**
+ * Release the resources.
+ */
+Media.prototype.release = function() {
+    exec(null, this.errorCallback, "Media", "release", [this.id]);
+};
+
+/**
+ * Adjust the volume.
+ */
+Media.prototype.setVolume = function(volume) {
+    exec(null, null, "Media", "setVolume", [this.id, volume]);
+};
+
+/**
+ * Audio has status update.
+ * PRIVATE
+ *
+ * @param id            The media object id (string)
+ * @param status        The status code (int)
+ * @param msg           The status message (string)
+ */
+Media.onStatus = function(id, msg, value) {
+    var media = mediaObjects[id];
+    // If state update
+    if (msg === Media.MEDIA_STATE) {
+        if (value === Media.MEDIA_STOPPED) {
+            if (media.successCallback) {
+                media.successCallback();
+            }
+        }
+        if (media.statusCallback) {
+            media.statusCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_DURATION) {
+        media._duration = value;
+    }
+    else if (msg === Media.MEDIA_ERROR) {
+        if (media.errorCallback) {
+            // value should be a MediaError object when msg == MEDIA_ERROR
+            media.errorCallback(value);
+        }
+    }
+    else if (msg === Media.MEDIA_POSITION) {
+        media._position = value;
+    }
+};
+
+module.exports = Media;
+});
+
+// file: lib/common/plugin/MediaError.js
+define("cordova/plugin/MediaError", function(require, exports, module) {
+/**
+ * This class contains information about any Media errors.
+ * @constructor
+ */
+var MediaError = function(code, msg) {
+    this.code = (code !== undefined ? code : null);
+    this.message = msg || "";
+};
+
+MediaError.MEDIA_ERR_NONE_ACTIVE    = 0;
+MediaError.MEDIA_ERR_ABORTED        = 1;
+MediaError.MEDIA_ERR_NETWORK        = 2;
+MediaError.MEDIA_ERR_DECODE         = 3;
+MediaError.MEDIA_ERR_NONE_SUPPORTED = 4;
+
+module.exports = MediaError;
+});
+
+// file: lib/common/plugin/MediaFile.js
+define("cordova/plugin/MediaFile", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    File = require('cordova/plugin/File'),
+    CaptureError = require('cordova/plugin/CaptureError');
+/**
+ * Represents a single file.
+ *
+ * name {DOMString} name of the file, without path information
+ * fullPath {DOMString} the full path of the file, including the name
+ * type {DOMString} mime type
+ * lastModifiedDate {Date} last modified date
+ * size {Number} size of the file in bytes
+ */
+var MediaFile = function(name, fullPath, type, lastModifiedDate, size){
+    MediaFile.__super__.constructor.apply(this, arguments);
+};
+
+utils.extend(MediaFile, File);
+
+/**
+ * Request capture format data for a specific file and type
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ */
+MediaFile.prototype.getFormatData = function(successCallback, errorCallback) {
+    if (typeof this.fullPath === "undefined" || this.fullPath === null) {
+        errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT));
+    } else {
+        exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]);
+    }
+};
+
+// TODO: can we axe this?
+/**
+ * Casts a PluginResult message property  (array of objects) to an array of MediaFile objects
+ * (used in Objective-C and Android)
+ *
+ * @param {PluginResult} pluginResult
+ */
+MediaFile.cast = function(pluginResult) {
+    var mediaFiles = [];
+    for (var i=0; i<pluginResult.message.length; i++) {
+        var mediaFile = new MediaFile();
+        mediaFile.name = pluginResult.message[i].name;
+        mediaFile.fullPath = pluginResult.message[i].fullPath;
+        mediaFile.type = pluginResult.message[i].type;
+        mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate;
+        mediaFile.size = pluginResult.message[i].size;
+        mediaFiles.push(mediaFile);
+    }
+    pluginResult.message = mediaFiles;
+    return pluginResult;
+};
+
+module.exports = MediaFile;
+
+});
+
+// file: lib/common/plugin/MediaFileData.js
+define("cordova/plugin/MediaFileData", function(require, exports, module) {
+/**
+ * MediaFileData encapsulates format information of a media file.
+ *
+ * @param {DOMString} codecs
+ * @param {long} bitrate
+ * @param {long} height
+ * @param {long} width
+ * @param {float} duration
+ */
+var MediaFileData = function(codecs, bitrate, height, width, duration){
+    this.codecs = codecs || null;
+    this.bitrate = bitrate || 0;
+    this.height = height || 0;
+    this.width = width || 0;
+    this.duration = duration || 0;
+};
+
+module.exports = MediaFileData;
+});
+
+// file: lib/common/plugin/Metadata.js
+define("cordova/plugin/Metadata", function(require, exports, module) {
+/**
+ * Information about the state of the file or directory
+ *
+ * {Date} modificationTime (readonly)
+ */
+var Metadata = function(time) {
+    this.modificationTime = (typeof time != 'undefined'?new Date(time):null);
+};
+
+module.exports = Metadata;
+});
+
+// file: lib/common/plugin/Position.js
+define("cordova/plugin/Position", function(require, exports, module) {
+var Coordinates = require('cordova/plugin/Coordinates');
+
+var Position = function(coords, timestamp) {
+    if (coords) {
+        this.coords = new Coordinates(coords.latitude, coords.longitude, coords.altitude, coords.accuracy, coords.heading, coords.velocity, coords.altitudeAccuracy);
+    } else {
+        this.coords = new Coordinates();
+    }
+    this.timestamp = (timestamp !== undefined) ? timestamp : new Date();
+};
+
+module.exports = Position;
+
+});
+
+// file: lib/common/plugin/PositionError.js
+define("cordova/plugin/PositionError", function(require, exports, module) {
+/**
+ * Position error object
+ *
+ * @constructor
+ * @param code
+ * @param message
+ */
+var PositionError = function(code, message) {
+    this.code = code || null;
+    this.message = message || '';
+};
+
+PositionError.PERMISSION_DENIED = 1;
+PositionError.POSITION_UNAVAILABLE = 2;
+PositionError.TIMEOUT = 3;
+
+module.exports = PositionError;
+});
+
+// file: lib/common/plugin/ProgressEvent.js
+define("cordova/plugin/ProgressEvent", function(require, exports, module) {
+// If ProgressEvent exists in global context, use it already, otherwise use our own polyfill
+// Feature test: See if we can instantiate a native ProgressEvent;
+// if so, use that approach,
+// otherwise fill-in with our own implementation.
+//
+// NOTE: right now we always fill in with our own. Down the road would be nice if we can use whatever is native in the webview.
+var ProgressEvent = (function() {
+    /*
+    var createEvent = function(data) {
+        var event = document.createEvent('Events');
+        event.initEvent('ProgressEvent', false, false);
+        if (data) {
+            for (var i in data) {
+                if (data.hasOwnProperty(i)) {
+                    event[i] = data[i];
+                }
+            }
+            if (data.target) {
+                // TODO: cannot call <some_custom_object>.dispatchEvent
+                // need to first figure out how to implement EventTarget
+            }
+        }
+        return event;
+    };
+    try {
+        var ev = createEvent({type:"abort",target:document});
+        return function ProgressEvent(type, data) {
+            data.type = type;
+            return createEvent(data);
+        };
+    } catch(e){
+    */
+        return function ProgressEvent(type, dict) {
+            this.type = type;
+            this.bubbles = false;
+            this.cancelBubble = false;
+            this.cancelable = false;
+            this.lengthComputable = false;
+            this.loaded = dict && dict.loaded ? dict.loaded : 0;
+            this.total = dict && dict.total ? dict.total : 0;
+            this.target = dict && dict.target ? dict.target : null;
+        };
+    //}
+})();
+
+module.exports = ProgressEvent;
+});
+
+// file: lib/common/plugin/accelerometer.js
+define("cordova/plugin/accelerometer", function(require, exports, module) {
+/**
+ * This class provides access to device accelerometer data.
+ * @constructor
+ */
+var utils = require("cordova/utils"),
+    exec = require("cordova/exec"),
+    Acceleration = require('cordova/plugin/Acceleration');
+
+// Is the accel sensor running?
+var running = false;
+
+// Keeps reference to watchAcceleration calls.
+var timers = {};
+
+// Array of listeners; used to keep track of when we should call start and stop.
+var listeners = [];
+
+// Last returned acceleration object from native
+var accel = null;
+
+// Tells native to start.
+function start() {
+    exec(function(a) {
+        var tempListeners = listeners.slice(0);
+        accel = new Acceleration(a.x, a.y, a.z, a.timestamp);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].win(accel);
+        }
+    }, function(e) {
+        var tempListeners = listeners.slice(0);
+        for (var i = 0, l = tempListeners.length; i < l; i++) {
+            tempListeners[i].fail(e);
+        }
+    }, "Accelerometer", "start", []);
+    running = true;
+}
+
+// Tells native to stop.
+function stop() {
+    exec(null, null, "Accelerometer", "stop", []);
+    running = false;
+}
+
+// Adds a callback pair to the listeners array
+function createCallbackPair(win, fail) {
+    return {win:win, fail:fail};
+}
+
+// Removes a win/fail listener pair from the listeners array
+function removeListeners(l) {
+    var idx = listeners.indexOf(l);
+    if (idx > -1) {
+        listeners.splice(idx, 1);
+        if (listeners.length === 0) {
+            stop();
+        }
+    }
+}
+
+var accelerometer = {
+    /**
+     * Asynchronously aquires the current acceleration.
+     *
+     * @param {Function} successCallback    The function to call when the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     */
+    getCurrentAcceleration: function(successCallback, errorCallback, options) {
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "getCurrentAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        var p;
+        var win = function(a) {
+            removeListeners(p);
+            successCallback(a);
+        };
+        var fail = function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        };
+
+        p = createCallbackPair(win, fail);
+        listeners.push(p);
+
+        if (!running) {
+            start();
+        }
+    },
+
+    /**
+     * Asynchronously aquires the acceleration repeatedly at a given interval.
+     *
+     * @param {Function} successCallback    The function to call each time the acceleration data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the acceleration data. (OPTIONAL)
+     * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchAcceleration: function(successCallback, errorCallback, options) {
+        // Default interval (10 sec)
+        var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000;
+
+        // successCallback required
+        if (typeof successCallback !== "function") {
+            throw "watchAcceleration must be called with at least a success callback function as first parameter.";
+        }
+
+        // Keep reference to watch id, and report accel readings as often as defined in frequency
+        var id = utils.createUUID();
+
+        var p = createCallbackPair(function(){}, function(e) {
+            removeListeners(p);
+            errorCallback(e);
+        });
+        listeners.push(p);
+
+        timers[id] = {
+            timer:window.setInterval(function() {
+                if (accel) {
+                    successCallback(accel);
+                }
+            }, frequency),
+            listeners:p
+        };
+
+        if (running) {
+            // If we're already running then immediately invoke the success callback
+            // but only if we have retreived a value, sample code does not check for null ...
+            if(accel) {
+                successCallback(accel);
+            }
+        } else {
+            start();
+        }
+
+        return id;
+    },
+
+    /**
+     * Clears the specified accelerometer watch.
+     *
+     * @param {String} id       The id of the watch returned from #watchAcceleration.
+     */
+    clearWatch: function(id) {
+        // Stop javascript timer & remove from timer list
+        if (id && timers[id]) {
+            window.clearInterval(timers[id].timer);
+            removeListeners(timers[id].listeners);
+            delete timers[id];
+        }
+    }
+};
+
+module.exports = accelerometer;
+
+});
+
+// file: lib/common/plugin/battery.js
+define("cordova/plugin/battery", function(require, exports, module) {
+/**
+ * This class contains information about the current battery status.
+ * @constructor
+ */
+var cordova = require('cordova'),
+    exec = require('cordova/exec');
+
+function handlers() {
+  return battery.channels.batterystatus.numHandlers +
+         battery.channels.batterylow.numHandlers +
+         battery.channels.batterycritical.numHandlers;
+}
+
+var Battery = function() {
+    this._level = null;
+    this._isPlugged = null;
+    // Create new event handlers on the window (returns a channel instance)
+    var subscriptionEvents = {
+      onSubscribe:this.onSubscribe,
+      onUnsubscribe:this.onUnsubscribe
+    };
+    this.channels = {
+      batterystatus:cordova.addWindowEventHandler("batterystatus", subscriptionEvents),
+      batterylow:cordova.addWindowEventHandler("batterylow", subscriptionEvents),
+      batterycritical:cordova.addWindowEventHandler("batterycritical", subscriptionEvents)
+    };
+};
+/**
+ * Event handlers for when callbacks get registered for the battery.
+ * Keep track of how many handlers we have so we can start and stop the native battery listener
+ * appropriately (and hopefully save on battery life!).
+ */
+Battery.prototype.onSubscribe = function() {
+  var me = battery;
+  // If we just registered the first handler, make sure native listener is started.
+  if (handlers() === 1) {
+    exec(me._status, me._error, "Battery", "start", []);
+  }
+};
+
+Battery.prototype.onUnsubscribe = function() {
+  var me = battery;
+
+  // If we just unregistered the last handler, make sure native listener is stopped.
+  if (handlers() === 0) {
+      exec(null, null, "Battery", "stop", []);
+  }
+};
+
+/**
+ * Callback for battery status
+ *
+ * @param {Object} info            keys: level, isPlugged
+ */
+Battery.prototype._status = function(info) {
+    if (info) {
+        var me = battery;
+    var level = info.level;
+        if (me._level !== level || me._isPlugged !== info.isPlugged) {
+            // Fire batterystatus event
+            cordova.fireWindowEvent("batterystatus", info);
+
+            // Fire low battery event
+            if (level === 20 || level === 5) {
+                if (level === 20) {
+                    cordova.fireWindowEvent("batterylow", info);
+                }
+                else {
+                    cordova.fireWindowEvent("batterycritical", info);
+                }
+            }
+        }
+        me._level = level;
+        me._isPlugged = info.isPlugged;
+    }
+};
+
+/**
+ * Error callback for battery start
+ */
+Battery.prototype._error = function(e) {
+    console.log("Error initializing Battery: " + e);
+};
+
+var battery = new Battery();
+
+module.exports = battery;
+});
+
+// file: lib/common/plugin/capture.js
+define("cordova/plugin/capture", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    MediaFile = require('cordova/plugin/MediaFile');
+
+/**
+ * Launches a capture of different types.
+ *
+ * @param (DOMString} type
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+function _capture(type, successCallback, errorCallback, options) {
+    var win = function(pluginResult) {
+        var mediaFiles = [];
+        var i;
+        for (i = 0; i < pluginResult.length; i++) {
+            var mediaFile = new MediaFile();
+            mediaFile.name = pluginResult[i].name;
+            mediaFile.fullPath = pluginResult[i].fullPath;
+            mediaFile.type = pluginResult[i].type;
+            mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate;
+            mediaFile.size = pluginResult[i].size;
+            mediaFiles.push(mediaFile);
+        }
+        successCallback(mediaFiles);
+    };
+    exec(win, errorCallback, "Capture", type, [options]);
+}
+/**
+ * The Capture interface exposes an interface to the camera and microphone of the hosting device.
+ */
+function Capture() {
+    this.supportedAudioModes = [];
+    this.supportedImageModes = [];
+    this.supportedVideoModes = [];
+}
+
+/**
+ * Launch audio recorder application for recording audio clip(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureAudioOptions} options
+ */
+Capture.prototype.captureAudio = function(successCallback, errorCallback, options){
+    _capture("captureAudio", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch camera application for taking image(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureImageOptions} options
+ */
+Capture.prototype.captureImage = function(successCallback, errorCallback, options){
+    _capture("captureImage", successCallback, errorCallback, options);
+};
+
+/**
+ * Launch device camera application for recording video(s).
+ *
+ * @param {Function} successCB
+ * @param {Function} errorCB
+ * @param {CaptureVideoOptions} options
+ */
+Capture.prototype.captureVideo = function(successCallback, errorCallback, options){
+    _capture("captureVideo", successCallback, errorCallback, options);
+};
+
+
+module.exports = new Capture();
+
+});
+
+// file: lib/common/plugin/compass.js
+define("cordova/plugin/compass", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    utils = require('cordova/utils'),
+    CompassHeading = require('cordova/plugin/CompassHeading'),
+    CompassError = require('cordova/plugin/CompassError'),
+    timers = {},
+    compass = {
+        /**
+         * Asynchronously acquires the current heading.
+         * @param {Function} successCallback The function to call when the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {CompassOptions} options The options for getting the heading data (not used).
+         */
+        getCurrentHeading:function(successCallback, errorCallback, options) {
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var win = function(result) {
+                var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp);
+                successCallback(ch);
+            };
+            var fail = function(code) {
+                var ce = new CompassError(code);
+                errorCallback(ce);
+            };
+
+            // Get heading
+            exec(win, fail, "Compass", "getHeading", [options]);
+        },
+
+        /**
+         * Asynchronously acquires the heading repeatedly at a given interval.
+         * @param {Function} successCallback The function to call each time the heading
+         * data is available
+         * @param {Function} errorCallback The function to call when there is an error
+         * getting the heading data.
+         * @param {HeadingOptions} options The options for getting the heading data
+         * such as timeout and the frequency of the watch. For iOS, filter parameter
+         * specifies to watch via a distance filter rather than time.
+         */
+        watchHeading:function(successCallback, errorCallback, options) {
+            // Default interval (100 msec)
+            var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100;
+            var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0;
+
+            // successCallback required
+            if (typeof successCallback !== "function") {
+              console.log("Compass Error: successCallback is not a function");
+              return;
+            }
+
+            // errorCallback optional
+            if (errorCallback && (typeof errorCallback !== "function")) {
+              console.log("Compass Error: errorCallback is not a function");
+              return;
+            }
+
+            var id = utils.createUUID();
+            if (filter > 0) {
+                // is an iOS request for watch by filter, no timer needed
+                timers[id] = "iOS";
+                compass.getCurrentHeading(successCallback, errorCallback, options);
+            } else {
+                // Start watch timer to get headings
+                timers[id] = window.setInterval(function() {
+                    compass.getCurrentHeading(successCallback, errorCallback);
+                }, frequency);
+            }
+
+            return id;
+        },
+
+        /**
+         * Clears the specified heading watch.
+         * @param {String} watchId The ID of the watch returned from #watchHeading.
+         */
+        clearWatch:function(id) {
+            // Stop javascript timer & remove from timer list
+            if (id && timers[id]) {
+                if (timers[id] != "iOS") {
+                      clearInterval(timers[id]);
+                  } else {
+                    // is iOS watch by filter so call into device to stop
+                    exec(null, null, "Compass", "stopHeading", []);
+                }
+                delete timers[id];
+            }
+        }
+    };
+
+module.exports = compass;
+});
+
+// file: lib/common/plugin/console-via-logger.js
+define("cordova/plugin/console-via-logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+
+var logger = require("cordova/plugin/logger");
+var utils  = require("cordova/utils");
+
+//------------------------------------------------------------------------------
+// object that we're exporting
+//------------------------------------------------------------------------------
+var console = module.exports;
+
+//------------------------------------------------------------------------------
+// copy of the original console object
+//------------------------------------------------------------------------------
+var WinConsole = window.console;
+
+//------------------------------------------------------------------------------
+// whether to use the logger
+//------------------------------------------------------------------------------
+var UseLogger = false;
+
+//------------------------------------------------------------------------------
+// Timers
+//------------------------------------------------------------------------------
+var Timers = {};
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+function noop() {}
+
+//------------------------------------------------------------------------------
+// used for unimplemented methods
+//------------------------------------------------------------------------------
+console.useLogger = function (value) {
+    if (arguments.length) UseLogger = !!value;
+
+    if (UseLogger) {
+        if (logger.useConsole()) {
+            throw new Error("console and logger are too intertwingly");
+        }
+    }
+
+    return UseLogger;
+};
+
+//------------------------------------------------------------------------------
+console.log = function() {
+    if (logger.useConsole()) return;
+    logger.log.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.error = function() {
+    if (logger.useConsole()) return;
+    logger.error.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.warn = function() {
+    if (logger.useConsole()) return;
+    logger.warn.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.info = function() {
+    if (logger.useConsole()) return;
+    logger.info.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.debug = function() {
+    if (logger.useConsole()) return;
+    logger.debug.apply(logger, [].slice.call(arguments));
+};
+
+//------------------------------------------------------------------------------
+console.assert = function(expression) {
+    if (expression) return;
+
+    var message = utils.vformat(arguments[1], [].slice.call(arguments, 2));
+    console.log("ASSERT: " + message);
+};
+
+//------------------------------------------------------------------------------
+console.clear = function() {};
+
+//------------------------------------------------------------------------------
+console.dir = function(object) {
+    console.log("%o", object);
+};
+
+//------------------------------------------------------------------------------
+console.dirxml = function(node) {
+    console.log(node.innerHTML);
+};
+
+//------------------------------------------------------------------------------
+console.trace = noop;
+
+//------------------------------------------------------------------------------
+console.group = console.log;
+
+//------------------------------------------------------------------------------
+console.groupCollapsed = console.log;
+
+//------------------------------------------------------------------------------
+console.groupEnd = noop;
+
+//------------------------------------------------------------------------------
+console.time = function(name) {
+    Timers[name] = new Date().valueOf();
+};
+
+//------------------------------------------------------------------------------
+console.timeEnd = function(name) {
+    var timeStart = Timers[name];
+    if (!timeStart) {
+        console.warn("unknown timer: " + name);
+        return;
+    }
+
+    var timeElapsed = new Date().valueOf() - timeStart;
+    console.log(name + ": " + timeElapsed + "ms");
+};
+
+//------------------------------------------------------------------------------
+console.timeStamp = noop;
+
+//------------------------------------------------------------------------------
+console.profile = noop;
+
+//------------------------------------------------------------------------------
+console.profileEnd = noop;
+
+//------------------------------------------------------------------------------
+console.count = noop;
+
+//------------------------------------------------------------------------------
+console.exception = console.log;
+
+//------------------------------------------------------------------------------
+console.table = function(data, columns) {
+    console.log("%o", data);
+};
+
+//------------------------------------------------------------------------------
+// return a new function that calls both functions passed as args
+//------------------------------------------------------------------------------
+function wrapperedOrigCall(orgFunc, newFunc) {
+    return function() {
+        var args = [].slice.call(arguments);
+        try { orgFunc.apply(WinConsole, args); } catch (e) {}
+        try { newFunc.apply(console,    args); } catch (e) {}
+    };
+}
+
+//------------------------------------------------------------------------------
+// For every function that exists in the original console object, that
+// also exists in the new console object, wrap the new console method
+// with one that calls both
+//------------------------------------------------------------------------------
+for (var key in console) {
+    if (typeof WinConsole[key] == "function") {
+        console[key] = wrapperedOrigCall(WinConsole[key], console[key]);
+    }
+}
+
+});
+
+// file: lib/common/plugin/contacts.js
+define("cordova/plugin/contacts", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+* Represents a group of Contacts.
+* @constructor
+*/
+var contacts = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     * @param fields that should be searched
+     * @param successCB success callback
+     * @param errorCB error callback
+     * @param {ContactFindOptions} options that can be applied to contact searching
+     * @return array of Contacts matching search criteria
+     */
+    find:function(fields, successCB, errorCB, options) {
+        if (!successCB) {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+        if (!fields || (utils.isArray(fields) && fields.length === 0)) {
+            if (typeof errorCB === "function") {
+                errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+        } else {
+            var win = function(result) {
+                var cs = [];
+                for (var i = 0, l = result.length; i < l; i++) {
+                    cs.push(contacts.create(result[i]));
+                }
+                successCB(cs);
+            };
+            exec(win, errorCB, "Contacts", "search", [fields, options]);
+        }
+    },
+
+    /**
+     * This function creates a new contact, but it does not persist the contact
+     * to device storage. To persist the contact to device storage, invoke
+     * contact.save().
+     * @param properties an object who's properties will be examined to create a new Contact
+     * @returns new Contact object
+     */
+    create:function(properties) {
+        var i;
+        var contact = new Contact();
+        for (i in properties) {
+            if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) {
+                contact[i] = properties[i];
+            }
+        }
+        return contact;
+    }
+};
+
+module.exports = contacts;
+
+});
+
+// file: lib/common/plugin/device.js
+define("cordova/plugin/device", function(require, exports, module) {
+var channel = require('cordova/channel'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+/**
+ * This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
+ * phone, etc.
+ * @constructor
+ */
+function Device() {
+    this.available = false;
+    this.platform = null;
+    this.version = null;
+    this.name = null;
+    this.uuid = null;
+    this.cordova = null;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function(info) {
+            me.available = true;
+            me.platform = info.platform;
+            me.version = info.version;
+            me.name = info.name;
+            me.uuid = info.uuid;
+            me.cordova = info.cordova;
+            channel.onCordovaInfoReady.fire();
+        },function(e) {
+            me.available = false;
+            utils.alert("[ERROR] Error initializing Cordova: " + e);
+        });
+    });
+}
+
+/**
+ * Get device info
+ *
+ * @param {Function} successCallback The function to call when the heading data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL)
+ */
+Device.prototype.getInfo = function(successCallback, errorCallback) {
+
+    // successCallback required
+    if (typeof successCallback !== "function") {
+        console.log("Device Error: successCallback is not a function");
+        return;
+    }
+
+    // errorCallback optional
+    if (errorCallback && (typeof errorCallback !== "function")) {
+        console.log("Device Error: errorCallback is not a function");
+        return;
+    }
+
+    // Get info
+    exec(successCallback, errorCallback, "Device", "getDeviceInfo", []);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/common/plugin/geolocation.js
+define("cordova/plugin/geolocation", function(require, exports, module) {
+var utils = require('cordova/utils'),
+    exec = require('cordova/exec'),
+    PositionError = require('cordova/plugin/PositionError'),
+    Position = require('cordova/plugin/Position');
+
+var timers = {};   // list of timers in use
+
+// Returns default params, overrides if provided with values
+function parseParameters(options) {
+    var opt = {
+        maximumAge: 0,
+        enableHighAccuracy: false,
+        timeout: Infinity
+    };
+
+    if (options) {
+        if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) {
+            opt.maximumAge = options.maximumAge;
+        }
+        if (options.enableHighAccuracy !== undefined) {
+            opt.enableHighAccuracy = options.enableHighAccuracy;
+        }
+        if (options.timeout !== undefined && !isNaN(options.timeout)) {
+            if (options.timeout < 0) {
+                opt.timeout = 0;
+            } else {
+                opt.timeout = options.timeout;
+            }
+        }
+    }
+
+    return opt;
+}
+
+// Returns a timeout failure, closed over a specified timeout value and error callback.
+function createTimeout(errorCallback, timeout) {
+    var t = setTimeout(function() {
+        clearTimeout(t);
+        t = null;
+        errorCallback({
+            code:PositionError.TIMEOUT,
+            message:"Position retrieval timed out."
+        });
+    }, timeout);
+    return t;
+}
+
+var geolocation = {
+    lastPosition:null, // reference to last known (cached) position returned
+    /**
+   * Asynchronously aquires the current position.
+   *
+   * @param {Function} successCallback    The function to call when the position data is available
+   * @param {Function} errorCallback      The function to call when there is an error getting the heading position. (OPTIONAL)
+   * @param {PositionOptions} options     The options for getting the position data. (OPTIONAL)
+   */
+    getCurrentPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("getCurrentPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        // Timer var that will fire an error callback if no position is retrieved from native
+        // before the "timeout" param provided expires
+        var timeoutTimer = null;
+
+        var win = function(p) {
+            clearTimeout(timeoutTimer);
+            if (!timeoutTimer) {
+                // Timeout already happened, or native fired error callback for
+                // this geo request.
+                // Don't continue with success callback.
+                return;
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+        var fail = function(e) {
+            clearTimeout(timeoutTimer);
+            timeoutTimer = null;
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just
+        // fire the success callback with the cached position.
+        if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) {
+            successCallback(geolocation.lastPosition);
+        // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object.
+        } else if (options.timeout === 0) {
+            fail({
+                code:PositionError.TIMEOUT,
+                message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter."
+            });
+        // Otherwise we have to call into native to retrieve a position.
+        } else {
+            if (options.timeout !== Infinity) {
+                // If the timeout value was not set to Infinity (default), then
+                // set up a timeout function that will fire the error callback
+                // if no successful position was retrieved before timeout expired.
+                timeoutTimer = createTimeout(fail, options.timeout);
+            } else {
+                // This is here so the check in the win function doesn't mess stuff up
+                // may seem weird but this guarantees timeoutTimer is
+                // always truthy before we call into native
+                timeoutTimer = true;
+            }
+            exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]);
+        }
+        return timeoutTimer;
+    },
+    /**
+     * Asynchronously watches the geolocation for changes to geolocation.  When a change occurs,
+     * the successCallback is called with the new location.
+     *
+     * @param {Function} successCallback    The function to call each time the location data is available
+     * @param {Function} errorCallback      The function to call when there is an error getting the location data. (OPTIONAL)
+     * @param {PositionOptions} options     The options for getting the location data such as frequency. (OPTIONAL)
+     * @return String                       The watch id that must be passed to #clearWatch to stop watching.
+     */
+    watchPosition:function(successCallback, errorCallback, options) {
+        if (arguments.length === 0) {
+            throw new Error("watchPosition must be called with at least one argument.");
+        }
+        options = parseParameters(options);
+
+        var id = utils.createUUID();
+
+        // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition
+        timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options);
+
+        var fail = function(e) {
+            clearTimeout(timers[id]);
+            var err = new PositionError(e.code, e.message);
+            if (errorCallback) {
+                errorCallback(err);
+            }
+        };
+
+        var win = function(p) {
+            clearTimeout(timers[id]);
+            if (options.timeout !== Infinity) {
+                timers[id] = createTimeout(fail, options.timeout);
+            }
+            var pos = new Position(
+                {
+                    latitude:p.latitude,
+                    longitude:p.longitude,
+                    altitude:p.altitude,
+                    accuracy:p.accuracy,
+                    heading:p.heading,
+                    velocity:p.velocity,
+                    altitudeAccuracy:p.altitudeAccuracy
+                },
+                (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp)))
+            );
+            geolocation.lastPosition = pos;
+            successCallback(pos);
+        };
+
+        exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]);
+
+        return id;
+    },
+    /**
+     * Clears the specified heading watch.
+     *
+     * @param {String} id       The ID of the watch returned from #watchPosition
+     */
+    clearWatch:function(id) {
+        if (id && timers[id] !== undefined) {
+            clearTimeout(timers[id]);
+            delete timers[id];
+            exec(null, null, "Geolocation", "clearWatch", [id]);
+        }
+    }
+};
+
+module.exports = geolocation;
+
+});
+
+// file: lib/common/plugin/logger.js
+define("cordova/plugin/logger", function(require, exports, module) {
+//------------------------------------------------------------------------------
+// The logger module exports the following properties/functions:
+//
+// LOG                          - constant for the level LOG
+// ERROR                        - constant for the level ERROR
+// WARN                         - constant for the level WARN
+// INFO                         - constant for the level INFO
+// DEBUG                        - constant for the level DEBUG
+// logLevel()                   - returns current log level
+// logLevel(value)              - sets and returns a new log level
+// useConsole()                 - returns whether logger is using console
+// useConsole(value)            - sets and returns whether logger is using console
+// log(message,...)             - logs a message at level LOG
+// error(message,...)           - logs a message at level ERROR
+// warn(message,...)            - logs a message at level WARN
+// info(message,...)            - logs a message at level INFO
+// debug(message,...)           - logs a message at level DEBUG
+// logLevel(level,message,...)  - logs a message specified level
+//
+//------------------------------------------------------------------------------
+
+var logger = exports;
+
+var exec    = require('cordova/exec');
+var utils   = require('cordova/utils');
+
+var UseConsole   = true;
+var Queued       = [];
+var DeviceReady  = false;
+var CurrentLevel;
+
+/**
+ * Logging levels
+ */
+
+var Levels = [
+    "LOG",
+    "ERROR",
+    "WARN",
+    "INFO",
+    "DEBUG"
+];
+
+/*
+ * add the logging levels to the logger object and
+ * to a separate levelsMap object for testing
+ */
+
+var LevelsMap = {};
+for (var i=0; i<Levels.length; i++) {
+    var level = Levels[i];
+    LevelsMap[level] = i;
+    logger[level]    = level;
+}
+
+CurrentLevel = LevelsMap.WARN;
+
+/**
+ * Getter/Setter for the logging level
+ *
+ * Returns the current logging level.
+ *
+ * When a value is passed, sets the logging level to that value.
+ * The values should be one of the following constants:
+ *    logger.LOG
+ *    logger.ERROR
+ *    logger.WARN
+ *    logger.INFO
+ *    logger.DEBUG
+ *
+ * The value used determines which messages get printed.  The logging
+ * values above are in order, and only messages logged at the logging
+ * level or above will actually be displayed to the user.  Eg, the
+ * default level is WARN, so only messages logged with LOG, ERROR, or
+ * WARN will be displayed; INFO and DEBUG messages will be ignored.
+ */
+logger.level = function (value) {
+    if (arguments.length) {
+        if (LevelsMap[value] === null) {
+            throw new Error("invalid logging level: " + value);
+        }
+        CurrentLevel = LevelsMap[value];
+    }
+
+    return Levels[CurrentLevel];
+};
+
+/**
+ * Getter/Setter for the useConsole functionality
+ *
+ * When useConsole is true, the logger will log via the
+ * browser 'console' object.  Otherwise, it will use the
+ * native Logger plugin.
+ */
+logger.useConsole = function (value) {
+    if (arguments.length) UseConsole = !!value;
+
+    if (UseConsole) {
+        if (typeof console == "undefined") {
+            throw new Error("global console object is not defined");
+        }
+
+        if (typeof console.log != "function") {
+            throw new Error("global console object does not have a log function");
+        }
+
+        if (typeof console.useLogger == "function") {
+            if (console.useLogger()) {
+                throw new Error("console and logger are too intertwingly");
+            }
+        }
+    }
+
+    return UseConsole;
+};
+
+/**
+ * Logs a message at the LOG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.log   = function(message) { logWithArgs("LOG",   arguments); };
+
+/**
+ * Logs a message at the ERROR level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.error = function(message) { logWithArgs("ERROR", arguments); };
+
+/**
+ * Logs a message at the WARN level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.warn  = function(message) { logWithArgs("WARN",  arguments); };
+
+/**
+ * Logs a message at the INFO level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.info  = function(message) { logWithArgs("INFO",  arguments); };
+
+/**
+ * Logs a message at the DEBUG level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.debug = function(message) { logWithArgs("DEBUG", arguments); };
+
+// log at the specified level with args
+function logWithArgs(level, args) {
+    args = [level].concat([].slice.call(args));
+    logger.logLevel.apply(logger, args);
+}
+
+/**
+ * Logs a message at the specified level.
+ *
+ * Parameters passed after message are used applied to
+ * the message with utils.format()
+ */
+logger.logLevel = function(level, message /* , ... */) {
+    // format the message with the parameters
+    var formatArgs = [].slice.call(arguments, 2);
+    message    = utils.vformat(message, formatArgs);
+
+    if (LevelsMap[level] === null) {
+        throw new Error("invalid logging level: " + level);
+    }
+
+    if (LevelsMap[level] > CurrentLevel) return;
+
+    // queue the message if not yet at deviceready
+    if (!DeviceReady && !UseConsole) {
+        Queued.push([level, message]);
+        return;
+    }
+
+    // if not using the console, use the native logger
+    if (!UseConsole) {
+        exec(null, null, "Logger", "logLevel", [level, message]);
+        return;
+    }
+
+    // make sure console is not using logger
+    if (console.__usingCordovaLogger) {
+        throw new Error("console and logger are too intertwingly");
+    }
+
+    // log to the console
+    switch (level) {
+        case logger.LOG:   console.log(message); break;
+        case logger.ERROR: console.log("ERROR: " + message); break;
+        case logger.WARN:  console.log("WARN: "  + message); break;
+        case logger.INFO:  console.log("INFO: "  + message); break;
+        case logger.DEBUG: console.log("DEBUG: " + message); break;
+    }
+};
+
+// when deviceready fires, log queued messages
+logger.__onDeviceReady = function() {
+    if (DeviceReady) return;
+
+    DeviceReady = true;
+
+    for (var i=0; i<Queued.length; i++) {
+        var messageArgs = Queued[i];
+        logger.logLevel(messageArgs[0], messageArgs[1]);
+    }
+
+    Queued = null;
+};
+
+// add a deviceready event to log queued messages
+document.addEventListener("deviceready", logger.__onDeviceReady, false);
+
+});
+
+// file: lib/common/plugin/network.js
+define("cordova/plugin/network", function(require, exports, module) {
+var exec = require('cordova/exec'),
+    cordova = require('cordova'),
+    channel = require('cordova/channel');
+
+var NetworkConnection = function () {
+    this.type = null;
+    this._firstRun = true;
+    this._timer = null;
+    this.timeout = 500;
+
+    var me = this;
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getInfo(function (info) {
+            me.type = info;
+            if (info === "none") {
+                // set a timer if still offline at the end of timer send the offline event
+                me._timer = setTimeout(function(){
+                    cordova.fireDocumentEvent("offline");
+                    me._timer = null;
+                    }, me.timeout);
+            } else {
+                // If there is a current offline event pending clear it
+                if (me._timer !== null) {
+                    clearTimeout(me._timer);
+                    me._timer = null;
+                }
+                cordova.fireDocumentEvent("online");
+            }
+
+            // should only fire this once
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+        },
+        function (e) {
+            // If we can't get the network info we should still tell Cordova
+            // to fire the deviceready event.
+            if (me._firstRun) {
+                me._firstRun = false;
+                channel.onCordovaConnectionReady.fire();
+            }
+            console.log("Error initializing Network Connection: " + e);
+        });
+    });
+};
+
+/**
+ * Get connection info
+ *
+ * @param {Function} successCallback The function to call when the Connection data is available
+ * @param {Function} errorCallback The function to call when there is an error getting the Connection data. (OPTIONAL)
+ */
+NetworkConnection.prototype.getInfo = function (successCallback, errorCallback) {
+    // Get info
+    exec(successCallback, errorCallback, "NetworkStatus", "getConnectionInfo", []);
+};
+
+module.exports = new NetworkConnection();
+});
+
+// file: lib/common/plugin/notification.js
+define("cordova/plugin/notification", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+/**
+ * Provides access to notifications on the device.
+ */
+
+module.exports = {
+
+    /**
+     * Open a native alert dialog, with a customizable title and button text.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} completeCallback   The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Alert)
+     * @param {String} buttonLabel          Label of the close button (default: OK)
+     */
+    alert: function(message, completeCallback, title, buttonLabel) {
+        var _title = (title || "Alert");
+        var _buttonLabel = (buttonLabel || "OK");
+        exec(completeCallback, null, "Notification", "alert", [message, _title, _buttonLabel]);
+    },
+
+    /**
+     * Open a native confirm dialog, with a customizable title and button text.
+     * The result that the user selects is returned to the result callback.
+     *
+     * @param {String} message              Message to print in the body of the alert
+     * @param {Function} resultCallback     The callback that is called when user clicks on a button.
+     * @param {String} title                Title of the alert dialog (default: Confirm)
+     * @param {String} buttonLabels         Comma separated list of the labels of the buttons (default: 'OK,Cancel')
+     */
+    confirm: function(message, resultCallback, title, buttonLabels) {
+        var _title = (title || "Confirm");
+        var _buttonLabels = (buttonLabels || "OK,Cancel");
+        exec(resultCallback, null, "Notification", "confirm", [message, _title, _buttonLabels]);
+    },
+
+    /**
+     * Causes the device to vibrate.
+     *
+     * @param {Integer} mills       The number of milliseconds to vibrate for.
+     */
+    vibrate: function(mills) {
+        exec(null, null, "Notification", "vibrate", [mills]);
+    },
+
+    /**
+     * Causes the device to beep.
+     * On Android, the default notification ringtone is played "count" times.
+     *
+     * @param {Integer} count       The number of beeps.
+     */
+    beep: function(count) {
+        exec(null, null, "Notification", "beep", [count]);
+    }
+};
+});
+
+// file: lib/common/plugin/requestFileSystem.js
+define("cordova/plugin/requestFileSystem", function(require, exports, module) {
+var FileError = require('cordova/plugin/FileError'),
+    FileSystem = require('cordova/plugin/FileSystem'),
+    exec = require('cordova/exec');
+
+/**
+ * Request a file system in which to store application data.
+ * @param type  local file system type
+ * @param size  indicates how much storage space, in bytes, the application expects to need
+ * @param successCallback  invoked with a FileSystem object
+ * @param errorCallback  invoked if error occurs retrieving file system
+ */
+var requestFileSystem = function(type, size, successCallback, errorCallback) {
+    var fail = function(code) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(code));
+        }
+    };
+
+    if (type < 0 || type > 3) {
+        fail(FileError.SYNTAX_ERR);
+    } else {
+        // if successful, return a FileSystem object
+        var success = function(file_system) {
+            if (file_system) {
+                if (typeof successCallback === 'function') {
+                    // grab the name and root from the file system object
+                    var result = new FileSystem(file_system.name, file_system.root);
+                    successCallback(result);
+                }
+            }
+            else {
+                // no FileSystem object returned
+                fail(FileError.NOT_FOUND_ERR);
+            }
+        };
+        exec(success, fail, "File", "requestFileSystem", [type, size]);
+    }
+};
+
+module.exports = requestFileSystem;
+});
+
+// file: lib/common/plugin/resolveLocalFileSystemURI.js
+define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) {
+var DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    FileError = require('cordova/plugin/FileError'),
+    exec = require('cordova/exec');
+
+/**
+ * Look up file system Entry referred to by local URI.
+ * @param {DOMString} uri  URI referring to a local file or directory
+ * @param successCallback  invoked with Entry object corresponding to URI
+ * @param errorCallback    invoked if error occurs retrieving file system entry
+ */
+module.exports = function(uri, successCallback, errorCallback) {
+    // error callback
+    var fail = function(error) {
+        if (typeof errorCallback === 'function') {
+            errorCallback(new FileError(error));
+        }
+    };
+    // sanity check for 'not:valid:filename'
+    if(!uri || uri.split(":").length > 2) {
+        setTimeout( function() {
+            fail(FileError.ENCODING_ERR);
+        },0);
+        return;
+    }
+    // if successful, return either a file or directory entry
+    var success = function(entry) {
+        var result;
+        if (entry) {
+            if (typeof successCallback === 'function') {
+                // create appropriate Entry object
+                result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath);
+                try {
+                    successCallback(result);
+                }
+                catch (e) {
+                    console.log('Error invoking callback: ' + e);
+                }
+            }
+        }
+        else {
+            // no Entry object returned
+            fail(FileError.NOT_FOUND_ERR);
+        }
+    };
+
+    exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]);
+};
+
+});
+
+// file: lib/common/plugin/splashscreen.js
+define("cordova/plugin/splashscreen", function(require, exports, module) {
+var exec = require('cordova/exec');
+
+var splashscreen = {
+    show:function() {
+        exec(null, null, "SplashScreen", "show", []);
+    },
+    hide:function() {
+        exec(null, null, "SplashScreen", "hide", []);
+    }
+};
+
+module.exports = splashscreen;
+});
+
+// file: lib/tizen/plugin/tizen/Accelerometer.js
+define("cordova/plugin/tizen/Accelerometer", function(require, exports, module) {
+var callback = null;
+
+module.exports = {
+    start: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+        callback = function (motion) {
+            successCallback({
+                x: motion.accelerationIncludingGravity.x,
+                y: motion.accelerationIncludingGravity.y,
+                z: motion.accelerationIncludingGravity.z,
+                timestamp: motion.timeStamp
+            });
+        };
+        window.addEventListener("devicemotion", callback);
+    },
+    stop: function (successCallback, errorCallback) {
+        window.removeEventListener("devicemotion", callback);
+    }
+};
+});
+
+// file: lib/tizen/plugin/tizen/Battery.js
+define("cordova/plugin/tizen/Battery", function(require, exports, module) {
+/*global tizen:false */
+var id = null;
+
+module.exports = {
+    start: function(successCallback, errorCallback) {
+        var tizenSuccessCallback = function(power) {
+            if (successCallback) {
+                successCallback({level: Math.round(power.level * 100), isPlugged: power.isCharging});
+            }
+        };
+
+        if (id === null) {
+            id = tizen.systeminfo.addPropertyValueChangeListener("Power", tizenSuccessCallback);
+        }
+        tizen.systeminfo.getPropertyValue("Power", tizenSuccessCallback, errorCallback);
+    },
+
+    stop: function(successCallback, errorCallback) {
+        tizen.systeminfo.removePropertyValueChangeListener(id);
+        id = null;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Camera.js
+define("cordova/plugin/tizen/Camera", function(require, exports, module) {
+/*global tizen:false */
+var Camera = require('cordova/plugin/CameraConstants');
+
+function makeReplyCallback(successCallback, errorCallback) {
+    return {
+        onsuccess: function(reply) {
+            if (reply.length > 0) {
+                successCallback(reply[0].value);
+            } else {
+                errorCallback('Picture selection aborted');
+            }
+        },
+        onfail: function() {
+           console.log('The service launch failed');
+        }
+    };
+}
+
+module.exports = {
+    takePicture: function(successCallback, errorCallback, args) {
+        var destinationType = args[1],
+            sourceType = args[2],
+            encodingType = args[5],
+            mediaType = args[6];
+            // Not supported
+            /*
+            quality = args[0]
+            targetWidth = args[3]
+            targetHeight = args[4]
+            allowEdit = args[7]
+            correctOrientation = args[8]
+            saveToPhotoAlbum = args[9]
+            */
+
+        if (destinationType !== Camera.DestinationType.FILE_URI) {
+            errorCallback('DestinationType not supported');
+            return;
+        }
+        if (mediaType !== Camera.MediaType.PICTURE) {
+            errorCallback('MediaType not supported');
+            return;
+        }
+
+        var mimeType;
+        if (encodingType === Camera.EncodingType.JPEG) {
+            mimeType = 'image/jpeg';
+        } else if (encodingType === Camera.EncodingType.PNG) {
+            mimeType = 'image/png';
+        } else {
+            mimeType = 'image/*';
+        }
+
+        var serviceId;
+        if (sourceType === Camera.PictureSourceType.CAMERA) {
+            serviceId = 'http://tizen.org/appsvc/operation/create_content';
+        } else {
+            serviceId = 'http://tizen.org/appsvc/operation/pick';
+        }
+
+        var service = new tizen.ApplicationService(serviceId, null, mimeType, null);
+        tizen.application.launchService(service, null, null,
+                function(error) { errorCallback(error.message); },
+                makeReplyCallback(successCallback, errorCallback));
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Compass.js
+define("cordova/plugin/tizen/Compass", function(require, exports, module) {
+var CompassError = require('cordova/plugin/CompassError'),
+    callback = null, ready = false;
+
+module.exports = {
+    getHeading: function(successCallback, errorCallback) {
+        if (window.DeviceOrientationEvent !== undefined) {
+            callback = function (orientation) {
+                var heading = 360 - orientation.alpha;
+                if (ready) {
+                    successCallback({
+                        magneticHeading: heading,
+                        trueHeading: heading,
+                        headingAccuracy: 0,
+                        timestamp: orientation.timeStamp
+                    });
+                    window.removeEventListener("deviceorientation", callback);
+                }
+                ready = true;
+            };
+            ready = false; // workaround invalid first event value returned by WRT
+            window.addEventListener("deviceorientation", callback);
+        }
+        else {
+            errorCallback(CompassError.COMPASS_NOT_SUPPORTED);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Contact.js
+define("cordova/plugin/tizen/Contact", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils'),
+    utils = require('cordova/utils'),
+    exec = require('cordova/exec');
+
+// ------------------
+// Utility functions
+// ------------------
+
+
+/**
+ * Retrieves a Tizen Contact object from the device by its unique id.
+ *
+ * @param uid
+ *            Unique id of the contact on the device
+ * @return {tizen.Contact} Tizen Contact object or null if contact with
+ *         specified id is not found
+ */
+var findByUniqueId = function(id) {
+
+    if (!id) {
+        return null;
+    }
+
+    var tizenContact = null;
+
+    tizen.contact.getDefaultAddressBook().find(
+        function _successCallback(contacts){
+            tizenContact = contacts[0];
+        },
+        function _errorCallback(error){
+            console.log("tizen find error " + error);
+        },
+        new tizen.AttributeFilter('id', 'CONTAINS', id),
+        new tizen.SortMode('id', 'ASC'));
+
+    return tizenContact || null;
+};
+
+
+var traceTizenContact = function (tizenContact) {
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.id " + tizenContact.id);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.lastUpdated " + tizenContact.lastUpdated);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.name " + tizenContact.name);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.account " + tizenContact.account);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.addresses " + tizenContact.addresses);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.photoURI " + tizenContact.photoURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.phoneNumbers " + tizenContact.phoneNumbers);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.emails " + tizenContact.emails);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.birthday " + tizenContact.birthday);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.organization " + tizenContact.organization);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.notes " + tizenContact.notes);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.urls " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.isFavorite " + tizenContact.isFavorite);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.ringtonesURI " + tizenContact.ringtonesURI);
+    console.log("cordova/plugin/tizen/Contact/  tizenContact.categories " + tizenContact.categories);
+};
+
+
+/**
+ * Creates a Tizen contact object from the W3C Contact object and persists
+ * it to device storage.
+ *
+ * @param {Contact}
+ *            contact The contact to save
+ * @return a new contact object with all properties set
+ */
+var saveToDevice = function(contact) {
+
+    if (!contact) {
+        return;
+    }
+
+    var tizenContact = null;
+    var update = false;
+    var i = 0;
+
+    // if the underlying Tizen Contact object already exists, retrieve it for
+    // update
+    if (contact.id) {
+        // we must attempt to retrieve the BlackBerry contact from the device
+        // because this may be an update operation
+        tizenContact = findByUniqueId(contact.id);
+    }
+
+    // contact not found on device, create a new one
+    if (!tizenContact) {
+        tizenContact = new tizen.Contact();
+    }
+    // update the existing contact
+    else {
+        update = true;
+    }
+
+    // NOTE: The user may be working with a partial Contact object, because only
+    // user-specified Contact fields are returned from a find operation (blame
+    // the W3C spec). If this is an update to an existing Contact, we don't
+    // want to clear an attribute from the contact database simply because the
+    // Contact object that the user passed in contains a null value for that
+    // attribute. So we only copy the non-null Contact attributes to the
+    // Tizen Contact object before saving.
+    //
+    // This means that a user must explicitly set a Contact attribute to a
+    // non-null value in order to update it in the contact database.
+    //
+    traceTizenContact (tizenContact);
+
+    // display name
+    if (contact.displayName !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            tizenContact.name.displayName = contact.displayName;
+        }
+    }
+
+    // name
+    if (contact.name !== null) {
+        if (contact.name.givenName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.firstName = contact.name.givenName;
+            }
+        }
+
+        if  (contact.name.middleName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.middleName = contact.name.middleName;
+            }
+        }
+
+        if (contact.name.familyName) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.lastName = contact.name.familyName;
+            }
+        }
+
+        if (contact.name.honorificPrefix) {
+            if (tizenContact.name === null) {
+                tizenContact.name = new tizen.ContactName();
+            }
+            if (tizenContact.name !== null) {
+                tizenContact.name.prefix = contact.name.honorificPrefix;
+            }
+        }
+    }
+
+    // nickname
+    if (contact.nickname !== null) {
+        if (tizenContact.name === null) {
+            tizenContact.name = new tizen.ContactName();
+        }
+        if (tizenContact.name !== null) {
+            if (!utils.isArray(tizenContact.name.nicknames))
+            {
+                tizenContact.name.nicknames = [];
+            }
+            tizenContact.name.nicknames[0] = contact.nickname;
+        }
+    }
+    else {
+        tizenContact.name.nicknames = [];
+    }
+
+    // note
+    if (contact.note !== null) {
+        if (tizenContact.note === null) {
+            tizenContact.note = [];
+        }
+        if (tizenContact.note !== null) {
+            tizenContact.note[0] = contact.note;
+        }
+    }
+
+    // photos
+    if (contact.photos && utils.isArray(contact.emails) && contact.emails.length > 0) {
+        tizenContact.photoURI = contact.photos[0];
+    }
+
+    if (utils.isDate(contact.birthday)) {
+        if (!utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday = new Date();
+        }
+        if (utils.isDate(tizenContact.birthday)) {
+            tizenContact.birthday.setDate(contact.birthday.getDate());
+        }
+    }
+
+    // Tizen supports many addresses
+    if (utils.isArray(contact.emails)) {
+
+        // if this is an update, re initialize email addresses
+        if (update) {
+            // doit on effacer sur un update??????
+        }
+
+        // copy the first three email addresses found
+        var emails = [];
+        for (i = 0; i < contact.emails.length; i += 1) {
+            var emailTypes = [];
+
+            emailTypes.push (contact.emails[i].type);
+
+            if (contact.emails[i].pref) {
+                emailTypes.push ("PREF");
+            }
+
+            emails.push(
+                new tizen.ContactEmailAddress(
+                    contact.emails[i].value,
+                    emailTypes)
+            );
+        }
+        tizenContact.emails = emails.length > 0 ? emails : [];
+    }
+    else {
+        tizenContact.emails = [];
+    }
+
+    // Tizen supports many phone numbers
+    // copy into appropriate fields based on type
+    if (utils.isArray(contact.phoneNumbers)) {
+        // if this is an update, re-initialize phone numbers
+        if (update) {
+        }
+
+        var phoneNumbers = [];
+
+        for (i = 0; i < contact.phoneNumbers.length; i += 1) {
+
+            if (!contact.phoneNumbers[i] || !contact.phoneNumbers[i].value) {
+                continue;
+            }
+
+             var phoneTypes = [];
+             phoneTypes.push (contact.phoneNumbers[i].type);
+
+             if (contact.phoneNumbers[i].pref) {
+                 phoneTypes.push ("PREF");
+             }
+
+            phoneNumbers.push(
+                new tizen.ContactPhoneNumber(
+                    contact.phoneNumbers[i].value,
+                    phoneTypes)
+            );
+        }
+
+        tizenContact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : [];
+    } else {
+        tizenContact.phoneNumbers = [];
+    }
+
+    if (utils.isArray(contact.addresses)) {
+        // if this is an update, re-initialize addresses
+        if (update) {
+        }
+
+        var addresses = [],
+            address = null;
+
+        for ( i = 0; i < contact.addresses.length; i += 1) {
+            address = contact.addresses[i];
+
+            if (!address || address.id === undefined || address.pref === undefined || address.type === undefined || address.formatted === undefined) {
+                continue;
+            }
+
+            var addressTypes = [];
+            addressTypes.push (address.type);
+
+            if (address.pref) {
+                addressTypes.push ("PREF");
+            }
+
+            addresses.push(
+                new tizen.ContactAddress({
+                         country:                   address.country,
+                         region :                   address.region,
+                         city:                      address.locality,
+                         streetAddress:             address.streetAddress,
+                         additionalInformation:     "",
+                         postalCode:                address.postalCode,
+                         types :                    addressTypes
+                }));
+
+        }
+        tizenContact.addresses = addresses.length > 0 ? addresses : [];
+
+    } else{
+        tizenContact.addresses = [];
+    }
+
+    // copy first url found to BlackBerry 'webpage' field
+    if (utils.isArray(contact.urls)) {
+        // if this is an update, re-initialize web page
+        if (update) {
+        }
+
+        var url = null,
+            urls = [];
+
+        for ( i = 0; i< contact.urls.length; i+= 1) {
+            url = contact.urls[i];
+
+            if (!url || !url.value) {
+                continue;
+            }
+
+            urls.push( new tizen.ContactWebSite(url.value, url.type));
+        }
+        tizenContact.urls = urls.length > 0 ? urls : [];
+    } else{
+        tizenContact.urls = [];
+    }
+
+    if (utils.isArray(contact.organizations && contact.organizations.length > 0) ) {
+        // if this is an update, re-initialize org attributes
+        var organization = contact.organizations[0];
+
+         tizenContact.organization = new tizen.ContacOrganization({
+             name:          organization.name,
+             department:    organization.department,
+             office:        "",
+             title:         organization.title,
+             role:          "",
+             logoURI:       ""
+         });
+    }
+
+    // categories
+    if (utils.isArray(contact.categories)) {
+        tizenContact.categories = [];
+
+        var category = null;
+
+        for (i = 0; i < contact.categories.length; i += 1) {
+            category = contact.categories[i];
+
+            if (typeof category === "string") {
+                tizenContact.categories.push(category);
+            }
+        }
+    }
+    else {
+        tizenContact.categories = [];
+    }
+
+    // save to device
+    // in tizen contact mean update or add
+    // later we might use addBatch and updateBatch
+    if (update){
+        tizen.contact.getDefaultAddressBook().update(tizenContact);
+    }
+    else {
+        tizen.contact.getDefaultAddressBook().add(tizenContact);
+    }
+
+    // Use the fully populated Tizen contact object to create a
+    // corresponding W3C contact object.
+    return ContactUtils.createContact(tizenContact, [ "*" ]);
+};
+
+
+/**
+ * Creates a Tizen ContactAddress object from a W3C ContactAddress.
+ *
+ * @return {tizen.ContactAddress} a Tizen ContactAddress object
+ */
+var createTizenAddress = function(address) {
+
+    var type = null,
+        pref = null,
+        typesAr = [];
+
+    if (address === null) {
+        return null;
+    }
+
+
+    var tizenAddress = new tizen.ContactAddress();
+
+    if (tizenAddress === null) {
+        return null;
+    }
+
+    typesAr.push(address.type);
+
+    if (address.pref) {
+        typesAr.push("PREF");
+    }
+
+    tizenAddress.country = address.country || "";
+    tizenAddress.region = address.region || "";
+    tizenAddress.city = address.locality || "";
+    tizenAddress.streetAddress = address.streetAddress || "";
+    tizenAddress.postalCode = address.postalCode || "";
+    tizenAddress.types = typesAr || "";
+
+    return tizenAddress;
+};
+
+module.exports = {
+    /**
+     * Persists contact to device storage.
+     */
+
+    save : function(successCB, failCB) {
+
+        try {
+            // save the contact and store it's unique id
+            var fullContact = saveToDevice(this);
+
+            this.id = fullContact.id;
+
+            // This contact object may only have a subset of properties
+            // if the save was an update of an existing contact. This is
+            // because the existing contact was likely retrieved using a
+            // subset of properties, so only those properties were set in the
+            // object. For this reason, invoke success with the contact object
+            // returned by saveToDevice since it is fully populated.
+
+            if (typeof successCB === 'function') {
+                successCB(fullContact);
+            }
+        }
+        catch (error) {
+            console.log('Error saving contact: ' +  error);
+
+            if (typeof failCB === 'function') {
+                failCB (new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    },
+
+    /**
+     * Removes contact from device storage.
+     *
+     * @param successCB
+     *            successCB callback
+     * @param failCB
+     *            error callback
+     */
+    remove : function (successCB, failCB) {
+
+        try {
+            // retrieve contact from device by id
+            var tizenContact = null;
+
+            if (this.id) {
+                tizenContact = findByUniqueId(this.id);
+            }
+
+
+            // if contact was found, remove it
+            if (tizenContact) {
+
+                tizen.contact.getDefaultAddressBook().remove(tizenContact.id);
+
+                if (typeof success === 'function') {
+                    successCB(this);
+                }
+            }
+            // attempting to remove a contact that hasn't been saved
+            else if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+        catch (error) {
+            console.log('Error removing contact ' + this.id + ": " + error);
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.UNKNOWN_ERROR));
+            }
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/ContactUtils.js
+define("cordova/plugin/tizen/ContactUtils", function(require, exports, module) {
+/*global tizen:false */
+var ContactAddress = require('cordova/plugin/ContactAddress'),
+    ContactName = require('cordova/plugin/ContactName'),
+    ContactField = require('cordova/plugin/ContactField'),
+    ContactOrganization = require('cordova/plugin/ContactOrganization'),
+    utils = require('cordova/utils'),
+    Contact = require('cordova/plugin/Contact');
+
+/**
+ * Mappings for each Contact field that may be used in a find operation. Maps
+ * W3C Contact fields to one or more fields in a Tizen contact object.
+ *
+ * Example: user searches with a filter on the Contact 'name' field:
+ *
+ * <code>Contacts.find(['name'], onSuccess, onFail, {filter:'Bob'});</code>
+ *
+ * The 'name' field does not exist in a Tizen contact. Instead, a filter
+ * expression will be built to search the Tizen contacts using the
+ * Tizen 'title', 'firstName' and 'lastName' fields.
+ */
+var fieldMappings = {
+    "id" : ["id"],
+    "displayName" : ["name.displayName"],
+    "nickname": ["name.nicknames"],
+    "name" : [ "name.prefix", "name.firstName", "name.lastName" ],
+    "phoneNumbers" : ["phoneNumbers.number","phoneNumbers.types"],
+    "emails" : ["emails.types", "emails.email"],
+    "addresses" : ["addresses.country","addresses.region","addresses.city","addresses.streetAddress","addresses.postalCode","addresses.country","addresses.types"],
+    "organizations" : ["organization.name","organization.department","organization.office", "organization.title"],
+    "birthday" : ["birthday"],
+    "note" : ["notes"],
+    "photos" : ["photoURI"],
+    "categories" : ["categories"],
+    "urls" : ["urls.url", "urls.type"]
+};
+
+/*
+ * Build an array of all of the valid W3C Contact fields. This is used to
+ * substitute all the fields when ["*"] is specified.
+ */
+var allFields = [];
+
+(function initializeAllFieldsMapping() {
+
+    for ( var key in fieldMappings) {
+        allFields.push(key);
+    }
+    // as we want it to be executed once
+    function initializeAllFieldsMapping() {
+    }
+
+})();
+
+/**
+ * Create a W3C ContactAddress object from a Tizen Address object
+ *
+ * @param {String}
+ *            type the type of address (e.g. work, home)
+ * @param {tizen.ContactAddress}
+ *            tizenAddress a Tizen Address object
+ * @return {ContactAddress} a contact address object or null if the specified
+ *         address is null
+ */
+var createContactAddress = function(type, tizenAddress) {
+    if (!tizenAddress) {
+        return null;
+    }
+
+    var streetAddress = tizenAddress.streetAddress;
+    var locality = tizenAddress.city || "";
+    var region = tizenAddress.region || "";
+    var postalCode = tizenAddress.postalCode || "";
+    var country = tizenAddress.country || "";
+    var formatted = streetAddress + ", " + locality + ", " + region + ", " + postalCode + ", " + country;
+
+    var contact = new ContactAddress(null, type, formatted, streetAddress, locality, region, postalCode, country);
+
+    return contact;
+};
+
+module.exports = {
+    /**
+     * Builds Tizen filter expressions for contact search using the
+     * contact fields and search filter provided.
+     *
+     * @param {String[]}
+     *            fields Array of Contact fields to search
+     * @param {String}
+     *            filter Filter, or search string
+     * @param {Boolean}
+     *                 multiple, one contacts or more wanted as result
+     * @return filter expression or null if fields is empty or filter is null or
+     *         empty
+     */
+
+    buildFilterExpression: function(fields, filter) {
+        // ensure filter exists
+        if (!filter || filter === "") {
+            return null;
+        }
+
+        if ((fields.length === 1) && (fields[0] === "*")) {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // build a filter expression using all Contact fields provided
+        var compositeFilter = null,
+            attributeFilter = null,
+            filterExpression = null,
+            matchFlag = "CONTAINS",
+            matchValue = filter,
+            attributesArray = [];
+
+        if (fields && utils.isArray(fields)) {
+
+            for ( var field in fields) {
+
+                if (!fields[field]) {
+                    continue;
+                }
+
+                // retrieve Tizen contact fields that map Cordova fields specified
+                // (tizenFields is a string or an array of strings)
+                var tizenFields = fieldMappings[fields[field]];
+
+                if (!tizenFields) {
+                    // does something maps
+                    continue;
+                }
+
+                // construct the filter expression using the Tizen fields
+                for ( var index in tizenFields) {
+                    attributeFilter = new tizen.AttributeFilter(tizenFields[index], matchFlag, matchValue);
+                    if (attributeFilter !== null) {
+                        attributesArray.push(attributeFilter);
+                    }
+                }
+            }
+        }
+
+        // fullfil tizen find attribute as a single or a composite attribute
+        if (attributesArray.length == 1 ) {
+            filterExpression = attributeFilter[0];
+        } else if (attributesArray.length > 1) {
+            // combine the filters as a Union
+            filterExpression = new tizen.CompositeFilter("UNION", attributesArray);
+        } else {
+            filterExpression = null;
+        }
+
+        return filterExpression;
+    },
+
+
+
+    /**
+     * Creates a Contact object from a Tizen Contact object, copying only
+     * the fields specified.
+     *
+     * This is intended as a privately used function but it is made globally
+     * available so that a Contact.save can convert a BlackBerry contact object
+     * into its W3C equivalent.
+     *
+     * @param {tizen.Contact}
+     *            tizenContact Tizen Contact object
+     * @param {String[]}
+     *            fields array of contact fields that should be copied
+     * @return {Contact} a contact object containing the specified fields or
+     *         null if the specified contact is null
+     */
+    createContact: function(tizenContact, fields) {
+
+        if (!tizenContact) {
+            return null;
+        }
+
+        // construct a new contact object
+        // always copy the contact id and displayName fields
+        var contact = new Contact(tizenContact.id, tizenContact.name.displayName);
+
+
+        // nothing to do
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            return contact;
+        } else if (fields.length === 1 && fields[0] === "*") {
+            // Cordova enhancement to allow fields value of ["*"] to indicate
+            // all supported fields.
+            fields = allFields;
+        }
+
+        // add the fields specified
+        for ( var key in fields) {
+
+            var field = fields[key],
+                index = 0;
+
+            if (!field) {
+                continue;
+            }
+
+            // name
+            if (field.indexOf('name') === 0) {
+
+                var formattedName = (tizenContact.name.prefix || "");
+
+                if (tizenContact.name.firstName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.firstName || "");
+                }
+
+                if (tizenContact.name.middleName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.middleName || "");
+                }
+
+                if (tizenContact.name.lastName) {
+                    formattedName += ' ';
+                    formattedName += (tizenContact.name.lastName || "");
+                }
+
+                contact.name = new ContactName(
+                        formattedName,
+                        tizenContact.name.lastName,
+                        tizenContact.name.firstName,
+                        tizenContact.name.middleName,
+                        tizenContact.name.prefix,
+                        null);
+            }
+
+            // phoneNumbers
+            else if (field.indexOf('phoneNumbers') === 0) {
+
+                var phoneNumbers = [];
+
+                for (index = 0 ; index < tizenContact.phoneNumbers.length ; ++index) {
+
+                    phoneNumbers.push(
+                            new ContactField(
+                                    'PHONE',
+                                    tizenContact.phoneNumbers[index].number,
+                                    ((tizenContact.phoneNumbers[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+
+
+                contact.phoneNumbers = phoneNumbers.length > 0 ? phoneNumbers : null;
+            }
+
+            // emails
+            else if (field.indexOf('emails') === 0) {
+
+                var emails = [];
+
+                for (index = 0 ; index < tizenContact.emails.length ; ++index) {
+
+                    emails.push(
+                        new ContactField(
+                            'EMAILS',
+                            tizenContact.emails[index].email,
+                            ((tizenContact.emails[index].types[1]) &&  (tizenContact.emails[index].types[1] === "PREF") ) ? true : false));
+                }
+                contact.emails = emails.length > 0 ? emails : null;
+            }
+
+            // addresses
+            else if (field.indexOf('addresses') === 0) {
+
+                var addresses = [];
+                for (index = 0 ; index < tizenContact.addresses.length ; ++index) {
+
+                    addresses.push(
+                            new ContactAddress(
+                                    ((tizenContact.addresses[index].types[1] &&  tizenContact.addresses[index].types[1] === "PREF") ? true : false),
+                                    tizenContact.addresses[index].types[0] ? tizenContact.addresses[index].types[0] : "HOME",
+                                    null,
+                                    tizenContact.addresses[index].streetAddress,
+                                    tizenContact.addresses[index].city,
+                                    tizenContact.addresses[index].region,
+                                    tizenContact.addresses[index].postalCode,
+                                    tizenContact.addresses[index].country ));
+                }
+
+                contact.addresses = addresses.length > 0 ? addresses : null;
+            }
+
+            // birthday
+            else if (field.indexOf('birthday') === 0) {
+                if (utils.isDate(tizenContact.birthday)) {
+                    contact.birthday = tizenContact.birthday;
+                }
+            }
+
+            // note only one in Tizen Contact
+            else if (field.indexOf('note') === 0) {
+                if (tizenContact.note) {
+                    contact.note = tizenContact.note[0];
+                }
+            }
+
+            // organizations
+            else if (field.indexOf('organizations') === 0) {
+
+                var organizations = [];
+
+                // there's only one organization in a Tizen Address
+
+                if (tizenContact.organization) {
+                    organizations.push(
+                            new ContactOrganization(
+                                    true,
+                                    'WORK',
+                                    tizenContact.organization.name,
+                                    tizenContact.organization.department,
+                                    tizenContact.organization.jobTitle));
+                }
+
+                contact.organizations = organizations.length > 0 ? organizations : null;
+            }
+
+            // categories
+            else if (field.indexOf('categories') === 0) {
+
+                var categories = [];
+
+                if (tizenContact.categories) {
+
+                    for (index = 0 ; index < tizenContact.categories.length ; ++index) {
+                        categories.push(
+                                new ContactField(
+                                        'MAIN',
+                                        tizenContact.categories,
+                                        (index === 0) ));
+                    }
+
+                    contact.categories = categories.length > 0 ? categories : null;
+                }
+            }
+
+            // urls
+            else if (field.indexOf('urls') === 0) {
+                var urls = [];
+
+                if (tizenContact.urls) {
+                    for (index = 0 ; index <tizenContact.urls.length ; ++index) {
+                        urls.push(
+                                new ContactField(
+                                        tizenContact.urls[index].type,
+                                        tizenContact.urls[index].url,
+                                        (index === 0)));
+                    }
+                }
+
+                contact.urls = urls.length > 0 ? urls : null;
+            }
+
+            // photos
+            else if (field.indexOf('photos') === 0) {
+                var photos = [];
+
+                if (tizenContact.photoURI) {
+                    photos.push(new ContactField('URI', tizenContact.photoURI, true));
+                }
+
+                contact.photos = photos.length > 0 ? photos : null;
+            }
+        }
+
+        return contact;
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Device.js
+define("cordova/plugin/tizen/Device", function(require, exports, module) {
+/*global tizen:false */
+var channel = require('cordova/channel');
+
+// Tell cordova channel to wait on the CordovaInfoReady event
+channel.waitForInitialization('onCordovaInfoReady');
+
+function Device() {
+    this.version = null;
+    this.uuid = null;
+    this.name = null;
+    this.cordova =  "2.0.0";
+    this.platform = "Tizen";
+
+    var me = this;
+
+    function onSuccessCallback(sysInfoProp) {
+        me.name = sysInfoProp.model;
+        me.uuid = sysInfoProp.imei;
+        me.version = sysInfoProp.version;
+        channel.onCordovaInfoReady.fire();
+    }
+
+    function onErrorCallback(error) {
+        console.log("error initializing cordova: " + error);
+    }
+
+    channel.onCordovaReady.subscribeOnce(function() {
+        me.getDeviceInfo(onSuccessCallback, onErrorCallback);
+    });
+}
+
+Device.prototype.getDeviceInfo = function(success, fail, args) {
+    tizen.systeminfo.getPropertyValue("Device", success, fail);
+};
+
+module.exports = new Device();
+
+});
+
+// file: lib/tizen/plugin/tizen/File.js
+define("cordova/plugin/tizen/File", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileError = require('cordova/plugin/FileError'),
+    DirectoryEntry = require('cordova/plugin/DirectoryEntry'),
+    FileEntry = require('cordova/plugin/FileEntry'),
+    File = require('cordova/plugin/File'),
+    FileSystem = require('cordova/plugin/FileSystem');
+
+var nativeRequestFileSystem = window.webkitRequestFileSystem,
+    nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL,
+    NativeFileReader = window.FileReader;
+
+function getFileSystemName(nativeFs) {
+    return (nativeFs.name.indexOf("Persistent") != -1) ? "persistent" : "temporary";
+}
+
+function makeEntry(entry) {
+    if (entry.isDirectory) {
+        return new DirectoryEntry(entry.name, decodeURI(entry.toURL()));
+    }
+    else {
+        return new FileEntry(entry.name, decodeURI(entry.toURL()));
+    }
+}
+
+module.exports = {
+    /* requestFileSystem */
+    requestFileSystem: function(successCallback, errorCallback, args) {
+        var type = args[0],
+            size = args[1];
+
+        nativeRequestFileSystem(type, size, function(nativeFs) {
+            successCallback(new FileSystem(getFileSystemName(nativeFs), makeEntry(nativeFs.root)));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* resolveLocalFileSystemURI */
+    resolveLocalFileSystemURI: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            successCallback(makeEntry(entry));
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryReader */
+    readEntries: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(dirEntry) {
+            var reader = dirEntry.createReader();
+            reader.readEntries(function(entries) {
+                var retVal = [];
+                for (var i = 0; i < entries.length; i++) {
+                    retVal.push(makeEntry(entries[i]));
+                }
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* Entry */
+    getMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getMetadata(function(metaData) {
+                successCallback(metaData.modificationTime);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    moveTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.moveTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    copyTo: function(successCallback, errorCallback, args) {
+        var srcUri = args[0],
+            parentUri = args[1],
+            name = args[2];
+
+        nativeResolveLocalFileSystemURI(srcUri, function(source) {
+            nativeResolveLocalFileSystemURI(parentUri, function(parent) {
+                source.copyTo(parent, name, function(entry) {
+                    successCallback(makeEntry(entry));
+                }, function(error) {
+                    errorCallback(error.code);
+                });
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    remove: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.remove(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getParent: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getParent(function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileEntry */
+    getFileMetadata: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.file(function(file) {
+                var retVal = new File(file.name, decodeURI(entry.toURL()), file.type, file.lastModifiedDate, file.size);
+                successCallback(retVal);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* DirectoryEntry */
+    getDirectory: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getDirectory(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    removeRecursively: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            if (entry.fullPath === "/") {
+                errorCallback(FileError.NO_MODIFICATION_ALLOWED_ERR);
+            } else {
+                entry.removeRecursively(successCallback, function(error) {
+                    errorCallback(error.code);
+                });
+            }
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    getFile: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            path = args[1],
+            options = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            entry.getFile(path, options, function(entry) {
+                successCallback(makeEntry(entry));
+            }, function(error) {
+                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
+                    if (options.create) {
+                        errorCallback(FileError.PATH_EXISTS_ERR);
+                    } else {
+                        errorCallback(FileError.ENCODING_ERR);
+                    }
+                } else {
+                    errorCallback(error.code);
+                }
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileReader */
+    readAsText: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            encoding = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsText(file, encoding);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    readAsDataURL: function(successCallback, errorCallback, args) {
+        var uri = args[0];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onLoadEnd = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(evt.target.result);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            var reader = new NativeFileReader();
+
+            reader.onloadend = onLoadEnd;
+            reader.onerror = onError;
+            entry.file(function(file) {
+                reader.readAsDataURL(file);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    /* FileWriter */
+    write: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            text = args[1],
+            position = args[2];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.position - position);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                var blob = new WebKitBlobBuilder();
+                blob.append(text);
+
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.seek(position);
+                writer.write(blob.getBlob('text/plain'));
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    },
+
+    truncate: function(successCallback, errorCallback, args) {
+        var uri = args[0],
+            size = args[1];
+
+        nativeResolveLocalFileSystemURI(uri, function(entry) {
+            var onWriteEnd = function(evt) {
+                    if(!evt.target.error) {
+                        successCallback(evt.target.length);
+                    } else {
+                        errorCallback(evt.target.error.code);
+                    }
+            },
+                onError = function(evt) {
+                    errorCallback(evt.target.error.code);
+            };
+
+            entry.createWriter(function(writer) {
+                writer.onwriteend = onWriteEnd;
+                writer.onerror = onError;
+
+                writer.truncate(size);
+            }, function(error) {
+                errorCallback(error.code);
+            });
+        }, function(error) {
+            errorCallback(error.code);
+        });
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/FileTransfer.js
+define("cordova/plugin/tizen/FileTransfer", function(require, exports, module) {
+/*global WebKitBlobBuilder:false */
+var FileEntry = require('cordova/plugin/FileEntry'),
+    FileTransferError = require('cordova/plugin/FileTransferError'),
+    FileUploadResult = require('cordova/plugin/FileUploadResult');
+
+var nativeResolveLocalFileSystemURI = window.webkitResolveLocalFileSystemURL;
+
+function getParentPath(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(0, pos + 1);
+}
+
+function getFileName(filePath) {
+    var pos = filePath.lastIndexOf('/');
+    return filePath.substring(pos + 1);
+}
+
+module.exports = {
+    upload: function(successCallback, errorCallback, args) {
+        var filePath = args[0],
+            server = args[1],
+            fileKey = args[2],
+            fileName = args[3],
+            mimeType = args[4],
+            params = args[5],
+            /*trustAllHosts = args[6],*/
+            chunkedMode = args[7];
+
+        nativeResolveLocalFileSystemURI(filePath, function(entry) {
+            entry.file(function(file) {
+                function uploadFile(blobFile) {
+                    var fd = new FormData();
+
+                    fd.append(fileKey, blobFile, fileName);
+                    for (var prop in params) {
+                        if(params.hasOwnProperty(prop)) {
+                            fd.append(prop, params[prop]);
+                        }
+                    }
+
+                    var xhr = new XMLHttpRequest();
+                    xhr.open("POST", server);
+                    xhr.onload = function(evt) {
+                        if (xhr.status == 200) {
+                            var result = new FileUploadResult();
+                            result.bytesSent = file.size;
+                            result.responseCode = xhr.status;
+                            result.response = xhr.response;
+                            successCallback(result);
+                        } else if (xhr.status == 404) {
+                            errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                        } else {
+                            errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                        }
+                    };
+                    xhr.ontimeout = function(evt) {
+                        errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                    };
+
+                    xhr.send(fd);
+                }
+
+                var bytesPerChunk;
+                if (chunkedMode === true) {
+                    bytesPerChunk = 1024 * 1024; // 1MB chunk sizes.
+                } else {
+                    bytesPerChunk = file.size;
+                }
+                var start = 0;
+                var end = bytesPerChunk;
+                while (start < file.size) {
+                    var chunk = file.webkitSlice(start, end, mimeType);
+                    uploadFile(chunk);
+                    start = end;
+                    end = start + bytesPerChunk;
+                }
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            }
+            );
+        },
+        function(error) {
+            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+        }
+        );
+    },
+
+    download: function(successCallback, errorCallback, args) {
+        var url = args[0],
+            filePath = args[1];
+
+        var xhr = new XMLHttpRequest();
+
+        function writeFile(fileEntry) {
+            fileEntry.createWriter(function(writer) {
+                writer.onwriteend = function(evt) {
+                    if (!evt.target.error) {
+                        successCallback(new FileEntry(fileEntry.name, fileEntry.toURL()));
+                    } else {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    }
+                };
+
+                writer.onerror = function(evt) {
+                    errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                };
+
+                var builder = new WebKitBlobBuilder();
+                builder.append(xhr.response);
+                var blob = builder.getBlob();
+                writer.write(blob);
+            },
+            function(error) {
+                errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+            });
+        }
+
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState == xhr.DONE) {
+                if (xhr.status == 200 && xhr.response) {
+                    nativeResolveLocalFileSystemURI(getParentPath(filePath), function(dir) {
+                        dir.getFile(getFileName(filePath), {create: true}, writeFile, function(error) {
+                            errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                        });
+                    }, function(error) {
+                        errorCallback(new FileTransferError(FileTransferError.FILE_NOT_FOUND_ERR));
+                    });
+                } else if (xhr.status == 404) {
+                    errorCallback(new FileTransferError(FileTransferError.INVALID_URL_ERR));
+                } else {
+                    errorCallback(new FileTransferError(FileTransferError.CONNECTION_ERR));
+                }
+            }
+        };
+
+        xhr.open("GET", url, true);
+        xhr.responseType = "arraybuffer";
+        xhr.send();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Media.js
+define("cordova/plugin/tizen/Media", function(require, exports, module) {
+/*global Media:false, webkitURL:false */
+var MediaError = require('cordova/plugin/MediaError'),
+    audioObjects = {};
+
+module.exports = {
+    create: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::create() - id =" + id + ", src =" + src);
+        audioObjects[id] = new Audio(src);
+        audioObjects[id].onStalledCB = function () {
+            console.log("media::onStalled()");
+             audioObjects[id].timer = window.setTimeout(function () {
+                    audioObjects[id].pause();
+                    if (audioObjects[id].currentTime !== 0)
+                        audioObjects[id].currentTime = 0;
+                    console.log("media::onStalled() - MEDIA_ERROR -> " + MediaError.MEDIA_ERR_ABORTED);
+                    var err = new MediaError(MediaError.MEDIA_ERR_ABORTED, "Stalled");
+                    Media.onStatus(id, Media.MEDIA_ERROR, err);
+                }, 2000);
+        };
+        audioObjects[id].onEndedCB = function () {
+            console.log("media::onEndedCB() - MEDIA_STATE -> MEDIA_STOPPED");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        };
+        audioObjects[id].onErrorCB = function () {
+            console.log("media::onErrorCB() - MEDIA_ERROR -> " + event.srcElement.error);
+            Media.onStatus(id, Media.MEDIA_ERROR, event.srcElement.error);
+        };
+        audioObjects[id].onPlayCB = function () {
+            console.log("media::onPlayCB() - MEDIA_STATE -> MEDIA_STARTING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING);
+        };
+        audioObjects[id].onPlayingCB = function () {
+            console.log("media::onPlayingCB() - MEDIA_STATE -> MEDIA_RUNNING");
+            Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING);
+        };
+        audioObjects[id].onDurationChangeCB = function () {
+            console.log("media::onDurationChangeCB() - MEDIA_DURATION -> " +  audioObjects[id].duration);
+            Media.onStatus(id, Media.MEDIA_DURATION, audioObjects[id].duration);
+        };
+        audioObjects[id].onTimeUpdateCB = function () {
+            console.log("media::onTimeUpdateCB() - MEDIA_POSITION -> " +  audioObjects[id].currentTime);
+            Media.onStatus(id, Media.MEDIA_POSITION, audioObjects[id].currentTime);
+        };
+        audioObjects[id].onCanPlayCB = function () {
+            console.log("media::onCanPlayCB()");
+            window.clearTimeout(audioObjects[id].timer);
+            audioObjects[id].play();
+        };
+      },
+    startPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1], options = args[2];
+        console.log("media::startPlayingAudio() - id =" + id + ", src =" + src + ", options =" + options);
+        audioObjects[id].addEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].addEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].addEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].addEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].addEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].addEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].addEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].addEventListener('stalled', audioObjects[id].onStalledCB);
+        audioObjects[id].play();
+    },
+    stopPlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        audioObjects[id].pause();
+        if (audioObjects[id].currentTime !== 0)
+            audioObjects[id].currentTime = 0;
+        console.log("media::stopPlayingAudio() - MEDIA_STATE -> MEDIA_STOPPED");
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+        audioObjects[id].removeEventListener('canplay', audioObjects[id].onCanPlayCB);
+        audioObjects[id].removeEventListener('ended', audioObjects[id].onEndedCB);
+        audioObjects[id].removeEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+        audioObjects[id].removeEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+        audioObjects[id].removeEventListener('playing', audioObjects[id].onPlayingCB);
+        audioObjects[id].removeEventListener('play', audioObjects[id].onPlayCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onErrorCB);
+        audioObjects[id].removeEventListener('error', audioObjects[id].onStalledCB);
+    },
+    seekToAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], milliseconds = args[1];
+        console.log("media::seekToAudio()");
+         audioObjects[id].currentTime = milliseconds;
+        successCallback( audioObjects[id].currentTime);
+    },
+    pausePlayingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::pausePlayingAudio() - MEDIA_STATE -> MEDIA_PAUSED");
+        audioObjects[id].pause();
+        Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED);
+    },
+    getCurrentPositionAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::getCurrentPositionAudio()");
+        successCallback(audioObjects[id].currentTime);
+    },
+    release: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        window.clearTimeout(audioObjects[id].timer);
+        console.log("media::release()");
+    },
+    setVolume: function (successCallback, errorCallback, args) {
+        var id = args[0], volume = args[1];
+        console.log("media::setVolume()");
+        audioObjects[id].volume = volume;
+    },
+    startRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0], src = args[1];
+        console.log("media::startRecordingAudio() - id =" + id + ", src =" + src);
+
+        function gotStreamCB(stream) {
+            audioObjects[id].src = webkitURL.createObjectURL(stream);
+            console.log("media::startRecordingAudio() - stream CB");
+        }
+
+        function gotStreamFailedCB(error) {
+            console.log("media::startRecordingAudio() - error CB:" + error.toString());
+        }
+
+        if (navigator.webkitGetUserMedia) {
+            audioObjects[id] = new Audio();
+            navigator.webkitGetUserMedia('audio', gotStreamCB, gotStreamFailedCB);
+        } else {
+            console.log("webkitGetUserMedia not supported");
+        }
+        successCallback();
+    },
+    stopRecordingAudio: function (successCallback, errorCallback, args) {
+        var id = args[0];
+        console.log("media::stopRecordingAudio() - id =" + id);
+        audioObjects[id].pause();
+        successCallback();
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/MediaError.js
+define("cordova/plugin/tizen/MediaError", function(require, exports, module) {
+
+// The MediaError object already exists on Tizen. This prevents the Cordova
+// version from being defined. This object is used to merge in differences
+// between Tizen and Cordova MediaError objects.
+module.exports = {
+        MEDIA_ERR_NONE_ACTIVE : 0,
+        MEDIA_ERR_NONE_SUPPORTED : 4
+};
+});
+
+// file: lib/tizen/plugin/tizen/NetworkStatus.js
+define("cordova/plugin/tizen/NetworkStatus", function(require, exports, module) {
+/*global tizen:false */
+var Connection = require('cordova/plugin/Connection');
+
+module.exports = {
+    getConnectionInfo: function (successCallback, errorCallback) {
+        var cncType = Connection.NONE;
+        var infoCount = 0;
+
+        function infoCB() {
+            infoCount++;
+            if (infoCount > 1)
+               successCallback(cncType);
+        }
+
+        function errorCB(error) {
+           console.log("Error: " + error.code + "," + error.name + "," + error.message);
+           infoCB();
+        }
+
+        function wifiSuccessCB(wifi) {
+            if ((wifi.status === "ON")  && (wifi.ipAddress.length !== 0))
+                cncType = Connection.WIFI;
+            infoCB();
+        }
+
+        function cellularSuccessCB(cell) {
+            if ((cncType === Connection.NONE) && (cell.status === "ON") && (cell.ipAddress.length !== 0))
+                cncType = Connection.CELL_2G;
+            infoCB();
+        }
+
+        if (tizen.systeminfo.isSupported('WifiNetwork')) {
+            tizen.systeminfo.getPropertyValue('WifiNetwork', wifiSuccessCB, errorCB);
+        }
+
+        if (tizen.systeminfo.isSupported('CellularNetwork')) {
+            tizen.systeminfo.getPropertyValue('CellularNetwork', cellularSuccessCB, errorCB);
+        }
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/Notification.js
+define("cordova/plugin/tizen/Notification", function(require, exports, module) {
+module.exports = {
+
+    alert: function(message, alertCallback, title, buttonName) {
+        return this.confirm(message, alertCallback, title, buttonName);
+    },
+
+    confirm: function(message, confirmCallback, title, buttonLabels) {
+        var index = null,
+            overlayElement = null,
+            popup = null,
+            element = null,
+            titleString = null,
+            messageString = null,
+            buttonString = null,
+            buttonsArray = null;
+
+        function initCss() {
+            var id = 'tizen-cordova-css';
+            if (document.getElementById(id))
+                return;
+
+            var rules = {
+                '.ui-popupwindow-screen' :  'background: #000000; opacity: 0.4;',
+                '.ui-popupwindow' : 'background: #828282; padding: 1px 1px; color: white; width: 80%; margin-left: 10%;',
+                '.popup-title' : 'background: #018ccc; padding: 5px 5px;',
+                '.popup-title p' : 'padding: 0px; margin: 0px; text-align: center;',
+                '.popup-text' : 'background: #2d2d2d; padding: 5px 5px;',
+                '.popup-text p' : 'padding: 0px; margin: 0px; text-align: center; vertical-align: middle; line-height:100px;',
+                '.popup-button-bg' : 'background: #424242; padding: 5px 5px;',
+                '.popup-button-bg ul' : 'list-style-type: none; width: 80%; margin-left: 10%; text-align: center; padding: 0px;',
+                '.popup-button-bg li' : 'display: inline;',
+                '.popup-button-bg li input' : 'border-radius: 4px 4px 4px 4px; border: 0px; background: #545454; padding: 5px 15px; color: white; min-width: 80px; margin: 0px 5px;'
+            };
+
+            var css = document.createElement('style');
+            css.type = 'text/css';
+            css.id = id;
+
+            var selector = null;
+            for (selector in rules) {
+                css.appendChild(document.createTextNode(selector + "{ " + rules[selector] + " }"));
+            }
+
+            document.getElementsByTagName("head")[0].appendChild(css);
+        }
+
+        initCss();
+
+        console.log ("message" , message);
+        console.log ("confirmCallback" , confirmCallback);
+        console.log ("title" , title);
+        console.log ("buttonLabels" , buttonLabels);
+
+        titleString = '<div class="popup-title"><p>' + title + '</p></div>';
+        messageString = '<div class="popup-text"><p>' + message + '</p></div>';
+        buttonString = '<div class="popup-button-bg"><ul>';
+
+        switch(typeof(buttonLabels))
+        {
+        case "string":
+            buttonsArray = buttonLabels.split(",");
+
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+
+        case "array":
+            if (buttonsArray === null) {
+                buttonsArray = buttonLabels;
+            }
+
+            for (index in buttonsArray) {
+                buttonString += '<li><input id="popup-button-' + buttonsArray[index]+
+                                '" type="button" value="' + buttonsArray[index] + '" /></li>';
+                console.log ("index: ", index,"");
+                console.log ("buttonsArray[index]: ", buttonsArray[index]);
+                console.log ("buttonString: ", buttonString);
+            }
+            break;
+        default:
+            console.log ("cordova/plugin/tizen/Notification, default, buttonLabels: ", buttonLabels);
+            break;
+        }
+
+        buttonString += '</ul></div>';
+
+        overlayElement = document.createElement("div");
+        overlayElement.className = 'ui-popupwindow-screen';
+
+        overlayElement.style.zIndex = 1001;
+        overlayElement.style.width = "100%";
+        overlayElement.style.height = "100%";
+        overlayElement.style.top = 0;
+        overlayElement.style.left = 0;
+        overlayElement.style.margin = 0;
+        overlayElement.style.padding = 0;
+        overlayElement.style.position = "absolute";
+
+        popup = document.createElement("div");
+        popup.className = "ui-popupwindow";
+        popup.style.position = "fixed";
+        popup.style.zIndex = 1002;
+        popup.innerHTML = titleString + messageString + buttonString;
+
+        document.body.appendChild(overlayElement);
+        document.body.appendChild(popup);
+
+        function createListener(button) {
+            return function() {
+                document.body.removeChild(overlayElement);
+                document.body.removeChild(popup);
+                confirmCallback(button.value);
+            };
+        }
+
+       for (index in buttonsArray) {
+           console.log ("index: ", index);
+
+           element = document.getElementById("popup-button-" + buttonsArray[index]);
+           element.addEventListener("click", createListener(element), false);
+       }
+    },
+
+    vibrate: function(milliseconds) {
+        console.log ("milliseconds" , milliseconds);
+
+        if (navigator.vibrate) {
+            navigator.vibrate(milliseconds);
+        }
+        else {
+            console.log ("cordova/plugin/tizen/Notification, vibrate API does not exists");
+        }
+    },
+
+    beep: function(count) {
+            console.log("notification:beep() - count = " + count);
+
+            var beepSound = new Audio("/sounds/beep.wav");
+            beepSound.cpt = 0;
+
+            beepSound.addEventListener('canplay', function () {
+                console.log("notification:beepSound() - canpay CB");
+                this.play();
+            });
+
+            beepSound.addEventListener('ended', function () {
+                console.log("notification:beepSound() - ended CB: cpt = " + this.cpt);
+                if (this.cpt !== 0) {
+                    if (this.currentTime !== 0)
+                        this.currentTime = 0;
+                    this.play();
+                    this.cpt--;
+                }
+            });
+
+            beepSound.addEventListener('error',  function () {
+                    console.log("notification:beepSound() - error CB");
+            });
+
+            beepSound.load();
+            beepSound.pause();
+            if (beepSound.currentTime !== 0)
+                beepSound.currentTime = 0;
+            beepSound.cpt = count - 1;
+            beepSound.play();
+    }
+};
+
+
+
+});
+
+// file: lib/tizen/plugin/tizen/contacts.js
+define("cordova/plugin/tizen/contacts", function(require, exports, module) {
+/*global tizen:false */
+var ContactError = require('cordova/plugin/ContactError'),
+    utils = require('cordova/utils'),
+    ContactUtils = require('cordova/plugin/tizen/ContactUtils');
+
+module.exports = {
+    /**
+     * Returns an array of Contacts matching the search criteria.
+     *
+     * @return array of Contacts matching search criteria
+     */
+    find : function(fields, successCB, failCB, options) {
+
+        // Success callback is required. Throw exception if not specified.
+        if (typeof successCB !== 'function') {
+            throw new TypeError("You must specify a success callback for the find command.");
+        }
+
+        // Search qualifier is required and cannot be empty.
+        if (!fields || !(utils.isArray(fields)) || fields.length === 0) {
+            if (typeof failCB === 'function') {
+                failCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR));
+            }
+            return;
+        }
+
+        // options are optional
+        var filter ="",
+            multiple = false,
+            contacts = [],
+            tizenFilter = null;
+
+        if (options) {
+            filter = options.filter || "";
+            multiple =  options.multiple || false;
+        }
+
+        if (filter){
+            tizenFilter = ContactUtils.buildFilterExpression(fields, filter);
+        }
+
+        tizen.contact.getDefaultAddressBook().find(
+            function(tizenContacts) {
+                if (multiple) {
+                    for (var index in tizenContacts) {
+                        contacts.push(ContactUtils.createContact(tizenContacts[index], fields));
+                    }
+                }
+                else {
+                    contacts.push(ContactUtils.createContact(tizenContacts[0], fields));
+                }
+
+                // return results
+                successCB(contacts);
+            },
+            function(error) {
+                if (typeof failCB === 'function') {
+                    failCB(ContactError.UNKNOWN_ERROR);
+                }
+            },
+            tizenFilter,
+            null);
+    }
+};
+
+});
+
+// file: lib/tizen/plugin/tizen/manager.js
+define("cordova/plugin/tizen/manager", function(require, exports, module) {
+var cordova = require('cordova');
+
+module.exports = {
+    exec: function (successCallback, errorCallback, clazz, action, args) {
+        var plugin = require('cordova/plugin/tizen/' + clazz);
+
+        if (plugin && typeof plugin[action] === 'function') {
+            var result = plugin[action](successCallback, errorCallback, args);
+            return result || {status: cordova.callbackStatus.NO_RESULT};
+        }
+
+        return {"status" : cordova.callbackStatus.CLASS_NOT_FOUND_EXCEPTION, "message" : "Function " + clazz + "::" + action + " cannot be found"};
+    },
+    resume: function () {},
+    pause: function () {},
+    destroy: function () {}
+};
+
+});
+
+// file: lib/common/utils.js
+define("cordova/utils", function(require, exports, module) {
+var utils = exports;
+
+/**
+ * Returns an indication of whether the argument is an array or not
+ */
+utils.isArray = function(a) {
+    return Object.prototype.toString.call(a) == '[object Array]';
+};
+
+/**
+ * Returns an indication of whether the argument is a Date or not
+ */
+utils.isDate = function(d) {
+    return Object.prototype.toString.call(d) == '[object Date]';
+};
+
+/**
+ * Does a deep clone of the object.
+ */
+utils.clone = function(obj) {
+    if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') {
+        return obj;
+    }
+
+    var retVal, i;
+
+    if(utils.isArray(obj)){
+        retVal = [];
+        for(i = 0; i < obj.length; ++i){
+            retVal.push(utils.clone(obj[i]));
+        }
+        return retVal;
+    }
+
+    retVal = {};
+    for(i in obj){
+        if(!(i in retVal) || retVal[i] != obj[i]) {
+            retVal[i] = utils.clone(obj[i]);
+        }
+    }
+    return retVal;
+};
+
+/**
+ * Returns a wrappered version of the function
+ */
+utils.close = function(context, func, params) {
+    if (typeof params == 'undefined') {
+        return function() {
+            return func.apply(context, arguments);
+        };
+    } else {
+        return function() {
+            return func.apply(context, params);
+        };
+    }
+};
+
+/**
+ * Create a UUID
+ */
+utils.createUUID = function() {
+    return UUIDcreatePart(4) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(2) + '-' +
+        UUIDcreatePart(6);
+};
+
+/**
+ * Extends a child object from a parent object using classical inheritance
+ * pattern.
+ */
+utils.extend = (function() {
+    // proxy used to establish prototype chain
+    var F = function() {};
+    // extend Child from Parent
+    return function(Child, Parent) {
+        F.prototype = Parent.prototype;
+        Child.prototype = new F();
+        Child.__super__ = Parent.prototype;
+        Child.prototype.constructor = Child;
+    };
+}());
+
+/**
+ * Alerts a message in any available way: alert or console.log.
+ */
+utils.alert = function(msg) {
+    if (alert) {
+        alert(msg);
+    } else if (console && console.log) {
+        console.log(msg);
+    }
+};
+
+/**
+ * Formats a string and arguments following it ala sprintf()
+ *
+ * see utils.vformat() for more information
+ */
+utils.format = function(formatString /* ,... */) {
+    var args = [].slice.call(arguments, 1);
+    return utils.vformat(formatString, args);
+};
+
+/**
+ * Formats a string and arguments following it ala vsprintf()
+ *
+ * format chars:
+ *   %j - format arg as JSON
+ *   %o - format arg as JSON
+ *   %c - format arg as ''
+ *   %% - replace with '%'
+ * any other char following % will format it's
+ * arg via toString().
+ *
+ * for rationale, see FireBug's Console API:
+ *    http://getfirebug.com/wiki/index.php/Console_API
+ */
+utils.vformat = function(formatString, args) {
+    if (formatString === null || formatString === undefined) return "";
+    if (arguments.length == 1) return formatString.toString();
+    if (typeof formatString != "string") return formatString.toString();
+
+    var pattern = /(.*?)%(.)(.*)/;
+    var rest    = formatString;
+    var result  = [];
+
+    while (args.length) {
+        var arg   = args.shift();
+        var match = pattern.exec(rest);
+
+        if (!match) break;
+
+        rest = match[3];
+
+        result.push(match[1]);
+
+        if (match[2] == '%') {
+            result.push('%');
+            args.unshift(arg);
+            continue;
+        }
+
+        result.push(formatted(arg, match[2]));
+    }
+
+    result.push(rest);
+
+    return result.join('');
+};
+
+//------------------------------------------------------------------------------
+function UUIDcreatePart(length) {
+    var uuidpart = "";
+    for (var i=0; i<length; i++) {
+        var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
+        if (uuidchar.length == 1) {
+            uuidchar = "0" + uuidchar;
+        }
+        uuidpart += uuidchar;
+    }
+    return uuidpart;
+}
+
+//------------------------------------------------------------------------------
+function formatted(object, formatChar) {
+
+    try {
+        switch(formatChar) {
+            case 'j':
+            case 'o': return JSON.stringify(object);
+            case 'c': return '';
+        }
+    }
+    catch (e) {
+        return "error JSON.stringify()ing argument: " + e;
+    }
+
+    if ((object === null) || (object === undefined)) {
+        return Object.prototype.toString.call(object);
+    }
+
+    return object.toString();
+}
+
+});
+
+
+window.cordova = require('cordova');
+
+// file: lib/scripts/bootstrap.js
+(function (context) {
+    var channel = require("cordova/channel"),
+        _self = {
+            boot: function () {
+                /**
+                 * Create all cordova objects once page has fully loaded and native side is ready.
+                 */
+                channel.join(function() {
+                    var builder = require('cordova/builder'),
+                        base = require('cordova/common'),
+                        platform = require('cordova/platform');
+
+                    // Drop the common globals into the window object, but be nice and don't overwrite anything.
+                    builder.build(base.objects).intoButDontClobber(window);
+
+                    // Drop the platform-specific globals into the window object
+                    // and clobber any existing object.
+                    builder.build(platform.objects).intoAndClobber(window);
+
+                    // Merge the platform-specific overrides/enhancements into
+                    // the window object.
+                    if (typeof platform.merges !== 'undefined') {
+                        builder.build(platform.merges).intoAndMerge(window);
+                    }
+
+                    // Call the platform-specific initialization
+                    platform.initialize();
+
+                    // Fire event to notify that all objects are created
+                    channel.onCordovaReady.fire();
+
+                    // Fire onDeviceReady event once all constructors have run and
+                    // cordova info has been received from native side.
+                    channel.join(function() {
+                        require('cordova').fireDocumentEvent('deviceready');
+                    }, channel.deviceReadyChannelsArray);
+
+                }, [ channel.onDOMContentLoaded, channel.onNativeReady ]);
+            }
+        };
+
+    // boot up once native side is ready
+    channel.onNativeReady.subscribeOnce(_self.boot);
+
+    // _nativeReady is global variable that the native side can set
+    // to signify that the native code is ready. It is a global since
+    // it may be called before any cordova JS is ready.
+    if (window._nativeReady) {
+        channel.onNativeReady.fire();
+    }
+
+}(window));
+
+// file: lib/scripts/bootstrap-tizen.js
+require('cordova/channel').onNativeReady.fire();
+
+
+})();
\ No newline at end of file
diff --git a/www/sounds/beep.wav b/www/sounds/beep.wav
new file mode 100644
index 0000000..1e9797c
--- /dev/null
+++ b/www/sounds/beep.wav
Binary files differ
